← Accueil Dashboard live Timeline spectro Architecture Ops · Serveur Processing toolbox

🧰 Processing toolbox

Chaîne de traitement complète NowYouSea — signal d'entrée → Pi → transport → serveur → traitements → écritures → rétention → sorties. Clique un nœud pour le détail. Données live rafraîchies /10 s.
192 kHzCapture matérielle (AudioMoth, Nyquist)
24 kHzAudio archivé (candoo, 48 kHz Nyquist/2)
8 kHzAnalyse IA (AST rééchantillonne à 16 kHz)
Le spectre large bande 192 kHz passe par le canal spectro, pas par l'audio archivé.
✓ Canal 384 kHz rétabli. Le spectro large bande du firmware alimente désormais la chaîne — 128 bandes logarithmiques de 100 Hz à 192 kHz. spectro_rig_hour = 0. Obtenu en arrêtant nys-audio sur la Pi, qui monopolisait la carte son en 48 kHz. Seul rig-candoo publie ce canal ; rig-pi-flag reste en 96 kHz sans canal large bande.
Live : —
1

Signal d'entrée (capteurs)

AudioMoth USB
Capteur
carte ALSA = card 3 "384kHz AudioMoth USB Microphone"
ADC = 12 bits · taux matériel = 384 kHz constant
Nyquist matériel = 192 kHz · mono, S16_LE
GPS u-blox
Capteur
port = /dev/serial0 · baud = 9600
intervalle = 30 s
pas de fix (intérieur)
INA219 (PoE HAT)
Capteur
bus I²C = 1 · adresses = 0x44,0x40,0x41,0x45
shunt = 0.1 Ω · max = 3.2 A · échantillon = 2 s
AIS / RTL-SDR
Capteur · désactivé
ais.enabled = false
port = tcp:127.0.0.1:10110
↓
2

Pi rocksea-001 (192.168.0.171, VPN 10.9.0.5)

nys-audio.service
Process · arrêté sur candoo · actif sur rig-pi-flag
/opt/nys-pi/audio.py
arecord -D plughw:CARD=Microphone,DEV=0 -c 1 -r 48000 -f S16_LE -t wav --max-file-time 10 --use-strftime
taux = 48 kHz (table RATE_BY_CARD) · chunk = 10 s
travail = /var/tmp/nys-audio/ · encode WAV→FLAC
publie MQTT nys/<rig>/audio
trame = [4o BE longueur][en-tête JSON][octets FLAC]
arrêté sur candoo le 09/10 20:22 UTC pour libérer la carte ALSA
rollback : systemctl enable --now nys-audio
fichiers/h —
nowyousea.service
Process · chemin actif
firmware Quentin · python -m nowyousea.main · dashboard local :8765
audio.sample_rate = 384000 · network.spectro_enabled = true, spectro_interval_s = 5.0
audio_stream_max_rate = 48000, audio_stream_interval_s = 10.0
cloud_endpoint = https://nowyousea.fr, upload_interval_s = 60, upload_batch = 200
état réel : ready=true, running=true, sample_rate=384000, nyquist=192000, underruns=0, efficiency = 100.0 %, uplink ≈ 6122 kbps
publie maintenant l'audio ET le spectro large bande
chunks audio ~4 s (360 fichiers/h)
nys-gps.service
Process
lit gpsd, publie nys/<rig>/gps
nys-power.service
Process
lit INA219, publie nys/<rig>/power
nys-cmd-listener.service
Process
écoute MQTT cmd/config (canal de contrôle : taux, presets SDR)
Spool + backfill
Tampon
cap = 512 Mo · renvoi après coupure réseau
API accepte backfill=1 → réécrit mtime à l'horodatage d'origine
enregistré le plus ancien —
↓
3

Transport

OpenVPN
Transport · chemin actif
tun0 = 10.9.0.5 → serveur 10.9.0.1
AES-256-GCM / SHA256, TLS ≥1.2, tls-crypt
WAN : Freebox → passerelle LXC 192.168.0.128 udp/1195 → DNAT 192.168.0.60:1194
pas de redirect-gateway : rig ne voit que 10.9.0.1
porte MQTT 1883, commandes, SRT
HTTPS public
Transport
passerelle 192.168.0.128, TLS Let's Encrypt, nowyousea.fr
limite 2000 req / 10 s
porte POST /api/ingest/* (voie firmware, inutilisée pour l'audio aujourd'hui)
Pare-feu
Note d'état
un seul vrai pare-feu : la passerelle .128.
Aucun sur la VM .60 (ufw inactive, INPUT ACCEPT).
↓
4

Entrée serveur (VM 150, 192.168.0.60)

mosquitto
Broker
conteneur nys-mosquitto · port 1883
un compte par rig + ACL topic write nys/<rig>/#
nys-api
API
FastAPI 172.17.0.1:8090
routes : /api/ingest/{gps,audio,power,system,summary,spectro,ais,station}
auth Authorization: Bearer
chaîne : _check_ingest → _validate_rig → _assert_token_rig (403 si rig croisé)
format ∈ {wav,flac} sinon 400 · republie vers MQTT nys/<rig>/audio
/api/enroll public, invitation usage unique, 409 si réutilisée
↓
5

Traitements — nys-ingest (/opt/nys-ingest/ingest.py, 611 lignes)

Abonnements MQTT
Entrée
nys/+/gps, nys/+/audio, nys/+/spectro, nys/+/power, nys/+/system, nys/+/summary, nys/+/ais
handle_audio()
Process
décode trame [4o BE][JSON][audio]
archive toujours en FLAC (transcode si WAV, ~−45% octets)
écriture atomique (fichier temp + os.rename), chmod 644
si backfill : os.utime à l'horodatage d'origine
compute_spectro()
Process · DSP
PCM int16 → float32 (÷32768) · downmix mono
STFT nperseg=1024, noverlap=512 · module |Zxx|
regroupement bins → 128 bandes, espacement LINÉAIRE · plafond 100 trames
dB = 20·log10(mag+1e-10), écrêté [-80,0] → [0,255] uint8, base64
fmax = sample_rate/2 → 24 kHz candoo, 48 kHz flag — jamais 192 kHz
128 bandes LINÉAIRES ici, contre 128 bandes LOG côté rig — deux échelles différentes à ne pas confondre
handle_rig_spectro()
Process · actif
spectro large bande calculé à bord sur PCM 384 kHz
colonnes uint8, champs cols/colHz/meta
meta = {binCount: 128, fMinHz: 100.0, fMaxHz: 192000.0, scale: "log"}
128 bandes LOGARITHMIQUES, 100 Hz → 192 kHz
colHz = 46.88 (colonnes/s) · 5 colonnes/message
seul canal porteur de l'ultrason — désormais alimenté
spectro_rig_hour 0
classify_chunk()
Process · fail-soft
POST http://192.168.0.87:8091/classify (GPU box)
modèle AST MIT/ast-finetuned-audioset-10-10-0.4593
rééchantillonne à 16 kHz → ne voit que 0–8 kHz
log-mel 128 bandes → patchs 16×16 → ViT → 527 classes AudioSet
timeout=8s · fil séparé, tolérant panne
seuil écriture EVENTS_MIN_SCORE=0.10
latence — ms
handle_gps / power / system / summary / ais
Process
normalisation puis écriture InfluxDB
↓
6

Écritures

Fichiers audio
Stockage
/data/nowyousea/audio/<rig>/<YYYY-MM-DD>/<HH>/chunk-<ts_ms>.flac
FLAC mono 16 bits · candoo 48 kHz, flag 96 kHz · chunks 10 s
fichiers/h —total —
Historique spectro
Stockage
/data/nowyousea/spectro/<rig>/<date>/<HH>.ndjson, un fichier/heure en append
(choix assumé : milliers de petits fichiers coûtent plus cher sur ce HDD)
chaque ligne porte src="serveur" ou "rig"
+ instantané <rig>.json (dernier lot, écrasé à chaque fois)
Tags / Summary
Stockage
/data/nowyousea/tags/ (anneau TAGS_RING=20)
/data/nowyousea/summary/
InfluxDB
Base de données
conteneur nys-influxdb, org nowyousea
bucket gps : mesures gps (lat,lon,alt,speed,heading,sats,fix,hdop,fix_quality), power, system, ais, audio_summary
bucket audio_events : mesure audio_event, tags rig+label, champs score, chunk, infer_ms
Postgres + MinIO
Base de données
nys-platform · comptes, tokens nys_pk_… hachés bcrypt
scopes upload/read/stream/admin
bucket nys-platform (vide aujourd'hui)
↓
7

Rétention

⚠ Aucun quota par rig. La purge est globale et par âge uniquement, jamais par volume. Un rig mal réglé remplit le disque partagé — c'est ce qui a mis l'iowait à 94% le 05/10 (candoo à 1 chunk/s, 3300 fichiers/h). Prérequis avant d'ouvrir l'enrôlement à des contributeurs.
nys-audio-prune
Tâche
/usr/local/sbin/nys-audio-prune, timer systemd horaire
find -mmin +2880 -delete sur *.wav/*.flac et *.ndjson, puis suppression dossiers vides
soit 48 h
audio — min spectro — min
dernière — · prochaine —
enregistré le plus ancien : —
Rétention InfluxDB
Tâche
buckets gps et audio_events : 48 h, shard 1 h, purge autonome
MinIO lifecycle
Tâche
expire-days 2
Rétention locale Pi
Tâche
storage.retention_days = 30 (base + WAV locaux firmware, indépendant du serveur)
↓
8

Sorties / lecture

nys-api (lecture)
API
/api/rigs, /api/rigs/live, /api/gps/*
/api/audio/{recent,events,events/stats,envelope,chunks,spectro,tags}
/api/spectro/{live,waterfall,index}
/api/power/recent, /api/system/recent, /api/summary/latest
/api/station/*, /api/health, /api/config
nginx
Serveur web
conteneur nowyousea-web · webroot /srv/www/nowyousea
proxy /api/* → 172.17.0.1:8090 · /hls/ → 172.17.0.1:8888 · /ops-admin/ → 172.17.0.1:8793
alias /audio-files/ → /data/nowyousea/audio/
⚠ seules les routes /api/ déclarées sont proxifiées, le reste tombe en catchall HTML 200
Pages
Sortie
/dashboard/ (carte+écoute+waterfall live)
/timeline/ (48h, fenêtre 20–192 kHz)
/live/ (HLS) · /ops-admin/ · /archi/ · /toolbox/ (cette page)
waterfall large bande et timeline montent maintenant réellement à 192 kHz sur candoo
MediaMTX
Sortie · inactif
v1.21.1 · SRT 10.9.0.1:8890 (VPN seulement)
transcodage auto Opus 64k+32k · HLS basse latence segments 1s sur 127.0.0.1:8888
publishers=0, aucun ffmpeg→SRT posé sur la Pi
Opus plafonne à 48 kHz → écoute humaine seulement, jamais l'archive