TapHome
Komunita Beta Senzory

Glofox room bookings — room preparation

Rezervácie miestností (facilities) v Glofox v TapHome cez cloudové REST API Glofox (HTTPS), jeden modul na miestnosť: Booked now, Minutes to next booking a príznak Prepare room, ktorý sa zapne v nastavenom čase pred každou rezerváciou. Smart rules podľa príznaku pred príchodom trénera miestnosť vykúria alebo vychladia a zapnú svetlá a audio, po skončení rezervácie ich vypnú. Iba na čítanie; vyžaduje prístup k Live API, o ktorý požiada superadmin štúdia.

GlofoxPacket Parser → HTTP3 zariadeniaRevízia 1.0 Posledná aktualizácia: 10. novembra 2026

Pridal Matej Hudec

Glofox room bookings — room preparation

Import do aplikácie TapHomeHardvér › Packet Parser › Pridať zo šablóny

Stiahnuť šablónu
Na tejto stránke

Návod na integráciu

Glofox je cloudová rezervačná platforma spoločnosti ABC Fitness, takže sa nič nezapája: TapHome Core číta rezervácie miestností z REST API Glofox cez HTTPS. Nastavenie na strane štúdia má tri časti — prístup štúdia ku Glofox API, každú prenajímanú miestnosť nastavenú ako rezervovateľnú facility a Branch ID a časové pásmo štúdia. Šablóna sa potom importuje raz pre každú miestnosť.

Snímky obrazovky pochádzajú z testovacej lokality Glofox Sandbox (ABC Fitness Developer Portal a dashboard Glofox, október 2026) a z aplikácie TapHome pripojenej k testovacej riadiacej jednotke so simulovanými rezerváciami.

Konfigurácia

1. Požiadajte o prístup ku Glofox API

Superadmin štúdia sa zaregistruje v ABC Fitness Developer Portal (Account Type Customer) a klikne na Request Integrator:

  • Environment: Live (Sandbox je len testovacia lokalita s ukážkovými dátami).
  • Namespace: namespace štúdia v Glofox.
  • Intended Use Case: napríklad (po anglicky) „TapHome building automation reads facility bookings to prepare rooms (heating, lights, audio) before each booking. Read-only.“

ABC Fitness žiadosti o Live posudzuje a odpovedá e-mailom. API kľúč a API token si potom vyžiadate tlačidlom Request credentials a prídu na e-mailovú adresu účtu v portáli. Otázky k prístupu: [email protected].

Návod na žiadosť o prístup v ABC Fitness Developer Portal

API kľúč a API token dávajú prístup k dátam štúdia v Glofox. Glofox žiada používať ich len v backendových integráciách, nikdy v klientskych aplikáciách; v TapHome patria iba do importných parametrov šablóny.

2. Nastavte každú miestnosť ako rezervovateľnú facility

Najprv zapnite Settings → Booking → Facility Rental; prepínače facility nižšie sa zobrazia až potom. Zoznam miestností je potom v Manage → Facilities. Každá miestnosť, ktorú si tréneri prenajímajú, musí byť facility so zapnutým Bookable, s rozvrhom slotov (záložka Schedule) a s povolenými Drop In Clients alebo Clients v časti Price / Eligibility (cena 0 nevadí). Bez toho sa rezervácia trénera skončí hláškou „Membership not allowed“.

Facilities v dashboarde Glofox
Detail facility so zapnutými prepínačmi Public a Bookable

3. Zistite Branch ID a časové pásmo štúdia

S API kľúčom a tokenom vráti jedna požiadavka lokalitu štúdia, jej ID a časové pásmo:

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 '{}'

data[]._id je BranchId, data[].address.timezone_id časové pásmo štúdia (napríklad Europe/Bratislava). Bez filtra požiadavka vráti všetky lokality v namespaces, ktoré integrácia smie čítať, takže pri viacerých štúdiách vyberte záznam štúdia, ktorého miestnosti budú moduly sledovať.

Hodiny skriptov v TapHome Core musia bežať v časovom pásme štúdia: na Core 2025.2 je to systémové časové pásmo riadiacej jednotky, na novšom Core časové pásmo lokality TapHome.

4. Importujte šablónu raz pre každú miestnosť

V aplikácii TapHome otvorte rozhranie Packet parser (ak ho riadiaca jednotka ešte nemá, najprv ho pridajte), potom Pridať zo šablóny → Pridať zo súboru a vyberte stiahnutú šablónu. Vyplňte ApiKey, ApiToken, BranchId, LeadMinutes a FacilityId miestnosti.

Do poľa Predpona názvu zariadenia zadajte názov miestnosti a ukončite ho oddeľovačom, napríklad Jógová sála - . Predpona sa k názvom zariadení pripojí presne tak, ako je napísaná, takže bez oddeľovača sa zariadenie volá „Jógová sálaBooked now“. Zóna zaradí tri zariadenia miestnosti do zóny tejto miestnosti.

Importné parametre v aplikácii TapHome

Ak Facility ID ešte nepoznáte, zadajte ľubovoľný text. Po prvom dotaze na API modul nahlási chybu so zoznamom všetkých facilities pobočky aj s ich ID (Zariadenia → Chyby a varovania → modul):

Chyba modulu so zoznamom facilities pobočky

Správne ID skopírujte do premennej modulu FacilityId (alebo šablónu importujte znova) a postup zopakujte pre každú miestnosť.

5. Porovnajte s kalendárom Glofox

Rezervácie miestnosti sa zobrazujú v Calendar v Glofox (filter Facilities). Pri rezervácii od 10:00 do 11:00 a LeadMinutes 60 má miestnosť tieto hodnoty:

ČasBooked nowMinutes to next bookingPrepare room
8:30Free90Idle
9:00Free60Prepare
10:30Bookedďalšia rezervácia alebo 1440Prepare
11:00Freeďalšia rezervácia alebo 1440Idle

Minúty sú celé minúty počítané od dotazu na API, takže hodnota sa môže od tabuľky líšiť o jednu.

Rezervácia facility v kalendári Glofox

V aplikácii TapHome má každá miestnosť pod svojím modulom tieto tri hodnoty:

Hodnoty miestnosti v aplikácii TapHome

Smart rules

Prepare room je podmienkou smart rules miestnosti: požadovaná teplota kúrenia alebo chladenia a scéna svetiel a audia, kým je v stave Prepare (príprava), a všetko vypnuté, keď sa vráti do Idle (nečinná). Booked now (práve rezervovaná) sa hodí na zobrazenie obsadenosti; Minutes to next booking (minúty do ďalšej rezervácie) umožní smart rule spustiť pomalý vykurovací systém skôr, než určuje LeadMinutes.

Dostupné zariadenia 3

Tieto zariadenia sa po importe zobrazia v TapHome.

Glofox Room Modul

Glofox Room

Čítanie (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 Jazýčkový kontakt

Booked now

Čítanie
RETURN(bookedNow);
Minutes to next booking Premenná

Minutes to next booking

Čítanie
RETURN(minsToNext);
Prepare room Jazýčkový kontakt

Prepare room

Čítanie
RETURN(prepareRoom);
Pripojenie: Packet Parser → HTTP

Parametre importu

Tieto hodnoty zadáte pri importe XML.

Pýta sa v aplikáciiPredvolené
Glofox API key (x-api-key header)Zadáte pri importe
Glofox API token (x-glofox-api-token header)Zadáte pri importe
Glofox Branch ID (x-glofox-branch-id header)Zadáte pri importe
Glofox Facility ID for this room (model_id in booking response)Zadáte pri importe
Lead time in minutes — Prepare Room activates this many minutes before a booking60

Našli ste problém s touto šablónou zariadenia?

Napíšte nám, čo nefunguje, čo chýba, alebo ako by sa mala šablóna správať. Vaša spätná väzba nám pomáha udržiavať katalóg presný.

Šablóna · portál TapHome Glofox room bookings — room preparation Otvorte túto šablónu v Customer Portali a aplikujte ju na svoj domov, alebo navrhnite zmenu a odošlite ju späť do katalógu. Packet Parser → HTTP Zobraziť v portáli TapHome