mirror of
https://github.com/jpawlowski/hass.tibber_prices.git
synced 2026-03-30 05:13:40 +00:00
186 lines
3.3 KiB
Markdown
186 lines
3.3 KiB
Markdown
---
|
|
comments: false
|
|
---
|
|
|
|
# API Reference
|
|
|
|
Documentation of the Tibber GraphQL API used by this integration.
|
|
|
|
## GraphQL Endpoint
|
|
|
|
```
|
|
https://api.tibber.com/v1-beta/gql
|
|
```
|
|
|
|
**Authentication:** Bearer token in `Authorization` header
|
|
|
|
## Queries Used
|
|
|
|
### User Data Query
|
|
|
|
Fetches home information and metadata:
|
|
|
|
```graphql
|
|
query {
|
|
viewer {
|
|
homes {
|
|
id
|
|
appNickname
|
|
address {
|
|
address1
|
|
postalCode
|
|
city
|
|
country
|
|
}
|
|
timeZone
|
|
currentSubscription {
|
|
priceInfo {
|
|
current {
|
|
currency
|
|
}
|
|
}
|
|
}
|
|
meteringPointData {
|
|
consumptionEan
|
|
gridAreaCode
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**Cached for:** 24 hours
|
|
|
|
### Price Data Query
|
|
|
|
Fetches quarter-hourly prices:
|
|
|
|
```graphql
|
|
query($homeId: ID!) {
|
|
viewer {
|
|
home(id: $homeId) {
|
|
currentSubscription {
|
|
priceInfo {
|
|
range(resolution: QUARTER_HOURLY, first: 384) {
|
|
nodes {
|
|
total
|
|
startsAt
|
|
level
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**Parameters:**
|
|
- `homeId`: Tibber home identifier
|
|
- `resolution`: Always `QUARTER_HOURLY`
|
|
- `first`: 384 intervals (4 days of data)
|
|
|
|
**Cached until:** Midnight local time
|
|
|
|
## Rate Limits
|
|
|
|
Tibber API rate limits (as of 2024):
|
|
- **5000 requests per hour** per token
|
|
- **Burst limit:** 100 requests per minute
|
|
|
|
Integration stays well below these limits:
|
|
- Polls every 15 minutes = 96 requests/day
|
|
- User data cached for 24h = 1 request/day
|
|
- **Total:** ~100 requests/day per home
|
|
|
|
## Response Format
|
|
|
|
### Price Node Structure
|
|
|
|
```json
|
|
{
|
|
"total": 0.2456,
|
|
"startsAt": "2024-12-06T14:00:00.000+01:00",
|
|
"level": "NORMAL"
|
|
}
|
|
```
|
|
|
|
**Fields:**
|
|
- `total`: Price including VAT and fees (currency's major unit, e.g., EUR)
|
|
- `startsAt`: ISO 8601 timestamp with timezone
|
|
- `level`: Tibber's own classification (VERY_CHEAP, CHEAP, NORMAL, EXPENSIVE, VERY_EXPENSIVE)
|
|
|
|
### Currency Information
|
|
|
|
```json
|
|
{
|
|
"currency": "EUR"
|
|
}
|
|
```
|
|
|
|
Supported currencies:
|
|
- `EUR` (Euro) - displayed as ct/kWh
|
|
- `NOK` (Norwegian Krone) - displayed as øre/kWh
|
|
- `SEK` (Swedish Krona) - displayed as öre/kWh
|
|
|
|
## Error Handling
|
|
|
|
### Common Error Responses
|
|
|
|
**Invalid Token:**
|
|
```json
|
|
{
|
|
"errors": [{
|
|
"message": "Unauthorized",
|
|
"extensions": {
|
|
"code": "UNAUTHENTICATED"
|
|
}
|
|
}]
|
|
}
|
|
```
|
|
|
|
**Rate Limit Exceeded:**
|
|
```json
|
|
{
|
|
"errors": [{
|
|
"message": "Too Many Requests",
|
|
"extensions": {
|
|
"code": "RATE_LIMIT_EXCEEDED"
|
|
}
|
|
}]
|
|
}
|
|
```
|
|
|
|
**Home Not Found:**
|
|
```json
|
|
{
|
|
"errors": [{
|
|
"message": "Home not found",
|
|
"extensions": {
|
|
"code": "NOT_FOUND"
|
|
}
|
|
}]
|
|
}
|
|
```
|
|
|
|
Integration handles these with:
|
|
- Exponential backoff retry (3 attempts)
|
|
- ConfigEntryAuthFailed for auth errors
|
|
- ConfigEntryNotReady for temporary failures
|
|
|
|
## Data Transformation
|
|
|
|
Raw API data is enriched with:
|
|
- **Trailing 24h average** - Calculated from previous intervals
|
|
- **Leading 24h average** - Calculated from future intervals
|
|
- **Price difference %** - Deviation from average
|
|
- **Custom rating** - Based on user thresholds (different from Tibber's `level`)
|
|
|
|
See `utils/price.py` for enrichment logic.
|
|
|
|
---
|
|
|
|
💡 **External Resources:**
|
|
- [Tibber API Documentation](https://developer.tibber.com/docs/overview)
|
|
- [GraphQL Explorer](https://developer.tibber.com/explorer)
|
|
- [Get API Token](https://developer.tibber.com/settings/access-token)
|