Guide d'intégration — API ingest NowYouSea
La station (Raspberry Pi, ESP32, laptop terrain) envoie ses données en HTTPS vers nowyousea.fr. Le modèle est PUSH uniquement : la station POST, le serveur stocke et diffuse en temps réel.
Quatre canaux de données disponibles : GPS, Audio, Power, System. Chaque canal est indépendant, vous pouvez n'en implémenter qu'un seul.
Toutes les requêtes ingest requièrent un token Bearer dans le header HTTP :
Authorization: Bearer <TON_TOKEN_INGEST>
| Champ | Type | Requis | Description |
|---|---|---|---|
rig | string | Oui | Identifiant unique de la station |
lat | float | Oui | Latitude décimale (WGS84) |
lon | float | Oui | Longitude décimale (WGS84) |
alt | float | Non | Altitude en mètres |
speed | float | Non | Vitesse en m/s |
heading | float | Non | Cap en degrés (0–360) |
sats | int | Non | Nombre de satellites utilisés |
fix | bool | Non | Fix GPS valide (true/false) |
ts | int | Non | Timestamp epoch millisecondes (auto si absent) |
curl -X POST https://nowyousea.fr/api/ingest/gps \
-H "Authorization: Bearer <TON_TOKEN_INGEST>" \
-H "Content-Type: application/json" \
-d '{"rig":"rig-candoo","lat":47.65,"lon":-2.76,"alt":5.2,"sats":8,"fix":true}'
{"status":"ok","rig":"rig-candoo","stored":1}
Le body est les bytes audio bruts. Le stream continu est supporté : envoyer des chunks de 2-3 secondes toutes les 2 secondes.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
rig | string (query) | Oui | Identifiant unique de la station |
format | string (query) | Oui | wav ou flac |
ts | int (query) | Non | Timestamp epoch ms du début du chunk |
| body | bytes | Oui | Bytes audio bruts (WAV ou FLAC) |
curl -X POST "https://nowyousea.fr/api/ingest/audio?rig=rig-candoo&format=wav" \ -H "Authorization: Bearer <TON_TOKEN_INGEST>" \ -H "Content-Type: application/octet-stream" \ --data-binary @chunk.wav
{"status":"ok","samples":48000,"duration_s":1.0}
| Champ | Type | Requis | Description |
|---|---|---|---|
rig | string | Oui | Identifiant unique de la station |
voltage | float | Oui | Tension en volts (V) |
current | float | Oui | Courant en ampères (A) — négatif=décharge, 0 accepté |
power | float | Oui | Puissance en watts (W) |
chip | string | Non | Référence du capteur (ex: INA219) |
ts | int | Non | Timestamp epoch millisecondes (auto si absent) |
curl -X POST https://nowyousea.fr/api/ingest/power \
-H "Authorization: Bearer <TON_TOKEN_INGEST>" \
-H "Content-Type: application/json" \
-d '{"rig":"rig-candoo","voltage":12.4,"current":0.85,"power":10.5,"chip":"INA219"}'
{"status":"ok","rig":"rig-candoo","stored":1}
| Champ | Type | Requis | Description |
|---|---|---|---|
rig | string | Oui | Identifiant unique de la station |
cpu_pct | float | Oui | Usage CPU en % |
ram_pct | float | Oui | Usage RAM en % |
disk_pct | float | Oui | Usage disque en % |
temp_c | float | Oui | Température CPU en °C |
uptime_s | int | Oui | Uptime en secondes depuis boot |
ts | int | Non | Timestamp epoch millisecondes (auto si absent) |
curl -X POST https://nowyousea.fr/api/ingest/system \
-H "Authorization: Bearer <TON_TOKEN_INGEST>" \
-H "Content-Type: application/json" \
-d '{"rig":"rig-candoo","cpu_pct":12.5,"ram_pct":45.2,"disk_pct":62.0,"temp_c":48.3,"uptime_s":86400}'
{"status":"ok","rig":"rig-candoo","stored":1}
Exemple complet pour Raspberry Pi avec requests et psutil. Adapter le RIG et les lectures capteurs réels.
import time, requests, psutil, socket
TOKEN = "<TON_TOKEN_INGEST>"
SERVER = "https://nowyousea.fr"
RIG = "rig-candoo"
HDR = {"Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json"}
def push_gps(lat, lon, alt=None):
d = {"rig": RIG, "lat": lat, "lon": lon}
if alt is not None: d["alt"] = alt
requests.post(f"{SERVER}/api/ingest/gps", json=d, headers=HDR, timeout=5)
def push_power(voltage, current, power, chip=None):
d = {"rig": RIG, "voltage": voltage, "current": current, "power": power}
if chip: d["chip"] = chip
requests.post(f"{SERVER}/api/ingest/power", json=d, headers=HDR, timeout=5)
def push_system():
d = {
"rig": RIG,
"cpu_pct": psutil.cpu_percent(),
"ram_pct": psutil.virtual_memory().percent,
"disk_pct": psutil.disk_usage("/").percent,
"temp_c": psutil.sensors_temperatures().get("cpu_thermal", [{}])[0].get("current", 0),
"uptime_s": int(time.time() - psutil.boot_time()),
}
requests.post(f"{SERVER}/api/ingest/system", json=d, headers=HDR, timeout=5)
def push_audio_chunk(wav_bytes):
url = f"{SERVER}/api/ingest/audio?rig={RIG}&format=wav"
requests.post(url, data=wav_bytes,
headers={"Authorization": f"Bearer {TOKEN}",
"Content-Type": "application/octet-stream"},
timeout=10)
if __name__ == "__main__":
while True:
push_gps(47.65, -2.76, alt=5.0) # remplace par lecture GPS réelle
push_power(12.4, 0.85, 10.5, chip="INA219")
push_system()
time.sleep(2)
Endpoints de lecture pour vérifier que les données arrivent correctement :
Visualisation temps réel publique : https://nowyousea.fr/live/
^[A-Za-z0-9_-]{1,40}$ — unique par station physiqueNYS_TOKEN=...)