API / PHP / SYMFONY
Pomiary w Twojej aplikacji.
Pobierz historię sensora przez REST API albo skorzystaj z klienta PHP. Poniżej znajdziesz konfigurację, przykłady i opis odpowiedzi.
1. Token organizacji i ID sensora
- Otwórz panel i wybierz Tokeny API.
- Dodaj token, nadaj mu nazwę i opcjonalnie ustaw datę wygaśnięcia. Token musi być aktywny i przypisany do organizacji.
- Po zapisaniu skopiuj pełną wartość tokena. Nie jest przechowywana do ponownego odczytu — jeśli ją zgubisz, utwórz nowy token i dezaktywuj poprzedni.
- W sekcji Temperatura → Sensory skopiuj Device ID wybranego sensora.
Użyj tokena organizacji w nagłówku X-Api-Token. Device ID identyfikuje sensor; nie jest kluczem dostępu. Sekret urządzenia i jego token JWT służą do komunikacji urządzenia, nie do odczytu tego API.
Odczyt wymaga dostępu do API i danych sensora w abonamencie organizacji. Token nie daje dostępu do sensorów innej organizacji.
Przechowuj token po stronie serwera, w zmiennych środowiskowych lub magazynie sekretów. Nie dodawaj go do repozytorium, kodu przeglądarki ani logów. Dla produkcyjnego API używaj HTTPS.
2. Pierwsze zapytanie do REST API
GET https://sensor.besmartand.pro/api/client/sensors/{id}/history
Ustaw SENSOR_API_TOKEN i SENSOR_ID w środowisku, a następnie wykonaj:
curl 'https://sensor.besmartand.pro/api/client/sensors/'"$SENSOR_ID"'/history' \
-H 'Accept: application/json' \
-H "X-Api-Token: $SENSOR_API_TOKEN"
Przykładowa odpowiedź:
{
"items": [
{
"sensor": "Chłodnia A",
"temperature": 4.2,
"humidity": 51.5,
"datetime": "2026-10-12T12:00:00+02:00"
}
]
}
sensor to etykieta sensora, temperature to temperatura w °C, a humidity to wilgotność względna w %. Wilgotność i data mogą mieć wartość null. Pusta historia ma postać {"items": []}.
Endpoint zwraca maksymalnie 200 ostatnich pomiarów. Nie udostępnia paginacji ani filtrów dat. Jeśli zapisujesz własne archiwum, dobierz częstotliwość odczytu do częstotliwości pomiarów i limitu API w abonamencie.
3. Biblioteka dla PHP
besmartand-pro/bsap-sensor-client działa z PHP 8.4 lub nowszym. Nie wymaga frameworka. Poniższy przykład używa Guzzle jako transportu HTTP i Nyholm jako fabryki żądań.
composer require 'besmartand-pro/bsap-sensor-client:~1.0.0' guzzlehttp/guzzle nyholm/psr7
<?php
use BeSmartAndPro\BsapSensorClient\SensorClient;
use GuzzleHttp\Client;
use Nyholm\Psr7\Factory\Psr17Factory;
require 'vendor/autoload.php';
$client = new SensorClient(
new Client(['timeout' => 10, 'connect_timeout' => 5]),
new Psr17Factory(),
getenv('SENSOR_API_TOKEN') ?: '',
);
foreach ($client->getSensorHistory('SENSOR_UUID') as $measurement) {
echo $measurement->getSensor() . ': '
. $measurement->getTemperature() . ' °C' . PHP_EOL;
}
Zastąp SENSOR_UUID skopiowanym Device ID. Klient domyślnie łączy się z https://sensor.besmartand.pro; czwarty argument konstruktora pozwala wskazać inne środowisko.
Każdy pomiar jest obiektem SensorMeasurement z metodami getSensor(), getTemperature(), getHumidity() i getDatetime(). Data jest obiektem DateTimeImmutable lub ma wartość null.
4. Integracja z Symfony
besmartand-pro/bsap-sensor-bundle dodaje konfigurację i autowiring klienta w Symfony 7.4 oraz 8.x. Wymaga PHP 8.4 lub nowszego i korzysta z biblioteki klienta w wersji 1.0.x.
Bundle nie jest jeszcze opublikowany w Packagist. Poniższe polecenie instalacji będzie dostępne po publikacji pakietu.
composer require besmartand-pro/bsap-sensor-bundle
W config/bundles.php dodaj wpis do istniejącej tablicy:
BeSmartAndPro\BsapSensorBundle\BsapSensorBundle::class => ['all' => true],
Utwórz config/packages/bsap_sensor.yaml:
bsap_sensor:
api_token: '%env(SENSOR_API_TOKEN)%'
base_uri: 'https://sensor.besmartand.pro'
timeout: 10.0
http_client: 'http_client'
Ustaw SENSOR_API_TOKEN w środowisku aplikacji lub Symfony Secrets. Tylko api_token jest wymagany; pozostałe wartości powyżej są domyślne. Aplikacja musi mieć włączony HttpClient, np. framework: { http_client: ~ }.
Wstrzyknij klienta do serwisu:
<?php
namespace App\Service;
use BeSmartAndPro\BsapSensorClient\SensorClientInterface;
final readonly class SensorHistoryService
{
public function __construct(private SensorClientInterface $sensorClient)
{
}
public function read(string $sensorId): array
{
return $this->sensorClient->getSensorHistory($sensorId);
}
}
Bundle konfiguruje osobny transport Symfony HttpClient z timeoutem i wyłączonymi przekierowaniami. Opcja http_client pozwala wskazać istniejący klient HTTP aplikacji.
5. Błędy i limity
200— pomiary zostały zwrócone.401— token jest nieprawidłowy, wygasł lub został dezaktywowany.403— brak uprawnień, sensor spoza organizacji lub brak wymaganej funkcji w abonamencie. Żądanie bez tokena może również otrzymać tę odpowiedź.404— sensor o podanym ID nie istnieje.429— został przekroczony limit zapytań API w planie organizacji.5xx— błąd po stronie serwera.
Biblioteka zgłasza ApiException dla odpowiedzi innej niż 200. Kod odczytasz przez getStatusCode(). Metoda getRetryAfter() zwraca nagłówek Retry-After, jeśli serwer go przesłał; może zwrócić null.
Niepoprawna odpowiedź zgłasza InvalidResponseException, a problemy z połączeniem wyjątek transportu PSR-18. Klient nie ponawia zapytań automatycznie. Po 429 ogranicz częstotliwość odczytu; ponawianie bez przerwy nie zwiększy limitu planu.