TapHome
Közösség Béta Szenzorok

Glofox room bookings — room preparation

Glofox létesítményfoglalások a TapHome-ban a Glofox felhőalapú REST API-ján (HTTPS) keresztül, termenként egy modul: Booked now, Minutes to next booking és egy Prepare room jelző, amely minden foglalás előtt beállított idővel bekapcsol. A smart rule-ok a jelző alapján fűtik vagy hűtik a termet, és bekapcsolják a világítást és a hangrendszert, mielőtt az edző megérkezik, majd a foglalás végén kikapcsolják. Csak olvasás; a stúdió superadminja által igényelt Live API-hozzáférés szükséges.

GlofoxPacket Parser → HTTP3 eszközRevízió 1.0 Utoljára frissítve: 2026. november 10.

Beküldő Matej Hudec

Glofox room bookings — room preparation

Importálás a TapHome alkalmazásbaHardver › Packet Parser › Hozzáadás sablonból

Sablon letöltése
Ezen az oldalon

Integrációs útmutató

A Glofox az ABC Fitness felhőalapú foglalási platformja, így nincs mit bekötni: a TapHome Core a teremfoglalásokat a Glofox REST API-ból olvassa HTTPS-en keresztül. A stúdió oldalán a beállítás három részből áll — Glofox API-hozzáférés a stúdió számára, minden bérelt terem foglalható létesítményként (facility) beállítva, valamint a stúdió Branch ID-ja és időzónája. A sablont ezután termenként egyszer kell importálni.

A képernyőképek egy Glofox Sandbox tesztlokációról (ABC Fitness Developer Portal és Glofox dashboard, 2026. október), valamint a szimulált foglalásokkal működő teszt vezérlőegységhez csatlakoztatott TapHome alkalmazásból származnak.

Konfiguráció

1. Glofox API-hozzáférés igénylése

A stúdió superadminja regisztrál az ABC Fitness Developer Portal oldalon (Account Type Customer), és a Request Integrator gombra kattint:

  • Environment: Live (a Sandbox csak egy demóadatokkal működő tesztlokáció).
  • Namespace: a stúdió Glofox namespace-e.
  • Intended Use Case: például „TapHome building automation reads facility bookings to prepare rooms (heating, lights, audio) before each booking. Read-only.”

Az ABC Fitness átnézi a Live kérelmeket, és e-mailben válaszol. Az API-kulcsot (API key) és az API tokent ezután a Request credentials gombbal igényled, és a portálon megadott e-mail-címre érkeznek. A hozzáféréssel kapcsolatos kérdések: [email protected].

Hozzáférés-igénylési útmutató az ABC Fitness Developer Portalon

Az API-kulcs és az API token hozzáférést ad a stúdió Glofox-adataihoz. A Glofox azt kéri, hogy csak backend integrációkban használd őket, kliensoldali alkalmazásokban soha; a TapHome-ban kizárólag a sablon importparamétereibe valók.

2. Minden terem legyen foglalható létesítmény

Először kapcsold be a Settings → Booking → Facility Rental beállítást; a létesítmények alábbi kapcsolói csak ezután jelennek meg. Ezután a Manage → Facilities felsorolja a termeket. Minden terem, amelyet az edzők bérelnek, olyan létesítmény (facility) legyen, amelynél be van kapcsolva a Bookable, van idősáv-ütemezése (Schedule fül), és a Price / Eligibility alatt engedélyezve van a Drop In Clients vagy a Clients (a 0-s ár is megfelel). Ezek nélkül az edző foglalása a „Membership not allowed” üzenettel végződik.

Létesítmények (Facilities) a Glofox dashboardon
Létesítmény részletei bekapcsolt Public és Bookable kapcsolóval

3. A Branch ID és a stúdió időzónájának megkeresése

Az API-kulccsal és a tokennel egyetlen kérés visszaadja a stúdió lokációját, annak azonosítóját és időzónáját:

1
2
3
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 '{}'

A data[]._id a BranchId, a data[].address.timezone_id a stúdió időzónája (például Europe/Bratislava). Szűrő nélkül a kérés minden lokációt visszaad azokban a namespace-ekben, amelyeket az integráció olvashat, ezért több stúdió esetén annak a stúdiónak a bejegyzését válaszd, amelynek termeit a modulok figyelik.

A TapHome Core szkriptórájának a stúdió időzónájában kell járnia: Core 2025.2-n ez a vezérlőegység rendszer-időzónája, újabb Core-on a TapHome helyszín időzónája.

4. A sablon importálása termenként egyszer

A TapHome alkalmazásban nyisd meg a Packet parser interfészt (ha a vezérlőegységen még nincs, előbb add hozzá), majd válaszd a Hozzáadás a sablonból → Hozzáadás fájlból lehetőséget, és jelöld ki a letöltött sablont. Töltsd ki az ApiKey, ApiToken, BranchId, LeadMinutes paramétereket és a terem FacilityId azonosítóját.

A terem nevét írd az Eszköznév előre definiálva mezőbe, és zárd le egy elválasztóval, például Jógaterem - . Az előtag pontosan úgy kapcsolódik az eszköznevekhez, ahogy beírtad, így elválasztó nélkül az eszköz neve „JógateremBooked now” lesz. A Zóna a terem három eszközét a terem zónájába helyezi.

Importparaméterek a TapHome alkalmazásban

Ha a Facility ID-t még nem ismered, írj be bármilyen szöveget. Az első lekérdezés után a modul hibát jelez, amely felsorolja a telephely (branch) összes létesítményét az azonosítójukkal együtt (Eszközök → Hibák és figyelmeztetések → a modul):

Modulhiba a telephely létesítményeinek listájával

Másold be a megfelelő azonosítót a modul FacilityId változójába (vagy importáld újra), és ismételd meg minden teremnél.

5. Ellenőrzés a Glofox naptárában

Egy terem foglalásai a Glofox Calendar nézetében jelennek meg (Facilities szűrő). 10:00 és 11:00 közötti foglalás és 60-as LeadMinutes esetén a terem értékei:

IdőpontBooked nowMinutes to next bookingPrepare room
8:30Free90Idle
9:00Free60Prepare
10:30Bookedkövetkező foglalás vagy 1440Prepare
11:00Freekövetkező foglalás vagy 1440Idle

A percek a lekérdezéstől számított egész percek, így egy érték eggyel eltérhet a táblázattól.

Létesítményfoglalás a Glofox naptárában

A TapHome alkalmazásban minden terem a saját modulja alatt mutatja a három értéket:

A terem értékei a TapHome alkalmazásban

Smart rule-ok

A Prepare room (terem előkészítése) a terem smart rule-jainak feltétele: fűtési vagy hűtési alapjel, világítási és audiójelenet, amíg Prepare állapotban van, és minden kikapcsol, amikor visszatér Idle állapotba. A Booked now (most foglalt) foglaltságkijelzőkhöz illik; a Minutes to next booking (percek a következő foglalásig) segítségével egy smart rule a lassú fűtési rendszert a LeadMinutes értéknél korábban is elindíthatja.

Elérhető eszközök 3

Ezek az eszközök az importálás után jelennek meg a TapHome-ban.

Glofox Room Modul

Glofox Room

Olvasás (modul)
# 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 Reed kontaktus

Booked now

Olvasás
RETURN(bookedNow);
Minutes to next booking Változó

Minutes to next booking

Olvasás
RETURN(minsToNext);
Prepare room Reed kontaktus

Prepare room

Olvasás
RETURN(prepareRoom);
Kapcsolat: Packet Parser → HTTP

Importálási paraméterek

Ezeket az értékeket az XML importálásakor adja meg.

Az alkalmazás kériAlapérték
Glofox API key (x-api-key header)Importáláskor adja meg
Glofox API token (x-glofox-api-token header)Importáláskor adja meg
Glofox Branch ID (x-glofox-branch-id header)Importáláskor adja meg
Glofox Facility ID for this room (model_id in booking response)Importáláskor adja meg
Lead time in minutes — Prepare Room activates this many minutes before a booking60

Talált problémát ezzel az eszközsablonnal?

Írja meg, mi nem működik, mi hiányzik, vagy hogyan kellene a sablonnak viselkednie. Visszajelzése segít, hogy a katalógus pontos maradjon.

Sablon · TapHome portál Glofox room bookings — room preparation Nyisd meg ezt a sablont az ügyfélportálon, hogy alkalmazd az otthonaid egyikére, vagy készíts egy módosítást és küldd vissza a katalógusba. Packet Parser → HTTP Megnyitás a TapHome portálon