> ## Documentation Index
> Fetch the complete documentation index at: https://developers.podero.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Dashboard Integration

> Display device status, consumption data, and optimization insights to end-users

# End-User Dashboard Integration

This page covers which fields to surface for each device type and how to keep data fresh. All device data is returned from the standard GET endpoint — there is no separate state endpoint.

## Fetching device data

<Tabs>
  <Tab title="Heat Pumps">
    <CodeGroup>
      ```bash cURL theme={null}
      curl -X GET \
        'https://app.podero.com/api/partners/v2.0/org/{org_id}/users/{user_id}/heat-pumps' \
        -H 'accept: application/json' \
        -H 'Authorization: Bearer {auth_token}'
      ```

      ```python Python theme={null}
      response = requests.get(
          f'https://app.podero.com/api/partners/v2.0/org/{org_id}/users/{user_id}/heat-pumps',
          headers={
              'accept': 'application/json',
              'Authorization': f'Bearer {auth_token}'
          }
      )
      heat_pumps = response.json()
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Electric Vehicles">
    <CodeGroup>
      ```bash cURL theme={null}
      curl -X GET \
        'https://app.podero.com/api/partners/v2.0/org/{org_id}/users/{user_id}/electric-vehicles' \
        -H 'accept: application/json' \
        -H 'Authorization: Bearer {auth_token}'
      ```

      ```python Python theme={null}
      response = requests.get(
          f'https://app.podero.com/api/partners/v2.0/org/{org_id}/users/{user_id}/electric-vehicles',
          headers={
              'accept': 'application/json',
              'Authorization': f'Bearer {auth_token}'
          }
      )
      vehicles = response.json()
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Solar Inverters">
    <CodeGroup>
      ```bash cURL theme={null}
      curl -X GET \
        'https://app.podero.com/api/partners/v2.0/org/{org_id}/users/{user_id}/inverters' \
        -H 'accept: application/json' \
        -H 'Authorization: Bearer {auth_token}'
      ```

      ```python Python theme={null}
      response = requests.get(
          f'https://app.podero.com/api/partners/v2.0/org/{org_id}/users/{user_id}/inverters',
          headers={
              'accept': 'application/json',
              'Authorization': f'Bearer {auth_token}'
          }
      )
      inverters = response.json()
      ```
    </CodeGroup>
  </Tab>
</Tabs>

Append `/{device_id}` to any of the above to retrieve a single device with its latest state.

## Heat pump

### Optimization status

Two fields together determine what to show the user:

| `is_smart_optimization_active` | `current_mode` | Suggested display |
| ------------------------------ | -------------- | ----------------- |
| `false`                        | —              | "Not optimizing"  |
| `true`                         | `"min"`        | "Min"             |
| `true`                         | `"low"`        | "ECO"             |
| `true`                         | `"mid"`        | "Comfort"         |
| `true`                         | `"max"`        | "Boost"           |

### Live readings

| Field                           | Unit     | Description                                            |
| ------------------------------- | -------- | ------------------------------------------------------ |
| `current_power_consumption_w`   | W        | Current power draw                                     |
| `dhw_temperature`               | °C       | Domestic hot water temperature                         |
| `inlet_temperature`             | °C       | Heating circuit water entering the heat pump           |
| `indoor_actual_temperature`     | °C       | Indoor temperature — `null` if no sensor is available  |
| `outdoor_temperature`           | °C       | Outdoor temperature measured by the device             |
| `current_state_last_updated_at` | datetime | When state was last synced from the manufacturer's API |

## Electric vehicle

### Charge status

Derive the current state from two boolean fields:

| `is_plugged_in` | `is_charging` | Suggested display                                     |
| --------------- | ------------- | ----------------------------------------------------- |
| `false`         | —             | "Unplugged"                                           |
| `true`          | `false`       | "Plugged in" — waiting for an optimal charging window |
| `true`          | `true`        | "Charging"                                            |

### Boost state

When a user triggers a boost charge, the `boost_state` field transitions through a state machine. Use it to drive the charge now button:

| `boost_state`   | Suggested display                                              |
| --------------- | -------------------------------------------------------------- |
| `"available"`   | "Charge Now" (enabled)                                         |
| `"requested"`   | "Starting…" (disabled — poll every \~3 seconds)                |
| `"ongoing"`     | "Charging" (disabled)                                          |
| `"unavailable"` | Disabled — vehicle is full, already charging, or not connected |

### Key fields

| Field                           | Description                                             |
| ------------------------------- | ------------------------------------------------------- |
| `battery_level`                 | Current charge level (0–100%)                           |
| `charge_rate_w`                 | Current charging rate in Watts                          |
| `is_charge_policy_enabled`      | Whether a charge deadline is active                     |
| `charge_deadline_at`            | Time by which the charge target must be reached (HH:MM) |
| `minimum_charge_limit`          | Minimum charge level the policy targets (0–100%)        |
| `current_state_last_updated_at` | When charge state was last synced                       |

## Solar inverter

### Power flows

Four fields cover all energy movement in the system:

| Field                              | Unit | Sign convention                             | Description               |
| ---------------------------------- | ---- | ------------------------------------------- | ------------------------- |
| `current_solar_production_w`       | W    | Always positive                             | Solar panel output        |
| `household_consumption_w`          | W    | Always positive                             | Total household power use |
| `battery_charge_discharge_power_w` | W    | Positive = discharging, negative = charging | Battery power flow        |
| `current_power_to_grid_w`          | W    | Positive = exporting, negative = importing  | Grid exchange             |

Current battery level is in `battery_charge_level_percent` (0–100%).

The `solar_surplus_w` field gives the same value pre-calculated, or derive it as `current_solar_production_w - household_consumption_w`.

All inverter state is timestamped in `current_state_last_updated_at`.

## Connection and action status

Two fields indicate whether a device needs attention:

**`is_authenticated`** — `false` means the manufacturer connection has lapsed. The user needs to reconnect their device. Check the `actions` array for a `resolution_link` URL to redirect them to.

**`action_needed`** — `true` when the `actions` array contains one or more unresolved items. Inspect `actions[].code` to determine the type and `actions[].resolution_link` for how to resolve it.

## Keeping data fresh

Device state updates every 5–15 minutes depending on the manufacturer's API. A 30-second stale time works well for device lists — refetch in the background when data becomes stale and provide a manual pull-to-refresh.

For EV detail views, poll every \~3 seconds while `boost_state === 'requested'` to catch the transition to `'ongoing'`. Return to standard background refetches once the boost is underway.

<Note>
  The Podero API does not provide a WebSocket or push mechanism. All state updates require polling.
</Note>

## Next Steps

<CardGroup cols={2}>
  <Card title="Setting Preferences" icon="sliders" href="/partner-api/user-journeys/end-user/setting-preferences">
    Let users control optimization, boost, and charge schedules
  </Card>

  <Card title="API Reference" icon="book" href="/partner-api/reference/heat-pumps/state">
    Complete list of available state fields
  </Card>
</CardGroup>
