# Guide de sélection : routeurs industriels

URL : https://smartbuildings.fr/guide-selection-routeur/

Guide de sélection

# Choisir son routeur industriel : 4G, 5G, modem ou Wi-Fi

Répondez à quelques questions simples, une à la fois : le guide vous propose le routeur, le modem ou l'équipement Wi-Fi adapté à votre site, avec le pourquoi, les accessoires à prévoir et les points d'attention. Un conseiller reste joignable à chaque étape.

- Caractéristiques vérifiées chez les fabricants
- Sans inscription
- Sélection à retrouver par e-mail

Question **1**

## Dans quel type de site ou d'activité ?

Votre réponse adapte les questions et les conseils qui suivent. Choisissez « Autre » pour voir toutes les possibilités.

## Votre projet

1. Vos réponses s'afficheront ici. Vous pourrez revenir sur chacune d'elles.

## Besoin d'un avis ?

Un cas particulier, plusieurs sites, une contrainte forte : un conseiller vous aide à choisir.

Vous voulez plutôt faire communiquer des équipements entre eux (Modbus, BACnet, M-Bus, KNX, LoRaWAN) ? [Ouvrir le guide des passerelles](https://smartbuildings.fr/guide-selection-passerelle/)

## Ce guide vous aide si vous voulez :

- Relier un site, une armoire ou une machine à Internet sans ligne fixe, en 4G ou en 5G.
- Accéder à distance à un automate, une supervision ou des caméras, par un VPN.
- Secourir une fibre ou une ADSL par la 4G ou la 5G, avec bascule automatique.
- Interroger à distance un compteur ou un automate à port série (RS-232, RS-485).
- Alimenter et relier des caméras de chantier ou de parking (PoE et réseau mobile).
- Couvrir un atelier ou un entrepôt en Wi-Fi industriel, ou relier deux bâtiments par un pont Wi-Fi.
- Remplacer une ligne téléphonique analogique : téléalarme d'ascenseur, alertes par SMS.
- Équiper un véhicule ou un engin, ou protéger un réseau industriel derrière une ligne existante.
- Choisir les antennes, câbles d'antenne et alimentations adaptés.

### Lexique des termes du guide

- **4G LTE Cat 1, Cat 4** : Catégories de modem 4G. Cat 1 : débit modeste, suffisant pour la télégestion ; Cat 4 : jusqu'à 150 Mbit/s en réception selon la norme.
- **LTE-M et NB-IoT** : Réseaux mobiles à faible débit et faible consommation, pour les compteurs et capteurs : pas de vidéo.
- **5G SA et NSA** : La 5G NSA s'appuie sur le cœur de réseau 4G ; la 5G SA (autonome) utilise un cœur de réseau 5G. Les caractéristiques de chaque routeur précisent ce qui est publié.
- **Bandes B20 et B28** : Fréquences 4G de 800 MHz (B20) et 700 MHz (B28), qui portent loin et traversent bien les bâtiments. En France, Free Mobile n'a pas de 800 MHz.
- **Bande n78** : Bande 5G de 3,5 GHz, la principale bande 5G en France, déployée surtout en zone dense.
- **MIMO** : Usage de plusieurs antennes en même temps pour gagner en débit et en stabilité : 2 antennes en 4G, souvent 4 en 5G.
- **Double SIM** : Deux cartes SIM, souvent de deux opérateurs : l'équipement passe sur la seconde si la première ne fonctionne plus.
- **Bascule** : Passage automatique de la ligne fixe au réseau mobile en cas de coupure, puis retour.
- **WAN et LAN** : Le port WAN reçoit l'accès Internet ; les ports LAN relient les équipements du site.
- **IP passthrough** : Mode pont : le routeur cellulaire transmet l'adresse du réseau mobile à votre routeur ou pare-feu, qui garde la main sur le réseau.
- **PoE** : Alimentation électrique par le câble réseau. PSE : l'équipement fournit le courant (vers des caméras) ; PD : l'équipement est alimenté par le câble.
- **VPN** : Tunnel chiffré entre le site et votre réseau ou votre serveur, pour accéder aux équipements en sécurité.
- **IPsec** : Protocole VPN standard des pare-feu d'entreprise : il relie un site distant au pare-feu du site central.
- **OpenVPN** : Protocole VPN très répandu, en client vers un serveur OpenVPN ou en serveur sur l'équipement.
- **WireGuard** : Protocole VPN récent, léger et rapide à configurer.
- **L2TP** : Protocole de tunnel, souvent associé à IPsec, encore utilisé par certains réseaux d'entreprise.
- **GRE** : Tunnel qui relie les réseaux de deux sites ; il est en général protégé par IPsec.
- **Adresse privée de l'opérateur** : Avec une carte SIM ordinaire, l'opérateur attribue une adresse non joignable depuis Internet (CGNAT) : l'accès à distance passe par un VPN sortant ou un service du fabricant.
- **Accès distant du fabricant** : Service en ligne du fabricant (RobustLink avec RCMS chez Robustel, RLConnect24 chez Red Lion) : l'équipement s'y connecte lui-même, sans adresse IP fixe ni port à ouvrir.
- **Plateforme de gestion de parc** : Service du fabricant pour superviser, configurer et mettre à jour les équipements à distance (RCMS chez Robustel, DeviceHub chez Milesight).
- **Modbus RTU et Modbus TCP** : Le même protocole sur un port série (RTU) ou sur un réseau IP (TCP). Une passerelle traduit l'un vers l'autre.
- **MQTT** : Protocole léger de publication de données vers une plateforme IoT ou un serveur (broker).
- **SNMP** : Protocole de supervision des équipements réseau : état, trafic, alarmes.
- **OPC UA** : Standard d'échange de données industrielles entre automates, supervisions et MES.
- **Mode transparent** : Le port série de l'équipement est transporté sur le réseau : le logiciel d'origine y accède comme s'il était branché.
- **Commandes AT** : Langage par lequel un équipement pilote lui-même un modem (connexion, SMS).
- **RS-232 et RS-485** : Ports série. RS-232 : liaison courte entre deux appareils ; RS-485 : bus 2 fils pour plusieurs appareils, fréquent en Modbus RTU.
- **TOR** : Tout ou rien : contact d'entrée (alarme, état) ou de sortie (commande) à deux états.
- **GNSS** : Localisation par satellite (GPS, Galileo, GLONASS, BeiDou).
- **E-Mark** : Homologation des équipements électroniques installés à bord des véhicules.
- **Itinérance** : Passage d'un point d'accès Wi-Fi à l'autre sans coupure, pour les terminaux et véhicules qui se déplacent.
- **PROFINET** : Réseau industriel Ethernet des automates ; en Wi-Fi, il demande une liaison stable et un mode adapté.
- **Pont Wi-Fi** : Liaison Wi-Fi entre deux points fixes, par exemple deux bâtiments, à la place d'un câble.
- **Rail DIN** : Rail métallique normalisé de 35 mm sur lequel se clipsent les équipements d'armoire électrique.
- **IP67** : Indice de protection : étanche à la poussière et à une immersion temporaire.
- **VoLTE** : Voix sur le réseau 4G. Indispensable pour téléphoner en 4G là où les réseaux 2G et 3G s'arrêtent.
- **FXS** : Port téléphonique analogique : on y branche un téléphone ou un transmetteur comme sur une ligne classique.
- **EN 81-28** : Norme européenne de la téléalarme des ascenseurs.
- **Mini SIM et Nano SIM** : Formats de carte SIM : Mini SIM (2FF) de 25 x 15 mm, Nano SIM (4FF) plus petite. L'eSIM est une puce soudée qui reçoit un profil d'opérateur.
- **SMA, RP-SMA, N** : Connecteurs d'antenne. SMA : le plus courant sur les routeurs ; RP-SMA : variante souvent utilisée en Wi-Fi ; N : connecteur extérieur robuste.
- **Antenne directive** : Antenne qui concentre le signal dans une direction : à pointer vers l'antenne relais quand la réception est faible.
- **Parafoudre** : Protection placée sur le câble d'une antenne extérieure, reliée à la terre, contre les surtensions dues à la foudre.

'; chargerProduits().then(rendre, function () { zone.innerHTML = '

La sélection n\'a pas pu se charger.

'; }); return; } rendreResultat(); } function rendreRecap() { var p = etat().posees; recapN.textContent = p.length ? '(' + p.length + ')' : ''; recapEl.innerHTML = p.length ? p.map(function (q) { var t = QM[q].titre, v = libelleOption(QM[q], S.rep[q]); return '
-
'; }).join('') : '
- Vos réponses s\'afficheront ici. Vous pourrez revenir sur chacune d\'elles.
'; } function lexique(textes) { var t = textes.join(' ').toLowerCase(), vus = {}; var l = (P.glossaire || []).filter(function (x) { var k = x.terme.toLowerCase(); if (vus[k] || t.indexOf(k) < 0) return false; vus[k] = 1; return true; }); if (!l.length) return ''; return '

### Lexique : ' + esc(l.map(function (x) { return x.terme; }).join(', ')) + '

- **' + esc(x.terme) + '** : ' + esc(x.definition) + '

'; } function rendreQuestion(q, n) { var multi = q.type === 'multiple', nombre = q.type === 'nombre', h = ''; h += '

Question **' + n + '**

## ' + esc(q.titre) + '

'; if (q.aide) h += '

' + esc(q.aide) + '

'; if (nombre) { var v = S.rep[q.id] != null ? S.rep[q.id] : ''; h += '

' + (q.unite ? '' + esc(q.unite) + '' : '') + '

'; } else { if (multi && !/plusieurs (r[ée]ponses|choix)/i.test(q.aide || '')) h += '

Plusieurs réponses possibles.

'; h += '

'; var deja = multi && Array.isArray(S.rep[q.id]) ? S.rep[q.id] : []; M.optionsVisibles(q, etat().rep).forEach(function (o) { var nsp = estNsp(o); h += ''; }); h += '

'; if (multi) h += '

'; } h += '

' + (n > 1 ? '' : '') + '

' + (multi || nombre ? '' : '') + '

'; h += lexique([q.titre, q.aide || ''].concat((q.options || []).map(function (o) { return o.libelle + ' ' + (o.aide || ''); }))); h += '

'; zone.innerHTML = h; var ok = zone.querySelector('[data-sbg-suite]'); if (multi) { var maj = function () { var sel = [].slice.call(zone.querySelectorAll('.sbg-opt[aria-pressed=true]')).map(function (b) { return b.dataset.sbgO; }); ok.disabled = !sel.length; zone.querySelector('.sbg-conseils').innerHTML = q.options.filter(function (o) { return sel.indexOf(o.id) >= 0 && o.conseil; }).map(function (o) { return '

' + esc(o.conseil) + '

'; }).join(''); return sel; }; zone.querySelectorAll('.sbg-opt').forEach(function (b) { b.addEventListener('click', function () { var on = b.getAttribute('aria-pressed') !== 'true'; b.setAttribute('aria-pressed', String(on)); if (on) zone.querySelectorAll('.sbg-opt[aria-pressed=true]').forEach(function (x) { if (x !== b && (x.hasAttribute('data-sbg-nsp') || b.hasAttribute('data-sbg-nsp'))) x.setAttribute('aria-pressed', 'false'); }); maj(); }); }); ok.addEventListener('click', function () { var sel = maj(); if (sel.length) repondre(q.id, sel); }); maj(); } else if (nombre) { var inp = zone.querySelector('#sbg-n'); var valider = function () { var x = parseFloat(inp.value); if (isNaN(x) || x < q.min || x > q.max) { inp.classList.add('is-bad'); inp.focus(); return; } repondre(q.id, x); }; ok.addEventListener('click', valider); inp.addEventListener('keydown', function (e) { if (e.key === 'Enter') { e.preventDefault(); valider(); } }); } else { zone.querySelectorAll('.sbg-opt').forEach(function (b) { b.addEventListener('click', function () { repondre(q.id, b.dataset.sbgO); }); }); } placer(); } /* « Pourquoi ce choix » : arguments des critères demandés (exigés, groupes, préférences), complétés jusqu'à 3. */ function pourquoi(r, eff) { var p = r.produit, s = r.tags, arg = p.arguments || {}, ordre = []; var ajout = function (t) { if (s.indexOf(t) >= 0 && arg[t] && ordre.indexOf(t) < 0) ordre.push(t); }; eff.exige.forEach(ajout); eff.groupes.forEach(function (g) { g.forEach(ajout); }); Object.keys(eff.prefere).filter(function (t) { return eff.prefere[t] > 0; }).sort(function (a, b) { return eff.prefere[b] - eff.prefere[a]; }).forEach(ajout); var l = ordre.slice(0, 5); if (l.length < 3) Object.keys(arg).forEach(function (t) { if (l.length < 3 && l.indexOf(t) < 0 && s.indexOf(t) >= 0) l.push(t); }); return l.map(function (t) { return arg[t]; }); } /* Accessoires du produit retenu : règles du parcours (option sauf niveau « necessaire ») et accessoires requis par la fiche (nécessaires sauf niveau « option »). Un accessoire nécessaire est coché d'office ; une option ne l'est jamais. */ function accessoiresDe(r) { var vus = {}, out = []; var req = (r.produit.accessoires_requis || []).map(function (a) { return { id: a.id, raison: a.raison, niveau: a.niveau || 'necessaire' }; }); (r.accessoires || []).concat(req).forEach(function (a) { if (a.id === r.id) return; var f = fiche(a.id); if (!f) return; var nec = a.niveau === 'necessaire'; if (vus[a.id]) { if (nec && !vus[a.id].nec) { vus[a.id].nec = true; vus[a.id].raison = a.raison; } return; } vus[a.id] = { f: f, raison: a.raison, nec: nec }; out.push(vus[a.id]); }); return out; } function carte(r, i, eff) { var p = r.produit, f = fiche(p.id) || { url: '#', img: '' }, v = r.version, top = i === 0, acc = accessoiresDe(r), why = pourquoi(r, eff), h = ''; h += '

'; h += '

' + (top ? ' Notre choix ' : '') + (f.img ? '' : '') + '

'; h += '

' + esc(p.marque) + (p.serie ? ' · ' + esc(p.serie) : '') + '

'; h += '

### [' + esc(f.nom || p.nom) + ']('%20+%20esc%28f.url%29%20+%20')

'; if (v) h += '

Version conseillée : **' + esc(v.libelle) + '**' + (v.sku ? ' `' + esc(v.sku) + '`' : '') + '

'; else if ((p.variantes || []).length > 1) h += '

Versions : **toutes conviennent à vos réponses**, à préciser sur la fiche ou dans votre demande.

'; if (why.length) h += '

#### Pourquoi ce choix

- ' + esc(w) + '

'; if (p.limites) h += '

**Bon à savoir :**' + esc(p.limites) + '

'; var li = function (a) { var idc = 'sbg-a' + p.id + '-' + a.f.id; return '
-
'; }; var nec = acc.filter(function (a) { return a.nec; }), opt = acc.filter(function (a) { return !a.nec; }); if (nec.length) h += '

#### À prévoir avec ce produit

'; if (opt.length) h += '

#### En option, selon votre installation

Cochez ce qui vous concerne : la case ajoute l\'accessoire à votre demande de devis.

'; var faits = p.faits || {}, fk = Object.keys(faits); if (fk.length) h += '

### Caractéristiques vérifiées (' + fk.length + ')

- **' + esc(k) + '** : ' + esc(faits[k]) + '

' + ((p.sources || []).length ? '

Source' + (p.sources.length > 1 ? 's' : '') + ' fabricant : ' + p.sources.slice(0, 3).map(function (u, k) { return '[document ' + (k + 1) + ']('%20+%20esc%28u%29%20+%20')'; }).join(', ') + '

' : '') + '

'; h += '

[Voir la fiche]('%20+%20esc%28f.url%29%20+%20')

'; return h + '

'; } function resume() { return etat().posees.map(function (q) { return '- ' + QM[q].titre + ' : ' + libelleOption(QM[q], S.rep[q]); }).join('\n'); } function resumeResultat(res) { if (!res || !res.produits.length) return ''; return 'Proposition du guide : ' + res.produits.map(function (r) { return r.produit.nom + (r.version ? ' (' + r.version.libelle + (r.version.sku ? ', réf. ' + r.version.sku : '') + ')' : ''); }).join(' ; '); } function rendreResultat() { var res = M.resultat({ produits: F.produits }, P, S.rep, 3), eff = res.effets, exp = P.expert || {}, h = ''; dernier = res; h += '

Résultat

## ' + (res.produits.length && !res.expert ? 'Notre recommandation pour votre projet' : 'Votre projet mérite un échange avec un conseiller') + '

' + '

' + (res.produits.length ? 'Sélection établie à partir de vos réponses et des caractéristiques publiées par les fabricants.' : 'Aucun produit du catalogue ne répond à tous vos critères à la fois.') + '

' + '

'; if (res.conseiller) { h += '

### ' + esc(exp.titre || 'Parlons de votre projet') + '

' + esc(exp.texte || 'Un conseiller SmartBuildings étudie votre besoin et vous propose la bonne solution.') + '

' + (res.produits.length ? '

Une première piste figure ci-dessous ; un conseiller confirmera le choix avec vous.

' : '') + '

'; } var cs = res.conseils.filter(function (c, i, a) { return a.indexOf(c) === i; }); if (cs.length) h += '

### Points d\'attention

- ' + esc(c) + '

'; if (res.produits.length) { h += carte(res.produits[0], 0, eff); if (res.produits.length > 1) h += '

### ' + (res.produits.length > 2 ? 'Autres possibilités' : 'Autre possibilité') + '

' + res.produits.slice(1).map(function (r, i) { return carte(r, i + 1, eff); }).join('') + '

'; } h += '

' + formEmail() + formConseil(false) + '

'; zone.innerHTML = h; brancherFormulaires(); evt('guide_resultat', { famille: F.id, produits: res.produits.length, conseiller: res.conseiller ? 1 : 0 }); placer('#sbg-rt'); } function rendreConseil() { zone.innerHTML = '

' + formConseil(true) + '

'; brancherFormulaires(); placer('#sbg-ct'); } /* ── Formulaires ── */ // texte du libellé dans un seul span : le lien reste dans la phrase (le libellé est en flex) function accord(t) { return ''; } var POT = ''; function formEmail() { return ''; } function formConseil(seul) { var joint = [MARQUE + ' :', resume(), resumeResultat(S.vue === 'resultat' ? dernier : null)].filter(Boolean); return ''; } function verifier(form) { form.querySelectorAll('.is-bad').forEach(function (x) { x.classList.remove('is-bad'); }); var bad = [].slice.call(form.querySelectorAll('input[required],textarea[required]')).filter(function (x) { return x.type === 'checkbox' ? !x.checked : (!x.checkValidity() || !x.value.trim()); }); bad.forEach(function (x) { x.classList.add('is-bad'); }); return bad; } function brancherFormulaires() { t0Form = Date.now(); zone.querySelectorAll('form[data-sbg-form]').forEach(function (form) { form.addEventListener('submit', function (e) { e.preventDefault(); var msg = form.querySelector('.sbg-msg'), btn = form.querySelector('button[type=submit]'), bad = verifier(form); msg.className = 'sbg-msg'; msg.textContent = ''; if (bad.length) { msg.className = 'sbg-msg ko'; msg.textContent = 'Merci de renseigner les champs obligatoires (*) et de cocher l\'accord.'; bad[0].focus(); return; } if (form.dataset.sbgForm === 'email') envoyerEmail(form, msg, btn); else envoyerConseil(form, msg, btn); }); }); } function envoyerEmail(form, msg, btn) { var corps = { email: form.email.value.trim(), consent: 1, rappel: form.rappel.checked ? 1 : 0, website: form.website.value, duree: Date.now() - t0Form, version: D.version, famille: F.id, reponses: S.rep, produits: (dernier ? dernier.produits : []).map(function (r) { return { id: r.id, vid: r.variante || 0 }; }) }; btn.disabled = true; fetch(C.rest + 'guide/enregistrer', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(corps), credentials: 'same-origin' }) .then(function (r) { return r.json().then(function (j) { return { ok: r.ok, j: j }; }); }) .then(function (x) { btn.disabled = false; if (!x.ok || !x.j.ok) { msg.className = 'sbg-msg ko'; msg.textContent = (x.j && x.j.message) || 'Enregistrement impossible, merci de réessayer.'; return; } msg.className = 'sbg-msg ok'; msg.textContent = x.j.envoye ? 'C\'est noté : le lien vient de partir vers ' + corps.email + '.' : (x.j.apercu ? 'Aperçu : sélection enregistrée, e-mail non envoyé. Lien de reprise ci-dessous.' : 'Sélection enregistrée. Gardez le lien ci-dessous.'); if (x.j.lien) { var z = form.querySelector('.sbg-retour-lien'); z.innerHTML = '

'; var inp = z.querySelector('input'), b = z.querySelector('button'); b.addEventListener('click', function () { var fini = function () { b.textContent = 'Copié'; setTimeout(function () { b.textContent = 'Copier'; }, 2000); }; if (navigator.clipboard) navigator.clipboard.writeText(inp.value).then(fini, function () { inp.select(); }); else inp.select(); }); } evt('guide_enregistre', { famille: F.id, rappel: corps.rappel }); }) .catch(function () { btn.disabled = false; msg.className = 'sbg-msg ko'; msg.textContent = 'Enregistrement impossible, merci de réessayer.'; }); } function envoyerConseil(form, msg, btn) { var texte = [form.question.value.trim(), MARQUE + ' :', resume(), resumeResultat(S.vue === 'resultat' ? dernier : null)].filter(Boolean).join('\n\n').slice(0, 3900); if (C.apercu) { msg.className = 'sbg-msg ok'; msg.textContent = 'Aperçu : rien n\'est envoyé. Voici ce que recevrait l\'équipe SmartBuildings.'; var pre = form.querySelector('.sbg-pre-apercu') || document.createElement('pre'); pre.className = 'sbg-pre sbg-pre-apercu'; pre.textContent = 'Nom : ' + form.name.value + '\nSociété : ' + (form.company.value.trim() || 'Non précisé') + '\nE-mail : ' + form.email.value + '\nTéléphone : ' + form.phone.value + '\n\n' + texte; msg.after(pre); return; } var fd = new FormData(); fd.append('name', form.name.value.trim()); fd.append('company', form.company.value.trim() || 'Non précisé'); fd.append('email', form.email.value.trim()); fd.append('phone', form.phone.value.trim()); fd.append('message', texte); fd.append('consent', '1'); fd.append('items', '[]'); fd.append('website', form.website.value); fd.append('t0', String(t0Form)); fd.append('page', location.href.split('?')[0]); btn.disabled = true; fetch(C.devis, { method: 'POST', body: fd, credentials: 'same-origin' }) .then(function (r) { return r.json().then(function (j) { return { ok: r.ok, j: j }; }); }) .then(function (x) { if (x.ok && x.j.ok) { form.innerHTML = '

### Message envoyé

Merci. Un conseiller SmartBuildings vous répond par e-mail' + (fd.get('phone') ? ' ou par téléphone' : '') + '. Un accusé de réception vient de partir vers ' + esc(fd.get('email')) + '.

'; form.querySelector('h3').focus(); evt('generate_lead', { source: 'guide_' + F.id }); return; } btn.disabled = false; msg.className = 'sbg-msg ko'; msg.textContent = (x.j && x.j.message) || 'Envoi impossible, merci de réessayer.'; }) .catch(function () { btn.disabled = false; msg.className = 'sbg-msg ko'; msg.textContent = 'Envoi impossible, merci de réessayer ou d\'écrire à info@smartbuildings.fr.'; }); } /* ── Demande de devis du site (snippet 5) : même stockage, même règle de fusion (produit et version) ── */ function ajouterDevis(pid) { var r = (dernier ? dernier.produits : []).filter(function (x) { return x.id === pid; })[0]; if (!r) return; var a = lire(CLE_DEVIS) || [], f = fiche(pid) || {}, v = r.version; var mettre = function (it) { var k = it.pid + ':' + (it.vid || 0); if (!a.some(function (x) { return x.pid + ':' + (x.vid || 0) === k; })) a.push(it); }; mettre({ pid: pid, vid: v ? v.variation_id : 0, name: f.nom || r.produit.nom, variant: v ? v.libelle : ((r.produit.variantes || []).length > 1 ? 'Version à préciser' : ''), img: f.img || '', qty: 1 }); var carteEl = zone.querySelector('.sbg-card[data-pid="' + pid + '"]'); if (carteEl) carteEl.querySelectorAll('[data-sbg-acc]').forEach(function (c) { if (!c.checked) return; var fa = fiche(+c.dataset.sbgAcc); if (fa) mettre({ pid: fa.id, vid: 0, name: fa.nom, variant: '', img: fa.img || '', qty: 1 }); }); ecrire(CLE_DEVIS, a.slice(0, 50)); var ta = document.querySelector('#sb-devis textarea[name=message]'); if (ta && (!ta.value.trim() || ta.value.indexOf('Projet décrit avec le guide') === 0)) ta.value = MARQUE + ' :\n' + resume(); if (!document.getElementById('sb-devis')) { var b = zone.querySelector('[data-sbg-devis="' + pid + '"]'); if (b) b.textContent = 'Ajouté à votre demande'; } evt('guide_devis', { famille: F.id, produit: pid }); } /* ── Événements ── */ app.addEventListener('click', function (e) { var t = e.target, b; if ((b = t.closest('[data-sbg-devis]'))) { ajouterDevis(+b.dataset.sbgDevis); return; } // le script du devis (snippet 5) ouvre ensuite sa fenêtre (data-sb-open) if ((b = t.closest('[data-sbg-modif]'))) { modifierDepuis(b.dataset.sbgModif); return; } if (t.closest('[data-sbg-retour]')) { retour(); return; } if (t.closest('[data-sbg-recommencer]')) { recommencer(); return; } if (t.closest('[data-sbg-recharger]')) { pret = null; rendre(); return; } if (t.closest('[data-sbg-conseil]')) { interagi = true; var fc = S.vue === 'resultat' && zone.querySelector('form[data-sbg-form=conseil]'); if (fc) { fc.style.scrollMarginTop = '80px'; fc.scrollIntoView({ behavior: 'smooth', block: 'start' }); var n = fc.querySelector('input'); if (n) n.focus({ preventScroll: true }); return; } S.vue = 'conseil'; rendre(); } }); /* ── Démarrage : lien de reprise (?g=…), sinon dernier parcours de ce navigateur (7 jours, mêmes données) ── */ function demarrer() { var g = (location.search.match(/[?&]g=([A-Za-z0-9]{20,64})/) || [])[1]; if (g && C.rest) { zone.innerHTML = '

Chargement de votre sélection…

'; fetch(C.rest + 'guide/selection/' + g, { credentials: 'same-origin' }) .then(function (r) { return r.json().then(function (j) { return { ok: r.ok, j: j }; }); }) .then(function (x) { var bon = x.ok && x.j.ok && x.j.famille === F.id; if (bon) S = { rep: x.j.reponses || {}, vue: 'question' }; rendre(); if (!bon) zone.insertAdjacentHTML('afterbegin', '

Ce lien de sélection n\'est plus valide. Vous pouvez refaire le parcours en quelques questions.

'); }).catch(function () { rendre(); }); } else { var m = lire(CLE); if (m && m.v === D.version && Date.now() - (m.t || 0) < 7 * 864e5) S = { rep: m.rep || {}, vue: 'question' }; rendre(); } if (!F.produits) setTimeout(function () { chargerProduits().catch(function () { /* nouvel essai au moment du résultat */ }); }, 400); } demarrer(); })();
