---
title: "Glofox room bookings — room preparation"
description: "Rezerwacje sal Glofox przez API w chmurze, jeden moduł na salę: Booked now, Minutes to next booking, Prepare room – ogrzej i oświetl salę przed rezerwacją."
url: "https://taphome.com/pl/compatibility/glofox-room-bookings-http/"
language: pl
lastmod: 2026-11-10
generator: hugo
ai:
  topics: ["http","cloud-api","rest-api","sensor","room-booking","facility-booking","scheduling","occupancy","fitness-studio"]
  questions: ["Jak zintegrować rezerwacje sal Glofox z TapHome?","Co odczytuje szablon TapHome dla rezerwacji sal Glofox?","Jak poprosić o dostęp do Glofox API dla TapHome w ABC Fitness Developer Portal?","Jak znaleźć Glofox Branch ID i strefę czasową studia?","Jak ustawić salę w Glofox jako facility do rezerwacji?","Jak znaleźć Facility ID sali w Glofox?","Jak ogrzać salę i włączyć światło przed rezerwacją w Glofox?","Dlaczego wartości sal Glofox w TapHome są przesunięte o godzinę?"]
---

# Glofox room bookings — room preparation

Komunikacja: Packet Parser → HTTP

## Poradnik integracji

Glofox to chmurowa platforma rezerwacji firmy ABC Fitness, więc nie ma tu nic do podłączania: TapHome Core odczytuje rezerwacje sal z Glofox REST API przez HTTPS. Konfiguracja po stronie studia składa się z trzech części — dostępu do Glofox API dla studia, każdej wynajmowanej sali ustawionej jako facility do rezerwacji oraz Branch ID i strefy czasowej studia. Następnie importujesz szablon raz dla każdej sali.

Zrzuty ekranu pochodzą z testowej lokalizacji Glofox Sandbox (ABC Fitness Developer Portal i dashboard Glofox, październik 2026) oraz z aplikacji TapHome połączonej z testową jednostką sterującą z symulowanymi rezerwacjami.

## Konfiguracja

### 1. Poproś o dostęp do Glofox API

**Superadmin** studia rejestruje się w [ABC Fitness Developer Portal](https://api-portal.glofox.com/api-portal/#/glofox/request-access) (Account Type *Customer*) i klika **Request Integrator**:

- **Environment:** *Live* (*Sandbox* to tylko testowa lokalizacja z danymi demonstracyjnymi).
- **Namespace:** namespace Glofox studia.
- **Intended Use Case:** na przykład "TapHome building automation reads facility bookings to prepare rooms (heating, lights, audio) before each booking. Read-only."

ABC Fitness weryfikuje wnioski o dostęp Live i odpowiada e-mailem. **Klucz API** i **token API** zamawia się następnie przyciskiem **Request credentials**; przychodzą na adres e-mail konta w portalu. Pytania dotyczące dostępu: glofox.apisupport@abcfitness.com.

![Instrukcja wniosku o dostęp w ABC Fitness Developer Portal](https://taphome.com/images/compatibility/glofox-room-bookings-http/glofox-request-access_hu_ad9d259835295a2f.jpg)

> [!WARNING]
> Klucz API i token API dają dostęp do danych studia w Glofox. Glofox prosi, aby używać ich tylko w integracjach po stronie serwera, nigdy w aplikacjach klienckich; w TapHome należą wyłącznie do parametrów importu szablonu.

### 2. Ustaw każdą salę jako facility do rezerwacji

Najpierw włącz **Settings → Booking → Facility Rental**; dopiero potem pojawią się opisane niżej przełączniki facilities. Następnie **Manage → Facilities** wyświetla listę sal. Każda sala wynajmowana przez trenerów musi być facility z włączonym **Bookable**, harmonogramem slotów (karta *Schedule*) i dozwolonymi *Drop In Clients* lub *Clients* w sekcji *Price / Eligibility* (cena 0 jest w porządku). Bez tego rezerwacja trenera kończy się komunikatem „Membership not allowed”.

![Facilities w dashboardzie Glofox](https://taphome.com/images/compatibility/glofox-room-bookings-http/glofox-facilities_hu_1f8fd4b2268aac05.jpg)

![Szczegóły facility z włączonymi Public i Bookable](https://taphome.com/images/compatibility/glofox-room-bookings-http/glofox-facility-bookable_hu_e15ed6a0933935cc.jpg)

### 3. Znajdź Branch ID i strefę czasową studia

Z kluczem API i tokenem API jedno zapytanie zwraca lokalizację studia, jej ID i strefę czasową:

```bash
curl -s -X POST https://gf-api.aws.glofox.com/prod/v3.0/locations/retrieve \
  -H "x-api-key: <API key>" -H "x-glofox-api-token: <API token>" \
  -H "Content-Type: application/json" -d '{}'
```

`data[]._id` to **BranchId**, `data[].address.timezone_id` to strefa czasowa studia (na przykład `Europe/Bratislava`). Bez filtra zapytanie zwraca wszystkie lokalizacje w namespace'ach, które integracja może odczytywać, więc przy kilku studiach wybierz wpis studia, którego sale obserwują moduły.

Zegar skryptów TapHome Core musi działać w strefie czasowej studia: w Core 2025.2 jest to systemowa strefa czasowa jednostki sterującej, w nowszych wersjach Core strefa czasowa lokalizacji TapHome.

### 4. Zaimportuj szablon raz dla każdej sali

W aplikacji TapHome otwórz interfejs **Packet Parser** (najpierw go dodaj, jeśli jednostka sterująca go nie ma), potem **Dodaj z szablonu → Dodaj z pliku** i wybierz pobrany szablon. Wypełnij `ApiKey`, `ApiToken`, `BranchId`, `LeadMinutes` i `FacilityId` sali.

W polu **Prefiks nazwy urządzenia** wpisz nazwę sali i zakończ ją separatorem, na przykład `Sala jogi - `. Prefiks jest łączony z nazwami urządzeń dokładnie tak, jak go wpiszesz, więc bez separatora urządzenie nazywa się „Sala jogiBooked now”. **Strefa** przypisuje trzy urządzenia sali do strefy tej sali.

![Parametry importu w aplikacji TapHome](https://taphome.com/images/compatibility/glofox-room-bookings-http/glofox-app-import_hu_5455f063da370ee.jpg)

Jeśli nie znasz jeszcze Facility ID, wpisz dowolny tekst. Po pierwszym odpytaniu moduł zgłasza błąd z listą wszystkich facilities lokalizacji wraz z ich ID (**Urządzenia → Błędy i ostrzeżenia** → moduł):

![Błąd modułu z listą facilities lokalizacji](https://taphome.com/images/compatibility/glofox-room-bookings-http/glofox-app-error_hu_e4c5cc3bd4339a45.jpg)

Skopiuj właściwe ID do zmiennej `FacilityId` modułu (albo zaimportuj szablon ponownie) i powtórz to dla każdej sali.

### 5. Porównaj z kalendarzem Glofox

Rezerwacje sali pojawiają się w **Calendar** Glofox (filtr *Facilities*). Przy rezerwacji od 10:00 do 11:00 i `LeadMinutes` 60 sala ma takie wartości:

| Godzina | Booked now | Minutes to next booking | Prepare room |
|---|---|---|---|
| 8:30 | Free | 90 | Idle |
| 9:00 | Free | 60 | Prepare |
| 10:30 | Booked | następna rezerwacja lub 1440 | Prepare |
| 11:00 | Free | następna rezerwacja lub 1440 | Idle |

Minuty to pełne minuty liczone od odpytania, więc wartość może różnić się od tabeli o jeden.

![Rezerwacja facility w kalendarzu Glofox](https://taphome.com/images/compatibility/glofox-room-bookings-http/glofox-calendar_hu_3b3e02e5fd126f55.jpg)

W aplikacji TapHome każda sala pokazuje trzy wartości pod swoim modułem:

![Wartości sali w aplikacji TapHome](https://taphome.com/images/compatibility/glofox-room-bookings-http/glofox-app-devices_hu_e3c9e82eae9fa28e.jpg)

## Smart rules

**Prepare room** jest warunkiem smart rules sali: wartość zadana ogrzewania lub chłodzenia oraz scena oświetlenia i audio, dopóki ma wartość *Prepare*, i wyłączenie wszystkiego, gdy wróci do *Idle*. **Booked now** nadaje się do wyświetlaczy zajętości; **Minutes to next booking** pozwala smart rule uruchomić wolno reagujące ogrzewanie wcześniej niż `LeadMinutes`.

## Dostępne urządzenia 3

Te urządzenia pojawią się w TapHome po imporcie.

Glofox Room Moduł

Odczyt (moduł)

```taphome
# Bookings of this room (FacilityId) that run now or start within 24 h. Glofox times are the studio's local time
# ("yyyy-MM-dd HH:mm:ss"), so the Core's time zone must be the studio's. Texts in that format sort like the times,
# which lets JSONPath filters compare them directly.
VAR now := NOW();
VAR nowText := TOSTRING(now, "yyyy-MM-dd HH:mm:ss");
VAR leadText := TOSTRING(DATETIMEADD(now, 0, 0, 0, 0, LeadMinutes), "yyyy-MM-dd HH:mm:ss");
VAR nowLocal := ROUND(now.UNIXTIME + LOCALTIMEZONE() / 1000);
VAR hKey := "x-api-key: " + ApiKey;
VAR hToken := "x-glofox-api-token: " + ApiToken;
VAR hBranch := "x-glofox-branch-id: " + BranchId;
VAR msg := "";
VAR i := 0;
VAR fid := "";

# Every failed poll ends in RETURN before the values are written. After five failed polls in a row (Glofox or the
# internet down) the room is released, so an old "Prepare" does not keep heating and lights on.
failCount := failCount + 1;
IF failCount > 5
    bookedNow := 0;
    prepareRoom := 0;
    minsToNext := 1440;
END

# After start and then once an hour: the configured room must exist; if not, the error lists the rooms of the branch
# with their ids. facilityCheck counts the polls until the next check.
IF facilityCheck <= 0
    VAR fresp := SENDHTTPREQUEST("/prod/3.0/locations/" + BranchId + "/facilities?limit=100", "GET", "", hKey, hToken, hBranch);
    IF !fresp.IsSuccess
        # no connection: StatusCode 0 and no ReasonPhrase
        IF !ISNULL(fresp.ReasonPhrase)
            msg := " " + fresp.ReasonPhrase;
        END
        ADDERROR(1, "Glofox API: HTTP " + TOSTRING(fresp.StatusCode, "F0") + msg);
        RETURN(0);
    END
    IF ISNULL(PARSEJSON(fresp.Content, "$.data", TRUE))
        msg := PARSEJSON(fresp.Content, "$.message", TRUE);
        ADDERROR(2, "Glofox API: " + IF(ISNULL(msg), "unexpected answer", msg));
        RETURN(0);
    END
    IF ISNULL(PARSEJSON(fresp.Content, "$.data[?(@._id == '" + FacilityId + "')].name", TRUE))
        msg := "";
        fid := PARSEJSON(fresp.Content, "$.data[0]._id", TRUE);
        WHILE !ISNULL(fid)
            msg := msg + IF(i = 0, ": ", "; ") + PARSEJSON(fresp.Content, "$.data[" + TOSTRING(i, "F0") + "].name", TRUE) + " = " + fid;
            i := i + 1;
            fid := PARSEJSON(fresp.Content, "$.data[" + TOSTRING(i, "F0") + "]._id", TRUE);
        LOOP
        ADDERROR(3, "Facility '" + FacilityId + "' is not in this branch. Facilities" + msg);
        RETURN(0);
    END
    facilityCheck := 60;
END
facilityCheck := facilityCheck - 1;

VAR path := "/prod/2.2/branches/" + BranchId + "/bookings?status=BOOKED&limit=50&time_finish_start_date=" + TOSTRING(nowLocal, "F0") + "&time_start_end_date=" + TOSTRING(nowLocal + 86400, "F0") + "&page=";
VAR room := "$.data[?(@.model_id == '" + FacilityId + "' && @.status == 'BOOKED' && ";
VAR newBooked := 0;
VAR newPrepare := 0;
VAR nextText := "";
VAR candidate := "";
VAR total := 0;
VAR page := 1;
VAR pages := 1;
VAR nextStart := now;

# limit=50: a booking is about 1 kB (0.9 kB measured) and SENDHTTPREQUEST accepts at most 128 kB; at most 10 pages =
# 500 bookings of the whole branch (class bookings included)
VAR resp := SENDHTTPREQUEST(path + "1", "GET", "", hKey, hToken, hBranch);
WHILE page <= pages
    IF page > 1
        resp := SENDHTTPREQUEST(path + TOSTRING(page, "F0"), "GET", "", hKey, hToken, hBranch);
    END
    IF !resp.IsSuccess
        IF !ISNULL(resp.ReasonPhrase)
            msg := " " + resp.ReasonPhrase;
        END
        ADDERROR(1, "Glofox API: HTTP " + TOSTRING(resp.StatusCode, "F0") + msg);
        RETURN(0);
    END
    # a wrong API token or BranchId answers HTTP 200 with success:false and a message, and no meta
    total := PARSEJSON(resp.Content, "$.meta.totalCount", TRUE);
    IF ISNULL(total)
        msg := PARSEJSON(resp.Content, "$.message", TRUE);
        ADDERROR(2, "Glofox API: " + IF(ISNULL(msg), "unexpected answer", msg));
        RETURN(0);
    END
    pages := MIN(10, CEIL(total / 50));
    IF !ISNULL(PARSEJSON(resp.Content, room + "@.time_start <= '" + nowText + "' && @.time_finish > '" + nowText + "')]._id", TRUE))
        newBooked := 1;
    END
    IF !ISNULL(PARSEJSON(resp.Content, room + "@.time_start <= '" + leadText + "' && @.time_finish > '" + nowText + "')]._id", TRUE))
        newPrepare := 1;
    END
    # earliest booking that has not started: take any later than now, then ask for an earlier one until none is left
    candidate := PARSEJSON(resp.Content, room + "@.time_start > '" + nowText + "'" + IF(nextText = "", "", " && @.time_start < '" + nextText + "'") + ")].time_start", TRUE);
    WHILE !ISNULL(candidate)
        nextText := candidate;
        candidate := PARSEJSON(resp.Content, room + "@.time_start > '" + nowText + "' && @.time_start < '" + nextText + "')].time_start", TRUE);
    LOOP
    page := page + 1;
LOOP
IF total > 500
    ADDWARNING(4, "More than 500 bookings of the branch in the next 24 hours; only the first 500 were read, a booking of this room beyond them is not seen");
END

failCount := 0;
bookedNow := newBooked;
prepareRoom := newPrepare;
IF nextText = ""
    minsToNext := 1440;
ELSE
    nextStart := DATETIME(nextText, "yyyy-MM-dd HH:mm:ss");
    minsToNext := MIN(1440, FLOOR((nextStart.TICKS - now.TICKS) / 60000));
END
```

Booked now Kontakt reed

Odczyt

```taphome
RETURN(bookedNow);
```

Minutes to next booking Zmienna

Odczyt

```taphome
RETURN(minsToNext);
```

Prepare room Kontakt reed

Odczyt

```taphome
RETURN(prepareRoom);
```

**Połączenie:** Packet Parser → HTTP

## Parametry importu

Te wartości podajesz podczas importu pliku XML.

| Pytanie w aplikacji                                                              | Domyślnie           |
|----------------------------------------------------------------------------------|---------------------|
| Glofox API key (x-api-key header)                                                | Podaj przy imporcie |
| Glofox API token (x-glofox-api-token header)                                     | Podaj przy imporcie |
| Glofox Branch ID (x-glofox-branch-id header)                                     | Podaj przy imporcie |
| Glofox Facility ID for this room (model\_id in booking response)                 | Podaj przy imporcie |
| Lead time in minutes — Prepare Room activates this many minutes before a booking | `60`                |

## Powiązana dokumentacja

- [Integracja Packet Parser](https://taphome.com/pl/compatibility/packet-parser-guide/)
- [Packet Parser (HTTP, TCP, UDP, FTP, MQTT)](https://taphome.com/pl/docs/integration/packet-parser/)
- [Funkcje Packet parser](https://taphome.com/pl/docs/script/packet-parser/)
- [Funkcje parsowania](https://taphome.com/pl/docs/script/parsing-functions/)

