HomeAssistant
Liefert eine Liste buchbarer Ressourcen für Home Assistant.
GET/api/homeassistant/bookables
Jeder Eintrag enthält id und name.
Antworten
default
curl --request GET \
--url https://eure-instanz.iw-erp.de/api/homeassistant/bookables \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/homeassistant/bookables', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/homeassistant/bookables"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://eure-instanz.iw-erp.de/api/homeassistant/bookables', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/homeassistant/bookables"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/homeassistant/bookables")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/homeassistant/bookables"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.get(
Uri.parse('https://eure-instanz.iw-erp.de/api/homeassistant/bookables'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);Liefert einen Kalender-Feed (iCal) für eine einzelne buchbare Ressource.
GET/api/homeassistant/calendar/{identifier}
Pfad-Parameter
identifierPflichtstring |
Antworten
default
curl --request GET \
--url https://eure-instanz.iw-erp.de/api/homeassistant/calendar/42 \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/homeassistant/calendar/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/homeassistant/calendar/42"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://eure-instanz.iw-erp.de/api/homeassistant/calendar/42', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/homeassistant/calendar/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/homeassistant/calendar/42")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/homeassistant/calendar/42"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.get(
Uri.parse('https://eure-instanz.iw-erp.de/api/homeassistant/calendar/42'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);Liefert den iCal für einen einzelnen Buchungseintrag sowie dessen Buchbar-ID.
GET/api/homeassistant/booking/{identifier}
Wird vom Webhook-Handler genutzt, um eine einzelne Veranstaltung in den Kalender zu übernehmen, ohne den vollständigen Kalender-Feed abzurufen.
Pfad-Parameter
identifierPflichtstring |
Antworten
default
curl --request GET \
--url https://eure-instanz.iw-erp.de/api/homeassistant/booking/42 \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/homeassistant/booking/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/homeassistant/booking/42"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://eure-instanz.iw-erp.de/api/homeassistant/booking/42', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/homeassistant/booking/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/homeassistant/booking/42")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/homeassistant/booking/42"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.get(
Uri.parse('https://eure-instanz.iw-erp.de/api/homeassistant/booking/42'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);Einen Webhook registrieren, damit das ERP Home Assistant benachrichtigt, wenn sich Buchungen ändern.
POST/api/homeassistant/webhook
Erwartet JSON-Body: {"webhook_url": "https://ha-instance/api/webhook/iw_erp_homeassistant"}
Legt einen RegisteredWebhook-Eintrag für BaseBooking-Ereignisse (Anlegen, Ändern, Löschen) an.
Optional "events": ["access", "check_in"] - mit integration_ha_access_events_enabled meldet die ERP außerdem Smart-Lock-Zugriffe und Check-ins an dieselbe URL (Body ohne die Entität, nur webhook_data). Jede Registrierung gibt die vollständige Liste an: weggelassene Ereignisse werden entfernt. Die Antwort enthält dann "events" mit den aktiven Ereignissen.
Optional "webhook_token": ein Geheimnis aus 16-190 druckbaren Zeichen, das mit jedem Webhook der URL als X-IW-Webhook-Token zurückgesendet wird, damit Home Assistant gefälschte Aufrufe ablehnen kann.
Antworten
default
curl --request POST \
--url https://eure-instanz.iw-erp.de/api/homeassistant/webhook \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'POST', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/homeassistant/webhook', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/homeassistant/webhook"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.post(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://eure-instanz.iw-erp.de/api/homeassistant/webhook', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/homeassistant/webhook"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/homeassistant/webhook")
.post(null)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/homeassistant/webhook"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.post(
Uri.parse('https://eure-instanz.iw-erp.de/api/homeassistant/webhook'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);Home-Assistant-Webhook abmelden.
DELETE/api/homeassistant/webhook
Erwartet JSON-Body: {"webhook_url": "https://ha-instance/api/webhook/iw_erp_homeassistant"}
Antworten
default
curl --request DELETE \
--url https://eure-instanz.iw-erp.de/api/homeassistant/webhook \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'DELETE', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/homeassistant/webhook', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/homeassistant/webhook"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.delete(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('DELETE', 'https://eure-instanz.iw-erp.de/api/homeassistant/webhook', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Delete,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/homeassistant/webhook"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/homeassistant/webhook")
.delete(null)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/homeassistant/webhook"
req, _ := http.NewRequest("DELETE", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.delete(
Uri.parse('https://eure-instanz.iw-erp.de/api/homeassistant/webhook'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);ERP-Smart-Locks, die der Benutzer des API-Schlüssels verwenden darf, für die Lock-Entitäten der Home-Assistant-Integration ("ERP-Smart-Locks importieren", Opt-in in Home Assistant). Schlösser, die die aufrufende Home-Assistant-Instanz selbst anbietet, bleiben außen vor (excludeHaInstanceId).
GET/api/homeassistant/smart_locks
Query-Parameter
excludeHaInstanceIdstring | Home-Assistant-Instanz-ID, deren eigene Schlösser übersprungen werden |
Antworten
200Smart Locks, die für den Benutzer des API-Schlüssels zugänglich sindarray<object>
Felder anzeigen (4)
idintegernamestringdescriptionstringtypestring
curl --request GET \
--url https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.get(
Uri.parse('https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);[
{
"id": 42,
"name": "Beispiel",
"description": "Text",
"type": "string"
}
]Aktueller Zustand eines ERP-Smart-Locks, abgebildet auf die Home-Assistant-Schlosszustände (locked, unlocked, open, locking, unlocking, opening, jammed, unknown). Fragt den Schloss-Anbieter ab; anders als /api/event/smart_lock/{id}/status schreibt er keinen Smart-Lock-Log-Eintrag, weil Home Assistant ihn regelmäßig abfragt.
GET/api/homeassistant/smart_locks/{identifier}/status
Pfad-Parameter
identifierPflichtstring |
Antworten
200Status des Smart Locksobject
Felder anzeigen (2)
idintegerstatestring
curl --request GET \
--url https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/status \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/status', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/status"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/status', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/status"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/status")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/status"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.get(
Uri.parse('https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/status'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);{
"id": 42,
"state": "string"
}Sperrt ein ERP-Smart-Lock aus Home Assistant. Gleiche Zugriffsregeln und gleiches Smart-Lock-Protokoll wie /api/event/smart_lock/{id}/lock.
POST/api/homeassistant/smart_locks/{identifier}/lock
Pfad-Parameter
identifierPflichtstring |
Antworten
default
curl --request POST \
--url https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/lock \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'POST', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/lock', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/lock"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.post(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/lock', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/lock"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/lock")
.post(null)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/lock"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.post(
Uri.parse('https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/lock'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);Öffnet ein ERP-Smart-Lock aus Home Assistant. Gleiche Zugriffsregeln und Smart-Lock-Protokollierung wie /api/event/smart_lock/{id}/unlock.
POST/api/homeassistant/smart_locks/{identifier}/unlock
Pfad-Parameter
identifierPflichtstring |
Antworten
default
curl --request POST \
--url https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/unlock \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'POST', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/unlock', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/unlock"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.post(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/unlock', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/unlock"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/unlock")
.post(null)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/unlock"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.post(
Uri.parse('https://eure-instanz.iw-erp.de/api/homeassistant/smart_locks/42/unlock'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);Home Assistant bietet seine Schlösser der ERP an ("Home-Assistant-Schlösser anbieten", Opt-in in Home Assistant).
POST/api/homeassistant/ha_locks
Erstellt oder aktualisiert eine Smart-Lock-Verbindung (Anbieter "homeassistant") für die Instanz. Die Schlösser werden erst dann zu ERP-Smart-Locks, wenn ein Administrator die Geräte dieser Verbindung synchronisiert.
Erwartet JSON-Body:
{
"instance_id": "
Eine bereits verbundene Instanz muss das Secret senden, mit dem sie sich registriert hat. Nachdem die Verbindung entfernt wurde (DELETE), kann sich die Instanz mit einem neuen Secret erneut registrieren.
Antworten
default
curl --request POST \
--url https://eure-instanz.iw-erp.de/api/homeassistant/ha_locks \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'POST', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/homeassistant/ha_locks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/homeassistant/ha_locks"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.post(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://eure-instanz.iw-erp.de/api/homeassistant/ha_locks', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/homeassistant/ha_locks"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/homeassistant/ha_locks")
.post(null)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/homeassistant/ha_locks"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.post(
Uri.parse('https://eure-instanz.iw-erp.de/api/homeassistant/ha_locks'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);Home Assistant bietet seine Schlösser nicht mehr an (Opt-in ausgeschaltet oder Integration entfernt).
DELETE/api/homeassistant/ha_locks
Erwartet JSON-Body: {"instance_id": "...", "secret": "..."}. Markiert die Verbindung als gelöscht; ihre Smart-Locks bleiben bestehen, können aber erst wieder verwendet werden, wenn sich die Instanz erneut registriert.
Antworten
default
curl --request DELETE \
--url https://eure-instanz.iw-erp.de/api/homeassistant/ha_locks \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'DELETE', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/homeassistant/ha_locks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/homeassistant/ha_locks"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.delete(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('DELETE', 'https://eure-instanz.iw-erp.de/api/homeassistant/ha_locks', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Delete,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/homeassistant/ha_locks"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/homeassistant/ha_locks")
.delete(null)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/homeassistant/ha_locks"
req, _ := http.NewRequest("DELETE", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.delete(
Uri.parse('https://eure-instanz.iw-erp.de/api/homeassistant/ha_locks'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);Raumanzeigen, an die Home Assistant ausliefert: die OpenDisplay-Empfänger.
GET/api/homeassistant/displays
OpenDisplay-Anzeigen werden von einem Sender in ihrer Nähe per Bluetooth angesteuert, und Home Assistant mit der OpenDisplay-Integration ist genau das. Home Assistant authentifiziert sich hier mit seinem API-Token, sodass kein Gerätegeheimnis in seine Konfiguration kopiert werden muss.
Antworten
200OpenDisplay-Empfängerarray<object>
Felder anzeigen (7)
idintegernamestringdevice_idstringtargetstringrefresh_secondsintegerwidthintegerheightinteger
curl --request GET \
--url https://eure-instanz.iw-erp.de/api/homeassistant/displays \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/homeassistant/displays', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/homeassistant/displays"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://eure-instanz.iw-erp.de/api/homeassistant/displays', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/homeassistant/displays"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/homeassistant/displays")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/homeassistant/displays"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.get(
Uri.parse('https://eure-instanz.iw-erp.de/api/homeassistant/displays'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);[
{
"id": 42,
"name": "Beispiel",
"device_id": "42",
"target": "string",
"refresh_seconds": 1,
"width": 1,
"height": 1
}
]Das aktuelle Bild eines OpenDisplay-Empfängers, das Home Assistant hochlädt.
GET/api/homeassistant/displays/{identifier}/frame.png
Dieselbe Antwort wie der Gerätepfad /display/opendisplay/{deviceId} – PNG, ETag / If-None-Match, X-Refresh-After – authentifiziert mit dem API-Token statt mit dem Gerätegeheimnis. Das Abrufen ist keine Telemetrie: Dass Home Assistant läuft, sagt nichts über das Panel aus, daher wird lastSeenAt nicht verändert.
Pfad-Parameter
identifierPflichtstring |
Antworten
200Rahmen als PNG in der Auflösung des Panels
304Rahmen unverändert, nicht hochladen
curl --request GET \
--url https://eure-instanz.iw-erp.de/api/homeassistant/displays/42/frame.png \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/homeassistant/displays/42/frame.png', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/homeassistant/displays/42/frame.png"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://eure-instanz.iw-erp.de/api/homeassistant/displays/42/frame.png', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/homeassistant/displays/42/frame.png"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/homeassistant/displays/42/frame.png")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/homeassistant/displays/42/frame.png"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.get(
Uri.parse('https://eure-instanz.iw-erp.de/api/homeassistant/displays/42/frame.png'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);Was Home Assistant über das Panel weiß: Batterie, Signal, Firmware und wann zuletzt ein Lebenszeichen empfangen wurde.
POST/api/homeassistant/displays/{identifier}/telemetry
last_seen ist der letzte Kontakt des Panels, so wie Home Assistant ihn sah, nicht der Zeitpunkt dieser Anfrage – der Offline-Bericht muss ein totes Panel hinter einem lebenden Home Assistant erkennen. Ohne diesen Wert zählt der gerade erfolgreiche Upload.
Pfad-Parameter
identifierPflichtstring |
Request-Body application/json
battery_mvnumberbattery_voltagenumberrssiintegerfirmwarestringlast_seenstring (date-time)
Antworten
default
curl --request POST \
--url https://eure-instanz.iw-erp.de/api/homeassistant/displays/42/telemetry \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"battery_mv": 1.5,
"battery_voltage": 1.5,
"rssi": 1,
"firmware": "string",
"last_seen": "2026-10-15T09:30:00+02:00"
}
'const options = {
method: 'POST',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
battery_mv: 1.5,
battery_voltage: 1.5,
rssi: 1,
firmware: 'string',
last_seen: '2026-10-15T09:30:00+02:00'
})
};
fetch('https://eure-instanz.iw-erp.de/api/homeassistant/displays/42/telemetry', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/homeassistant/displays/42/telemetry"
payload = {
"battery_mv": 1.5,
"battery_voltage": 1.5,
"rssi": 1,
"firmware": "string",
"last_seen": "2026-10-15T09:30:00+02:00"
}
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://eure-instanz.iw-erp.de/api/homeassistant/displays/42/telemetry', [
'body' => '{"battery_mv":1.5,"battery_voltage":1.5,"rssi":1,"firmware":"string","last_seen":"2026-10-15T09:30:00+02:00"}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/homeassistant/displays/42/telemetry"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"battery_mv\":1.5,\"battery_voltage\":1.5,\"rssi\":1,\"firmware\":\"string\",\"last_seen\":\"2026-10-15T09:30:00+02:00\"}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"battery_mv\":1.5,\"battery_voltage\":1.5,\"rssi\":1,\"firmware\":\"string\",\"last_seen\":\"2026-10-15T09:30:00+02:00\"}");
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/homeassistant/displays/42/telemetry")
.post(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/homeassistant/displays/42/telemetry"
payload := strings.NewReader("{\"battery_mv\":1.5,\"battery_voltage\":1.5,\"rssi\":1,\"firmware\":\"string\",\"last_seen\":\"2026-10-15T09:30:00+02:00\"}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.post(
Uri.parse('https://eure-instanz.iw-erp.de/api/homeassistant/displays/42/telemetry'),
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: jsonEncode({
"battery_mv": 1.5,
"battery_voltage": 1.5,
"rssi": 1,
"firmware": "string",
"last_seen": "2026-10-15T09:30:00+02:00"
}),
);
print(response.body);Belegung der buchbaren Ressourcen für die Belegungssensoren (integration_occupancy_api_enabled): aktuelle Buchung, Vorlaufzeit bis zur nächsten, Nachlaufzeit nach der letzten, nächste Buchung, Öffnungszeiten.
GET/api/homeassistant/occupancy
Auch bereitgestellt unter /api/event/bookable_occupancy für Node-RED und n8n.
Query-Parameter
bookablestring | Kommagetrennte IDs buchbarer Objekte, Standard: alle |
Antworten
200Belegung je buchbarer Ressourceobject
Felder anzeigen (2)
generated_atstring (date-time)bookablesarray<object>Felder anzeigen (12)
idintegernamestringlocation_idintegerlocation_namestringoccupiedbooleanpre_start_activebooleanpost_end_activebooleanpre_start_minutesintegerpost_end_minutesintegercurrent_bookingobjectnext_bookingobjectopening_hoursobject
curl --request GET \
--url https://eure-instanz.iw-erp.de/api/homeassistant/occupancy \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/homeassistant/occupancy', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/homeassistant/occupancy"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://eure-instanz.iw-erp.de/api/homeassistant/occupancy', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/homeassistant/occupancy"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/homeassistant/occupancy")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/homeassistant/occupancy"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.get(
Uri.parse('https://eure-instanz.iw-erp.de/api/homeassistant/occupancy'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);{
"generated_at": "2026-10-15T09:30:00+02:00",
"bookables": [
{
"id": 42,
"name": "Beispiel",
"location_name": "Beispiel",
"location_id": 42,
"occupied": true,
"pre_start_active": true,
"post_end_active": true,
"pre_start_minutes": 1,
"post_end_minutes": 1
}
]
}Nutzungszähler der Buchbaren, für Zähler, die Home Assistant meldet (integration_usage_counter_api_enabled).
GET/api/homeassistant/usage_counters
Antworten
200Nutzungszählerarray<object>
Felder anzeigen (8)
idintegernamestringbookable_idintegerbookable_namestringvaluenumberunitstringuse_real_usage_databooleanupdatedstring (date-time)
curl --request GET \
--url https://eure-instanz.iw-erp.de/api/homeassistant/usage_counters \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/homeassistant/usage_counters', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/homeassistant/usage_counters"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://eure-instanz.iw-erp.de/api/homeassistant/usage_counters', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/homeassistant/usage_counters"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/homeassistant/usage_counters")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/homeassistant/usage_counters"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.get(
Uri.parse('https://eure-instanz.iw-erp.de/api/homeassistant/usage_counters'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);[
{
"id": 42,
"name": "Beispiel",
"bookable_name": "Beispiel",
"bookable_id": 42,
"value": 1.5,
"unit": "string",
"use_real_usage_data": true,
"updated": "2026-10-15T09:30:00+02:00"
}
]Ein Zählerstand von Home Assistant: setzt den Wert eines Verbrauchszählers. Zähler, die mit den echten Nutzungsdaten der Buchungen gefüllt werden, werden abgelehnt, da Home Assistant deren Summen überschreiben würde.
POST/api/homeassistant/usage_counters/{identifier}
Erwartet JSON-Body {"value": 1240.2}.
Pfad-Parameter
identifierPflichtstring |
Request-Body application/json
valuenumber
Antworten
default
curl --request POST \
--url https://eure-instanz.iw-erp.de/api/homeassistant/usage_counters/42 \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '{"value":1.5}'const options = {
method: 'POST',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({value: 1.5})
};
fetch('https://eure-instanz.iw-erp.de/api/homeassistant/usage_counters/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/homeassistant/usage_counters/42"
payload = { "value": 1.5 }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://eure-instanz.iw-erp.de/api/homeassistant/usage_counters/42', [
'body' => '{"value":1.5}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/homeassistant/usage_counters/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"value\":1.5}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"value\":1.5}");
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/homeassistant/usage_counters/42")
.post(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/homeassistant/usage_counters/42"
payload := strings.NewReader("{\"value\":1.5}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.post(
Uri.parse('https://eure-instanz.iw-erp.de/api/homeassistant/usage_counters/42'),
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: jsonEncode({
"value": 1.5
}),
);
print(response.body);Darf ein Berechtigungsnachweis, den ein Leser bei Home Assistant liest (RFID-Karte, QR der Mitgliedskarte, Zugangscode der App), ein Schloss öffnen (integration_ha_access_check_enabled)? Gleiche Regeln und gleiches Smart-Lock-Protokoll wie die Zugangsprüfung von Node-RED, mit der Quelle "homeassistant".
POST/api/homeassistant/check_access
Erwartet JSON-Body: { "credential": "04A1B2C3D4", "credential_type": "auto", // auto, access_code, member_card oder card "smart_lock_id": 12, // beliebiges ERP-Smart-Lock "instance_id": "...", "lock_id": "lock.front_door", // oder ein Schloss, das diese Home Assistant anbietet "open": false // die ERP öffnet ein Schloss eines anderen Anbieters selbst }
Antworten
200Zugriffsentscheidungobject
Felder anzeigen (6)
grantedbooleanreasonstringcredential_typestringsmart_lockobjectpersonobjectopenedboolean
curl --request POST \
--url https://eure-instanz.iw-erp.de/api/homeassistant/check_access \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'POST', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/homeassistant/check_access', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/homeassistant/check_access"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.post(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://eure-instanz.iw-erp.de/api/homeassistant/check_access', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/homeassistant/check_access"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/homeassistant/check_access")
.post(null)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/homeassistant/check_access"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.post(
Uri.parse('https://eure-instanz.iw-erp.de/api/homeassistant/check_access'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);{
"granted": true,
"reason": "string",
"credential_type": "string",
"opened": true
}Eine Störungsmeldung von Home Assistant als Ticket (integration_ha_ticket_enabled), z. B. ein Wasseralarm.
POST/api/homeassistant/ticket
Erwartet JSON-Body {"title": "...", "description": "...", "bookable_id": 7, "priority": "low|normal|high|urgent", "dedupe_key": "water_leak_hall_1"}; solange ein Ticket mit dem Dedupe-Schlüssel offen ist, wird kein zweites angelegt.
Antworten
200Ticketobject
Felder anzeigen (2)
idintegerstatusstringcreated oder already_open
curl --request POST \
--url https://eure-instanz.iw-erp.de/api/homeassistant/ticket \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'POST', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/homeassistant/ticket', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/homeassistant/ticket"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.post(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://eure-instanz.iw-erp.de/api/homeassistant/ticket', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/homeassistant/ticket"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/homeassistant/ticket")
.post(null)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/homeassistant/ticket"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.post(
Uri.parse('https://eure-instanz.iw-erp.de/api/homeassistant/ticket'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);{
"id": 42,
"status": "string"
}Belegung der buchbaren Ressourcen für die Belegungssensoren (integration_occupancy_api_enabled): aktuelle Buchung, Vorlaufzeit bis zur nächsten, Nachlaufzeit nach der letzten, nächste Buchung, Öffnungszeiten.
GET/api/event/bookable_occupancy
Auch bereitgestellt unter /api/event/bookable_occupancy für Node-RED und n8n.
Query-Parameter
bookablestring | Kommagetrennte IDs buchbarer Objekte, Standard: alle |
Antworten
200Belegung je buchbarer Ressourceobject
Felder anzeigen (2)
generated_atstring (date-time)bookablesarray<object>Felder anzeigen (12)
idintegernamestringlocation_idintegerlocation_namestringoccupiedbooleanpre_start_activebooleanpost_end_activebooleanpre_start_minutesintegerpost_end_minutesintegercurrent_bookingobjectnext_bookingobjectopening_hoursobject
curl --request GET \
--url https://eure-instanz.iw-erp.de/api/event/bookable_occupancy \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/event/bookable_occupancy', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/event/bookable_occupancy"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://eure-instanz.iw-erp.de/api/event/bookable_occupancy', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/event/bookable_occupancy"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/event/bookable_occupancy")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/event/bookable_occupancy"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.get(
Uri.parse('https://eure-instanz.iw-erp.de/api/event/bookable_occupancy'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);{
"generated_at": "2026-10-15T09:30:00+02:00",
"bookables": [
{
"id": 42,
"name": "Beispiel",
"location_name": "Beispiel",
"location_id": 42,
"occupied": true,
"pre_start_active": true,
"post_end_active": true,
"pre_start_minutes": 1,
"post_end_minutes": 1
}
]
}