Compare commits

..

4 Commits

27 changed files with 687208 additions and 575 deletions

View File

@@ -1,6 +1,6 @@
FROM python:3.12-slim FROM python:3.12-slim
WORKDIR /app WORKDIR /app
RUN pip install --no-cache-dir paho-mqtt requests influxdb-client pulsar-client RUN pip install --no-cache-dir paho-mqtt requests influxdb-client pulsar-client prometheus_client
COPY simulator.py /app/ COPY simulator.py /app/
EXPOSE 8081 EXPOSE 8081
# Healthcheck endpoint (simple HTTP server) # Healthcheck endpoint (simple HTTP server)

View File

@@ -1,380 +1,270 @@
<!DOCTYPE html> <h1
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang=""> id="smart-city-digital-twin-martinique-diagramme-des-flux-de-données">Smart
<head> City Digital Twin Martinique — Diagramme des Flux de Données</h1>
<meta charset="utf-8" /> <p><strong>Dernière mise à jour :</strong> 06 Mai 2026<br />
<meta name="generator" content="pandoc" /> <strong>Projet :</strong> Smart City Digital Twin Martinique<br />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> <strong>Architecture :</strong> IoT-Agent intégré, QuantumLeap + CrateDB
<title>data-flow-diagram</title> pour lanalyse avancée</p>
<style>
/* Default styles provided by pandoc.
** See https://pandoc.org/MANUAL.html#variables-for-html for config info.
*/
html {
color: #1a1a1a;
background-color: #fdfdfd;
}
body {
margin: 0 auto;
max-width: 36em;
padding-left: 50px;
padding-right: 50px;
padding-top: 50px;
padding-bottom: 50px;
hyphens: auto;
overflow-wrap: break-word;
text-rendering: optimizeLegibility;
font-kerning: normal;
}
@media (max-width: 600px) {
body {
font-size: 0.9em;
padding: 12px;
}
h1 {
font-size: 1.8em;
}
}
@media print {
html {
background-color: white;
}
body {
background-color: transparent;
color: black;
font-size: 12pt;
}
p, h2, h3 {
orphans: 3;
widows: 3;
}
h2, h3, h4 {
page-break-after: avoid;
}
}
p {
margin: 1em 0;
}
a {
color: #1a1a1a;
}
a:visited {
color: #1a1a1a;
}
img {
max-width: 100%;
}
svg {
height: auto;
max-width: 100%;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 1.4em;
}
h5, h6 {
font-size: 1em;
font-style: italic;
}
h6 {
font-weight: normal;
}
ol, ul {
padding-left: 1.7em;
margin-top: 1em;
}
li > ol, li > ul {
margin-top: 0;
}
blockquote {
margin: 1em 0 1em 1.7em;
padding-left: 1em;
border-left: 2px solid #e6e6e6;
color: #606060;
}
code {
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
font-size: 85%;
margin: 0;
hyphens: manual;
}
pre {
margin: 1em 0;
overflow: auto;
}
pre code {
padding: 0;
overflow: visible;
overflow-wrap: normal;
}
.sourceCode {
background-color: transparent;
overflow: visible;
}
hr {
border: none;
border-top: 1px solid #1a1a1a;
height: 1px;
margin: 1em 0;
}
table {
margin: 1em 0;
border-collapse: collapse;
width: 100%;
overflow-x: auto;
display: block;
font-variant-numeric: lining-nums tabular-nums;
}
table caption {
margin-bottom: 0.75em;
}
tbody {
margin-top: 0.5em;
border-top: 1px solid #1a1a1a;
border-bottom: 1px solid #1a1a1a;
}
th {
border-top: 1px solid #1a1a1a;
padding: 0.25em 0.5em 0.25em 0.5em;
}
td {
padding: 0.125em 0.5em 0.25em 0.5em;
}
header {
margin-bottom: 4em;
text-align: center;
}
#TOC li {
list-style: none;
}
#TOC ul {
padding-left: 1.3em;
}
#TOC > ul {
padding-left: 0;
}
#TOC a:not(:hover) {
text-decoration: none;
}
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
div.columns{display: flex; gap: min(4vw, 1.5em);}
div.column{flex: auto; overflow-x: auto;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
/* The extra [class] is a hack that increases specificity enough to
override a similar rule in reveal.js */
ul.task-list[class]{list-style: none;}
ul.task-list li input[type="checkbox"] {
font-size: inherit;
width: 0.8em;
margin: 0 0.8em 0.2em -1.6em;
vertical-align: middle;
}
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
</style>
</head>
<body>
<nav id="TOC" role="doc-toc">
<ul>
<li><a href="#smart-city-digital-twin-diagramme-des-flux-de-données"
id="toc-smart-city-digital-twin-diagramme-des-flux-de-données">Smart
City Digital Twin — Diagramme des Flux de Données</a>
<ul>
<li><a href="#vue-densemble" id="toc-vue-densemble">Vue
densemble</a></li>
<li><a href="#diagramme-mermaid" id="toc-diagramme-mermaid">Diagramme
Mermaid</a></li>
<li><a href="#description-des-flux"
id="toc-description-des-flux">Description des flux</a>
<ul>
<li><a href="#génération-des-données-simulator"
id="toc-génération-des-données-simulator">1. <strong>Génération des
données (Simulator)</strong></a></li>
<li><a href="#ingestion-mqtt-brokers" id="toc-ingestion-mqtt-brokers">2.
<strong>Ingestion MQTT (Brokers)</strong></a></li>
<li><a href="#context-brokers-ngsi-ld-sensorthings"
id="toc-context-brokers-ngsi-ld-sensorthings">3. <strong>Context Brokers
(NGSI-LD &amp; SensorThings)</strong></a></li>
<li><a href="#plateforme-iot-openremote"
id="toc-plateforme-iot-openremote">4. <strong>Plateforme IoT
(OpenRemote)</strong></a></li>
<li><a href="#stockage-métriques" id="toc-stockage-métriques">5.
<strong>Stockage &amp; Métriques</strong></a></li>
<li><a href="#visualisation-analyse" id="toc-visualisation-analyse">6.
<strong>Visualisation &amp; Analyse</strong></a></li>
</ul></li>
<li><a href="#technologies-clés" id="toc-technologies-clés">Technologies
clés</a></li>
<li><a href="#fichiers-associés" id="toc-fichiers-associés">Fichiers
associés</a></li>
</ul></li>
</ul>
</nav>
<h1 id="smart-city-digital-twin-diagramme-des-flux-de-données">Smart
City Digital Twin — Diagramme des Flux de Données</h1>
<h2 id="vue-densemble">Vue densemble</h2>
<p>Ce diagramme illustre le flux complet des données IoT du simulateur
vers les différentes couches de traitement, de stockage et de
visualisation.</p>
<hr /> <hr />
<h2 id="diagramme-mermaid">Diagramme Mermaid</h2> <h2 id="architecture-globale-mise-à-jour-06052026">Architecture Globale
(Mise à jour 06/05/2026)</h2>
<pre class="mermaid"><code>graph TB <pre class="mermaid"><code>graph TB
SIM[Smart City Simulator] subgraph Simulateur[&quot;🖥️ Simulateur (Host Python)&quot;]
SENS[Capteurs IoT Reels] SIM[Smart City Simulator&lt;br/&gt;10 capteurs&lt;br/&gt;Intervalle: configurable]
EMQ[EMQX] end
MOS[Mosquitto]
BUN[BunkerM]
FRO[FROST-Server]
ORI[Orion-LD]
STE[Stellio]
UI[OpenRemote UI]
ORM[OpenRemote Manager]
KC[Keycloak]
INF[InfluxDB]
PRO[Prometheus]
GEO[GeoServer]
GRA[Grafana]
MAP[MapStore]
SIM --&gt; EMQ subgraph MQTT_Brokers[&quot;📡 MQTT Brokers&quot;]
SIM --&gt; MOS EMQ[EMQX&lt;br/&gt;port 11883]
SIM --&gt; BUN MOS[Mosquitto&lt;br/&gt;port 1883]
SENS --&gt; EMQ BUN[BunkerM&lt;br/&gt;port 1900&lt;br/&gt;MQTTS/TLS]
SENS --&gt; MOS end
SENS --&gt; BUN
SENS -.-&gt; ORM subgraph IoT_Agent[&quot;🤖 IoT Agent (NGSI-LD)&quot;]
EMQ --&gt;|via EMQX| ORI IOTA[IoT Agent JSON&lt;br/&gt;port 4041&lt;br/&gt;Transforme MQTT → NGSI-LD]
EMQ --&gt;|via EMQX| STE end
EMQ --&gt;|via EMQX| FRO
EMQ --&gt; ORM subgraph CB[&quot;🔗 Context Brokers (NGSI-LD)&quot;]
MOS --&gt;|via Mosquitto| ORI ORI[Orion-LD&lt;br/&gt;NGSI-LD&lt;br/&gt;port 1026]
MOS --&gt;|via Mosquitto| STE STE[Stellio&lt;br/&gt;NGSI-LD&lt;br/&gt;port 8080]
MOS --&gt;|via Mosquitto| FRO FRO[FROST-Server&lt;br/&gt;SensorThings&lt;br/&gt;port 8080]
MOS --&gt; ORM end
BUN --&gt;|via BunkerM| ORI
BUN --&gt;|via BunkerM| STE subgraph Analytics[&quot;📈 Analytics &amp; Time-Series&quot;]
BUN --&gt;|via BunkerM| FRO QL[QuantumLeap&lt;br/&gt;NGSI-LD → CrateDB&lt;br/&gt;port 8668]
BUN --&gt; ORM CRATEDB[CrateDB&lt;br/&gt;PostgreSQL-compatible&lt;br/&gt;port 4200/5432]
UI --&gt; ORM end
ORM -.-&gt; KC
SIM --&gt; INF subgraph Storage[&quot;💾 Stockage &amp; Métriques&quot;]
ORI --&gt; GRA INF[InfluxDB&lt;br/&gt;Bucket: iot_data&lt;br/&gt;port 8086]
STE --&gt; GRA PRO[Prometheus&lt;br/&gt;Scrape: /metrics&lt;br/&gt;port 9090]
FRO --&gt; GRA GEO[GeoServer&lt;br/&gt;WMS/WFS/WMTS&lt;br/&gt;port 8080]
ORI -.-&gt; GEO end
STE -.-&gt; GEO
FRO -.-&gt; GEO subgraph IoT_Platform[&quot;🏢 Plateforme IoT&quot;]
GEO --&gt; MAP ORM[OpenRemote Manager&lt;br/&gt;MQTT Agent&lt;br/&gt;port 8080]
ORM --&gt; GRA KC[Keycloak&lt;br/&gt;port 8080]
EMQ -.-&gt; PRO end
ORI -.-&gt; PRO
STE -.-&gt; PRO subgraph VIZ[&quot;📊 Visualisation&quot;]
ORM -.-&gt; PRO</code></pre> GRA[Grafana&lt;br/&gt;Dashboards&lt;br/&gt;port 3001]
MAP[MapStore&lt;br/&gt;WMS/WFS&lt;br/&gt;port 8080]
end
%% ── Flux Simulateur ──────────────────────────────────────────
SIM --&gt;|&quot;1⃣ MQTT publish&lt;br/&gt;city/sensors/{type}/{id}&quot;| EMQ
SIM --&gt;|&quot;1⃣ MQTT publish&quot;| MOS
SIM --&gt;|&quot;1⃣ MQTT publish&quot;| BUN
SIM --&gt;|&quot;5⃣ InfluxDB v2 API&lt;br/&gt;async non-bloquant&quot;| INF
%% ── Flux MQTT → IoT Agent ──────────────────────────────────
EMQ --&gt;|&quot;MQTT subscribe&lt;br/&gt;city/sensors/#&quot;| IOTA
MOS --&gt;|&quot;MQTT subscribe&quot;| IOTA
BUN --&gt;|&quot;MQTT subscribe&quot;| IOTA
%% ── Flux IoT Agent → Context Brokers ───────────────────────
IOTA --&gt;|&quot;2⃣ NGSI-LD POST&lt;br/&gt;/ngsi-ld/v1/entities&quot;| ORI
IOTA --&gt;|&quot;2⃣ NGSI-LD POST&quot;| STE
%% ── Flux Context Brokers → QuantumLeap ───────────────────
ORI --&gt;|&quot;NGSI-LD Subscription&lt;br/&gt;→ QuantumLeap&quot;| QL
STE --&gt;|&quot;NGSI-LD Subscription&lt;br/&gt;→ QuantumLeap&quot;| QL
%% ── Flux QuantumLeap → CrateDB ────────────────────────────
QL --&gt;|&quot;Insert&lt;br/&gt;PostgreSQL wire&quot;| CRATEDB
%% ── Visualisation ───────────────────────────────────────────
CRATEDB --&gt;|&quot;PostgreSQL Datasource&quot;| GRA
INF --&gt;|&quot;Datasource Flux IoT&quot;| GRA
ORI --&gt;|&quot;NGSI-LD Datasource&quot;| GRA
STE --&gt;|&quot;NGSI-LD Datasource&quot;| GRA
GEO --&gt;|&quot;WMS/WMTS&quot;| MAP
ORM --&gt;|MapSettings&lt;br/&gt;Martinique| MAP
ORM --&gt;|&quot;Live assets&lt;br/&gt;REST&quot;| GRA
%% ── OpenRemote MQTT Agent ───────────────────────────────────
EMQ --&gt;|&quot;6⃣ Subscribe&lt;br/&gt;city/sensors/#&quot;| ORM
MOS --&gt;|&quot;6⃣ Subscribe&quot;| ORM
BUN --&gt;|&quot;6⃣ Subscribe&quot;| ORM
%% ── Métriques Prometheus ────────────────────────────────────
SIM --&gt;|&quot;7⃣ /metrics&lt;br/&gt;port 8001&quot;| PRO
EMQ --&gt;|&quot;/api/v5/metrics&quot;| PRO
STE --&gt;|&quot;/actuator/prometheus&quot;| PRO
INF --&gt;|&quot;/metrics&quot;| PRO
ORM --&gt;|&quot;/actuator/prometheus&quot;| PRO
GRA --&gt;|&quot;/metrics&quot;| PRO
IOTA --&gt;|&quot;/metrics&quot;| PRO
QL --&gt;|&quot;/metrics&quot;| PRO</code></pre>
<hr /> <hr />
<h2 id="description-des-flux">Description des flux</h2> <h2 id="flux-détaillés-mise-à-jour-06052026">Flux Détaillés (Mise à jour
<h3 id="génération-des-données-simulator">1. <strong>Génération des 06/05/2026)</h2>
données (Simulator)</strong></h3> <h3 id="flux-mqtt-brokers">1⃣ Flux MQTT — Brokers</h3>
<ul>
<li><strong>Smart City Simulator</strong> (Python) génère des données
pour 10 capteurs (Traffic, Air Quality, Parking, Noise, Weather,
Light)</li>
<li>Intervalle de publication : 10 secondes</li>
<li>Protocoles : MQTT (vers brokers uniquement)</li>
<li><strong>⚠️ Projet</strong> : Le simulateur nenvoie PAS directement
à OpenRemote (pas de REST API)</li>
</ul>
<h3 id="ingestion-mqtt-brokers">2. <strong>Ingestion MQTT
(Brokers)</strong></h3>
<ul>
<li><strong>EMQX</strong> (port 11883) : Broker public, reçoit tous les
capteurs</li>
<li><strong>Mosquitto</strong> (port 1883) : Via Traefik, accès
externe</li>
<li><strong>BunkerM</strong> (port 1900) : MQTTS (TLS), accès
sécurisé</li>
</ul>
<h3 id="context-brokers-ngsi-ld-sensorthings">3. <strong>Context Brokers
(NGSI-LD &amp; SensorThings)</strong></h3>
<ul>
<li><strong>Orion-LD</strong> : Reçoit les données au format NGSI-LD
<ul>
<li>10 entités (TrafficFlowObserved, AirQualityObserved, etc.)</li>
<li>Smart Data Models utilisés</li>
<li><strong>Provenance</strong> : Données via EMQX, Mosquitto et BunkerM
(voir étiquettes dans le diagramme)</li>
</ul></li>
<li><strong>Stellio</strong> : Alternative NGSI-LD
<ul>
<li>14 payloads entités</li>
<li>Contexte :
<code>https://uri.etsi.org/ngsi-ld/v1/ngsi-ld-core-context.jsonld</code></li>
<li><strong>Provenance</strong> : Données via EMQX, Mosquitto et
BunkerM</li>
</ul></li>
<li><strong>FROST-Server</strong> : SensorThings API
<ul>
<li>21 256+ observations</li>
<li>PostgreSQL + TimescaleDB</li>
<li><strong>Provenance</strong> : Données via EMQX, Mosquitto et
BunkerM</li>
</ul></li>
</ul>
<h3 id="plateforme-iot-openremote">4. <strong>Plateforme IoT
(OpenRemote)</strong></h3>
<ul>
<li><strong>OpenRemote Manager</strong> (realm <code>smartcity</code>)
<ul>
<li>33 assets IoT configurés</li>
<li>Carte Martinique (mapsettings.json)</li>
<li>Réception via <strong>MQTT Agent</strong> depuis les brokers (EMQX,
Mosquitto, BunkerM)</li>
<li>Peut aussi recevoir directement des capteurs IoT (via MQTT)</li>
</ul></li>
<li><strong>Keycloak</strong> : Authentification OpenID Connect
<ul>
<li>Client <code>openremote</code> avec Service Account</li>
<li>Token endpoint :
<code>/auth/realms/smartcity/protocol/openid-connect/token</code></li>
</ul></li>
</ul>
<h3 id="stockage-métriques">5. <strong>Stockage &amp;
Métriques</strong></h3>
<ul>
<li><strong>InfluxDB</strong> : Stockage temporel pour Grafana
<ul>
<li>Bucket : <code>iot_data</code></li>
<li>Datasource dans Grafana</li>
</ul></li>
<li><strong>Prometheus</strong> : Collecte des métriques
<ul>
<li>MQTT brokers, Context brokers, OpenRemote</li>
</ul></li>
<li><strong>GeoServer</strong> : Données géospatiales
<ul>
<li>PostGIS pour centralisation</li>
<li>WMS/WFS pour MapStore</li>
</ul></li>
</ul>
<h3 id="visualisation-analyse">6. <strong>Visualisation &amp;
Analyse</strong></h3>
<ul>
<li><strong>Grafana</strong> (port 3001)
<ul>
<li>Dashboard : <code>smartcity-martinique-2026</code></li>
<li>Datasources : InfluxDB, FROST, Orion-LD</li>
</ul></li>
<li><strong>MapStore</strong> : Cartographie
<ul>
<li>Sources WMS/WFS depuis GeoServer</li>
</ul></li>
<li><strong>OpenRemote UI</strong> : Manager Interface
<ul>
<li>Visualisation des assets realm Smart City</li>
</ul></li>
</ul>
<hr />
<h2 id="technologies-clés">Technologies clés</h2>
<table> <table>
<thead> <thead>
<tr> <tr>
<th>Broker</th>
<th>Port</th>
<th>Protocol</th>
<th>Topics</th>
</tr>
</thead>
<tbody>
<tr>
<td>EMQX</td>
<td>11883</td>
<td>MQTT</td>
<td><code>city/sensors/{type}/{id}</code></td>
</tr>
<tr>
<td>Mosquitto</td>
<td>1883</td>
<td>MQTT</td>
<td><code>city/sensors/{type}/{id}</code></td>
</tr>
<tr>
<td>BunkerM</td>
<td>1900</td>
<td>MQTTS (TLS)</td>
<td><code>city/sensors/{type}/{id}</code></td>
</tr>
</tbody>
</table>
<p>Le simulateur publie simultanément sur les 3 brokers vers <strong>IoT
Agent</strong>.</p>
<h3 id="flux-iot-agent-ngsi-ld">2⃣ Flux IoT Agent — NGSI-LD</h3>
<ul>
<li><p><strong>IoT Agent JSON</strong> : Réception MQTT → Transformation
en entités NGSI-LD</p></li>
<li><p><strong>Port</strong> : <code>4041</code></p></li>
<li><p><strong>Configuration</strong> :</p>
<div class="sourceCode" id="cb2"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="co"># Enregistrement service</span></span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-X</span> POST http://localhost:4041/iot/services <span class="dt">\</span></span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a> <span class="at">-H</span> <span class="st">&#39;Content-Type: application/json&#39;</span> <span class="dt">\</span></span>
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a> <span class="at">-H</span> <span class="st">&#39;fiware-service: smartcity&#39;</span> <span class="dt">\</span></span>
<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a> <span class="at">-d</span> <span class="st">&#39;{&quot;services&quot;: [{&quot;apikey&quot;: &quot;smartcity-api-key&quot;, &quot;cbroker&quot;: &quot;http://orion-ld:1026&quot;, &quot;entity_type&quot;: &quot;Device&quot;, &quot;ngsi_version&quot;: &quot;ld&quot;}]}&#39;</span></span></code></pre></div></li>
<li><p><strong>Entités créées dans</strong> : Orion-LD (port 1026) et
Stellio (port 8080)</p></li>
</ul>
<h3 id="flux-context-brokers-quantumleap-cratedb">3⃣ Flux Context
Brokers → QuantumLeap → CrateDB</h3>
<ol type="1">
<li><strong>Orion-LD</strong> / <strong>Stellio</strong> : Reçoivent les
entités NGSI-LD de IoT Agent</li>
<li><strong>QuantumLeap</strong> (port 8668) : Souscrit aux mises à jour
NGSI-LD via Subscription</li>
<li><strong>CrateDB</strong> (port 5432/4200) : Stockage temporel
PostgreSQL-compatible</li>
<li><strong>Grafana</strong> : Dashboards connectés à CrateDB
(PostgreSQL datasource)</li>
</ol>
<h3 id="flux-influxdb-temps-réel">4⃣ Flux InfluxDB — Temps Réel</h3>
<ul>
<li><strong>API</strong> :
<code>http://localhost:8086/api/v2/write</code></li>
<li><strong>Bucket</strong> : <code>iot_data</code></li>
<li><strong>Org</strong> : <code>digitribe</code></li>
<li><strong>Mode</strong> : Asynchrone (thread daemon) pour ne pas
bloquer le publish MQTT</li>
</ul>
<h3 id="openremote-mqtt-agent">5⃣ OpenRemote — MQTT Agent</h3>
<p>Lagent MQTT dOpenRemote souscrit aux topics
<code>city/sensors/#</code> sur les brokers MQTT. Les payloads sont
automatiquement parsés et les attributs des assets sont mis à jour.</p>
<h3 id="flux-prometheus-métriques">6⃣ Flux Prometheus — Métriques</h3>
<table>
<thead>
<tr>
<th>Service</th>
<th>Endpoint <code>/metrics</code></th>
<th>Statut</th>
</tr>
</thead>
<tbody>
<tr>
<td>Simulator</td>
<td><code>localhost:8001</code></td>
<td></td>
</tr>
<tr>
<td>EMQX</td>
<td><code>emqx_emqx_1:8081/api/v5/metrics</code></td>
<td></td>
</tr>
<tr>
<td>Stellio</td>
<td><code>stellio-api-gateway:8080/actuator/prometheus</code></td>
<td></td>
</tr>
<tr>
<td>InfluxDB</td>
<td><code>smart-city-influxdb:8086/metrics</code></td>
<td></td>
</tr>
<tr>
<td>OpenRemote</td>
<td><code>openremote-manager-1:8080/actuator/prometheus</code></td>
<td></td>
</tr>
<tr>
<td>Grafana</td>
<td><code>smart-city-grafana:3000/metrics</code></td>
<td></td>
</tr>
<tr>
<td>IoT Agent</td>
<td><code>iot-agent:4041/metrics</code></td>
<td>⚠️ À vérifier</td>
</tr>
<tr>
<td>QuantumLeap</td>
<td><code>quantum-leap:8668/metrics</code></td>
<td>⚠️ À vérifier</td>
</tr>
</tbody>
</table>
<hr />
<h2 id="nouveaux-composants-06052026">Nouveaux Composants
(06/05/2026)</h2>
<h3 id="iot-agent-json">🤖 IoT Agent JSON</h3>
<ul>
<li><strong>Rôle</strong> : Pont entre MQTT et NGSI-LD (Orion-LD /
Stellio)</li>
<li><strong>Port</strong> : 4041</li>
<li><strong>Statut</strong> : ❌ En cours de réparation (erreur
MongoDB)</li>
<li><strong>Correction</strong> : Fournir
<code>IOTA_MONGO_URL=mongodb://mongodb:27017/iotagent</code></li>
</ul>
<h3 id="quantumleap">📈 QuantumLeap</h3>
<ul>
<li><strong>Rôle</strong> : Analytics NGSI-LD → CrateDB</li>
<li><strong>Port</strong> : 8668</li>
<li><strong>Statut</strong> : ✅ Fonctionnel (interne), port non exposé
sur lhôte</li>
<li><strong>Action</strong> : Exposer le port dans docker-compose</li>
</ul>
<h3 id="cratedb">🗄️ CrateDB</h3>
<ul>
<li><strong>Rôle</strong> : Base de données temporelle
PostgreSQL-compatible</li>
<li><strong>Port</strong> : 4200 (UI), 5432 (PostgreSQL)</li>
<li><strong>Statut</strong> : ✅ Opérationnel</li>
<li><strong>Usage</strong> : Stockage des séries temporelles depuis
QuantumLeap</li>
</ul>
<hr />
<h2 id="tableau-récapitulatif-mise-à-jour">Tableau Récapitulatif (Mise à
jour)</h2>
<table>
<colgroup>
<col style="width: 28%" />
<col style="width: 34%" />
<col style="width: 15%" />
<col style="width: 21%" />
</colgroup>
<thead>
<tr>
<th>Composant</th> <th>Composant</th>
<th>Technologie</th> <th>Technologie</th>
<th>Port</th> <th>Port</th>
@@ -385,7 +275,7 @@ Analyse</strong></h3>
<tr> <tr>
<td>Simulator</td> <td>Simulator</td>
<td>Python + paho-mqtt</td> <td>Python + paho-mqtt</td>
<td>Interne</td> <td>Host:8001 (metrics)</td>
<td>✅ Actif</td> <td>✅ Actif</td>
</tr> </tr>
<tr> <tr>
@@ -395,6 +285,24 @@ Analyse</strong></h3>
<td>✅ Connecté</td> <td>✅ Connecté</td>
</tr> </tr>
<tr> <tr>
<td>Mosquitto</td>
<td>MQTT Broker</td>
<td>1883</td>
<td>✅ Connecté</td>
</tr>
<tr>
<td>BunkerM</td>
<td>MQTTS Broker</td>
<td>1900</td>
<td>✅ Connecté</td>
</tr>
<tr>
<td><strong>IoT Agent</strong></td>
<td><strong>NGSI-LD Bridge</strong></td>
<td><strong>4041</strong></td>
<td><strong>❌ Erreur MongoDB</strong></td>
</tr>
<tr>
<td>Orion-LD</td> <td>Orion-LD</td>
<td>NGSI-LD Broker</td> <td>NGSI-LD Broker</td>
<td>1026</td> <td>1026</td>
@@ -404,7 +312,7 @@ Analyse</strong></h3>
<td>Stellio</td> <td>Stellio</td>
<td>NGSI-LD Broker</td> <td>NGSI-LD Broker</td>
<td>8080</td> <td>8080</td>
<td>⚠️ À vérifier</td> <td>⚠️ Ports occupés par OpenRemote</td>
</tr> </tr>
<tr> <tr>
<td>FROST-Server</td> <td>FROST-Server</td>
@@ -413,6 +321,18 @@ Analyse</strong></h3>
<td>⚠️ À vérifier</td> <td>⚠️ À vérifier</td>
</tr> </tr>
<tr> <tr>
<td><strong>QuantumLeap</strong></td>
<td><strong>NGSI-LD → CrateDB</strong></td>
<td><strong>8668</strong></td>
<td><strong>✅ Interne</strong></td>
</tr>
<tr>
<td><strong>CrateDB</strong></td>
<td><strong>PostgreSQL Time-Series</strong></td>
<td><strong>4200/5432</strong></td>
<td><strong>✅ Opérationnel</strong></td>
</tr>
<tr>
<td>OpenRemote</td> <td>OpenRemote</td>
<td>IoT Platform</td> <td>IoT Platform</td>
<td>8080</td> <td>8080</td>
@@ -422,44 +342,67 @@ Analyse</strong></h3>
<td>InfluxDB</td> <td>InfluxDB</td>
<td>Time Series DB</td> <td>Time Series DB</td>
<td>8086</td> <td>8086</td>
<td>Configuré</td> <td>Bucket iot_data</td>
</tr> </tr>
<tr> <tr>
<td>Grafana</td> <td>Grafana</td>
<td>Visualization</td> <td>Visualisation</td>
<td>3001</td> <td>3001</td>
<td>✅ Dashboard créé</td> <td>✅ Dashboards + CrateDB</td>
</tr> </tr>
<tr> <tr>
<td>GeoServer</td> <td>GeoServer</td>
<td>GeoServer</td> <td>Geo Data</td>
<td>8080</td> <td>8080</td>
<td>⚠️ À intégrer</td> <td>✅ REST OK</td>
</tr> </tr>
<tr> <tr>
<td>Prometheus</td> <td>MapStore</td>
<td>Metrics</td> <td>Cartographie</td>
<td>9090</td> <td>8080</td>
<td>En cours</td> <td>WMS/WMTS</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<hr /> <hr />
<h2 id="fichiers-associés">Fichiers associés</h2> <h2 id="actions-prioritaires">Actions Prioritaires</h2>
<ul> <ol type="1">
<li><strong>Simulator</strong> : <li><strong>Corriger IoT Agent</strong> : Ajouter MongoDB et configurer
<code>~/smart-city-digital-twin-martinique/simulator.py</code></li> <code>IOTA_MONGO_URL</code></li>
<li><strong>Dashboard Grafana</strong> : <li><strong>Exposer QuantumLeap</strong> : Mapper le port 8668 dans
<code>~/smart-city-digital-twin-martinique/grafana_dashboard_smartcity.json</code></li> docker-compose</li>
<li><strong>Ce diagramme</strong> : <li><strong>Déployer Orion-LD</strong> : Créer le service sil nexiste
<code>~/smart-city-digital-twin-martinique/data-flow-diagram.md</code></li> pas</li>
<li><strong>Session Resume</strong> : <li><strong>Libérer les ports</strong> : Résoudre le conflit
<code>~/smart-city-digital-twin-martinique/session_resume_2026-05-04.md</code></li> Stellio/OpenRemote sur le port 8080</li>
</ul> <li><strong>Configurer CrateDB</strong> : Créer les tables pour
QuantumLeap</li>
<li><strong>Mettre à jour le simulateur</strong> :
<code>ENABLE_PULSAR=false</code> (recommandé)</li>
</ol>
<hr /> <hr />
<p><strong>Dernière mise à jour :</strong> 04 Mai 2026<br /> <h2 id="commandes-utiles">Commandes Utiles</h2>
<strong>Projet :</strong> Smart City Digital Twin Martinique<br /> <div class="sourceCode" id="cb3"><pre
<strong>URL Grafana :</strong> class="sourceCode bash"><code class="sourceCode bash"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="co"># Vérifier IoT Agent</span></span>
http://localhost:3001/d/smartcity-martinique-2026</p> <span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-s</span> http://localhost:4041/iot/services <span class="at">-H</span> <span class="st">&#39;fiware-service: smartcity&#39;</span></span>
</body> <span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a></span>
</html> <span id="cb3-4"><a href="#cb3-4" aria-hidden="true" tabindex="-1"></a><span class="co"># Vérifier QuantumLeap</span></span>
<span id="cb3-5"><a href="#cb3-5" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-s</span> http://localhost:8668/version</span>
<span id="cb3-6"><a href="#cb3-6" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-7"><a href="#cb3-7" aria-hidden="true" tabindex="-1"></a><span class="co"># Vérifier CrateDB</span></span>
<span id="cb3-8"><a href="#cb3-8" aria-hidden="true" tabindex="-1"></a><span class="ex">psql</span> <span class="at">-h</span> localhost <span class="at">-p</span> 5432 <span class="at">-U</span> crate <span class="at">-c</span> <span class="st">&quot;SELECT * FROM ql_entities LIMIT 5;&quot;</span></span>
<span id="cb3-9"><a href="#cb3-9" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-10"><a href="#cb3-10" aria-hidden="true" tabindex="-1"></a><span class="co"># Vérifier Orion-LD</span></span>
<span id="cb3-11"><a href="#cb3-11" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-s</span> http://localhost:1026/version</span>
<span id="cb3-12"><a href="#cb3-12" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-13"><a href="#cb3-13" aria-hidden="true" tabindex="-1"></a><span class="co"># Voir les logs IoT Agent</span></span>
<span id="cb3-14"><a href="#cb3-14" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> logs smart-city-iot-agent <span class="at">--tail</span> 30</span></code></pre></div>
<hr />
<p><strong>Fichiers associés :</strong> - Simulateur :
<code>~/smart-city-digital-twin-martinique/simulator.py</code> -
Dashboard Grafana :
<code>~/smart-city-digital-twin-martinique/grafana_dashboard_smartcity.json</code>
- Ce diagramme :
<code>~/smart-city-digital-twin-martinique/data-flow-diagram.md</code> -
Session Resume :
<code>~/smart-city-digital-twin-martinique/session_resume_2026-05-07.md</code></p>

View File

@@ -1,11 +1,12 @@
# Smart City Digital Twin Martinique — Diagramme des Flux de Données # Smart City Digital Twin Martinique — Diagramme des Flux de Données
**Dernière mise à jour :** 05 Mai 2026 **Dernière mise à jour :** 06 Mai 2026
**Projet :** Smart City Digital Twin Martinique **Projet :** Smart City Digital Twin Martinique
**Architecture :** IoT-Agent intégré, QuantumLeap + CrateDB pour l'analyse avancée
--- ---
## Architecture Globale ## Architecture Globale (Mise à jour 06/05/2026)
```mermaid ```mermaid
graph TB graph TB
@@ -19,17 +20,21 @@ graph TB
BUN[BunkerM<br/>port 1900<br/>MQTTS/TLS] BUN[BunkerM<br/>port 1900<br/>MQTTS/TLS]
end end
subgraph Stream["⚡ Event Streaming"] subgraph IoT_Agent["🤖 IoT Agent (NGSI-LD)"]
PUL[Pulsar<br/>port 6650<br/>Topics: smartcity-*] IOTA[IoT Agent JSON<br/>port 4041<br/>Transforme MQTT → NGSI-LD]
RED[Redpanda<br/>port 8082 REST<br/>Topics: traffic, air-quality, ...]
end end
subgraph CB["🔗 Context Brokers"] subgraph CB["🔗 Context Brokers (NGSI-LD)"]
ORI[Orion-LD<br/>NGSI-LD<br/>port 1026] ORI[Orion-LD<br/>NGSI-LD<br/>port 1026]
STE[Stellio<br/>NGSI-LD<br/>port 8080] STE[Stellio<br/>NGSI-LD<br/>port 8080]
FRO[FROST-Server<br/>SensorThings<br/>port 8080] FRO[FROST-Server<br/>SensorThings<br/>port 8080]
end end
subgraph Analytics["📈 Analytics & Time-Series"]
QL[QuantumLeap<br/>NGSI-LD → CrateDB<br/>port 8668]
CRATEDB[CrateDB<br/>PostgreSQL-compatible<br/>port 4200/5432]
end
subgraph Storage["💾 Stockage & Métriques"] subgraph Storage["💾 Stockage & Métriques"]
INF[InfluxDB<br/>Bucket: iot_data<br/>port 8086] INF[InfluxDB<br/>Bucket: iot_data<br/>port 8086]
PRO[Prometheus<br/>Scrape: /metrics<br/>port 9090] PRO[Prometheus<br/>Scrape: /metrics<br/>port 9090]
@@ -42,139 +47,135 @@ graph TB
end end
subgraph VIZ["📊 Visualisation"] subgraph VIZ["📊 Visualisation"]
GRA[Grafana<br/>Dashboards<br/>port 3000] GRA[Grafana<br/>Dashboards<br/>port 3001]
MAP[MapStore<br/>WMS/WFS<br/>port 8080] MAP[MapStore<br/>WMS/WFS<br/>port 8080]
end end
subgraph Distribution["🔄 Distribution Service"] %% ── Flux Simulateur ──────────────────────────────────────────
DIST[Pulsar Distribution<br/>Pulsar → Brokers]
end
subgraph Consumer["📥 Redpanda Consumer"]
RCONS[Redpanda → InfluxDB<br/>REST → InfluxDB]
end
%% ── Flux Simulateur ──────────────────────────────────────────────────
SIM -->|"1⃣ MQTT publish<br/>city/sensors/{type}/{id}"| EMQ SIM -->|"1⃣ MQTT publish<br/>city/sensors/{type}/{id}"| EMQ
SIM -->|"1⃣ MQTT publish"| MOS SIM -->|"1⃣ MQTT publish"| MOS
SIM -->|"1⃣ MQTT publish"| BUN SIM -->|"1⃣ MQTT publish"| BUN
SIM -->|"2⃣ HTTP POST<br/>NGSI-LD"| ORI
SIM -->|"2⃣ HTTP POST<br/>NGSI-LD"| STE
SIM -->|"2⃣ HTTP POST<br/>SensorThings"| FRO
SIM -->|"3⃣ Pulsar client<br/>pulsar://localhost:6650"| PUL
SIM -->|"4⃣ HTTP REST Proxy<br/>localhost:8082/topics/"| RED
SIM -->|"5⃣ InfluxDB v2 API<br/>async non-bloquant"| INF SIM -->|"5⃣ InfluxDB v2 API<br/>async non-bloquant"| INF
%% ── Flux Distribution (Pulsar → Brokers) ────────────────────────────── %% ── Flux MQTT → IoT Agent ──────────────────────────────────
PUL -->|"Consomme<br/>smartcity-*"| DIST EMQ -->|"MQTT subscribe<br/>city/sensors/#"| IOTA
DIST -->|"Republish<br/>MQTT"| EMQ MOS -->|"MQTT subscribe"| IOTA
DIST -->|"Republish<br/>MQTT"| MOS BUN -->|"MQTT subscribe"| IOTA
DIST -->|"Republish<br/>NGSI-LD"| ORI
DIST -->|"Republish<br/>NGSI-LD"| STE
DIST -->|"Republish<br/>SensorThings"| FRO
%% ── Flux Redpanda → InfluxDB ────────────────────────────────────────── %% ── Flux IoT Agent → Context Brokers ───────────────────────
RED -->|"REST poll<br/>topics/{name}/offsets"| RCONS IOTA -->|"2⃣ NGSI-LD POST<br/>/ngsi-ld/v1/entities"| ORI
RCONS -->|"Line Protocol<br/>Write API"| INF IOTA -->|"2⃣ NGSI-LD POST"| STE
%% ── OpenRemote MQTT Agent ────────────────────────────────────────────── %% ── Flux Context Brokers → QuantumLeap ───────────────────
ORI -->|"NGSI-LD Subscription<br/>→ QuantumLeap"| QL
STE -->|"NGSI-LD Subscription<br/>→ QuantumLeap"| QL
%% ── Flux QuantumLeap → CrateDB ────────────────────────────
QL -->|"Insert<br/>PostgreSQL wire"| CRATEDB
%% ── Visualisation ───────────────────────────────────────────
CRATEDB -->|"PostgreSQL Datasource"| GRA
INF -->|"Datasource Flux IoT"| GRA
ORI -->|"NGSI-LD Datasource"| GRA
STE -->|"NGSI-LD Datasource"| GRA
GEO -->|"WMS/WMTS"| MAP
ORM -->|MapSettings<br/>Martinique| MAP
ORM -->|"Live assets<br/>REST"| GRA
%% ── OpenRemote MQTT Agent ───────────────────────────────────
EMQ -->|"6⃣ Subscribe<br/>city/sensors/#"| ORM EMQ -->|"6⃣ Subscribe<br/>city/sensors/#"| ORM
MOS -->|"6⃣ Subscribe"| ORM MOS -->|"6⃣ Subscribe"| ORM
BUN -->|"6⃣ Subscribe"| ORM BUN -->|"6⃣ Subscribe"| ORM
%% ── Métriques Prometheus ──────────────────────────────────────────────── %% ── Métriques Prometheus ────────────────────────────────────
SIM -->|"7⃣ /metrics<br/>port 8001"| PRO SIM -->|"7⃣ /metrics<br/>port 8001"| PRO
EMQ -->|"/api/v5/metrics"| PRO EMQ -->|"/api/v5/metrics"| PRO
STE -->|"/actuator/prometheus"| PRO STE -->|"/actuator/prometheus"| PRO
FRO -->|"/metrics"| PRO
INF -->|"/metrics"| PRO INF -->|"/metrics"| PRO
RED -->|"/public_metrics"| PRO
ORM -->|"/actuator/prometheus"| PRO ORM -->|"/actuator/prometheus"| PRO
GRA -->|"/metrics"| PRO GRA -->|"/metrics"| PRO
IOTA -->|"/metrics"| PRO
%% ── Visualisation ───────────────────────────────────────────────────── QL -->|"/metrics"| PRO
INF -->|"Datasources<br/>Flux IoT"| GRA
ORI -->|"NGSI-LD<br/>Datasource"| GRA
STE -->|"NGSI-LD<br/>Datasource"| GRA
FRO -->|"SensorThings<br/>Datasource"| GRA
GEO -->|"WMS/WMTS"| MAP
ORM -->|MapSettings<br/>Martinique| MAP
ORM -->|"Live assets<br/>REST"| GRA
``` ```
--- ---
## Flux Détaillés ## Flux Détaillés (Mise à jour 06/05/2026)
### 1⃣ Flux MQTT — Brokers ### 1⃣ Flux MQTT — Brokers
| Broker | Port | Protocol | Topics | | Broker | Port | Protocol | Topics |
|--------|------|----------|--------| |--------|------|----------|--------|
| EMQX | 11883 | MQTT | `city/sensors/{type}/{id}` | | EMQX | 11883 | MQTT | `city/sensors/{type}/{id}` |
| Mosquitto | 1883 | MQTT | `city/sensors/{type}/{id}` | | Mosquitto | 1883 | MQTT | `city/sensors/{type}/{id}` |
| BunkerM | 1900 | MQTTS (TLS) | `city/sensors/{type}/{id}` | | BunkerM | 1900 | MQTTS (TLS) | `city/sensors/{type}/{id}` |
Le simulateur publie simultanément sur les 3 brokers. Le simulateur publie simultanément sur les 3 brokers vers **IoT Agent**.
### 2⃣ Flux HTTP REST — Context Brokers ### 2⃣ Flux IoT Agent — NGSI-LD
- **IoT Agent JSON** : Réception MQTT → Transformation en entités NGSI-LD
- **Port** : `4041`
- **Configuration** :
```bash
# Enregistrement service
curl -X POST http://localhost:4041/iot/services \
-H 'Content-Type: application/json' \
-H 'fiware-service: smartcity' \
-d '{"services": [{"apikey": "smartcity-api-key", "cbroker": "http://orion-ld:1026", "entity_type": "Device", "ngsi_version": "ld"}]}'
```
- **Entités créées dans** : Orion-LD (port 1026) et Stellio (port 8080)
| Broker | Format | Port | Topics | ### 3⃣ Flux Context Brokers → QuantumLeap → CrateDB
|--------|--------|------|--------| 1. **Orion-LD** / **Stellio** : Reçoivent les entités NGSI-LD de IoT Agent
| Orion-LD | NGSI-LD | 1026 | Entités par type | 2. **QuantumLeap** (port 8668) : Souscrit aux mises à jour NGSI-LD via Subscription
| Stellio | NGSI-LD | 8080 | Entités par type | 3. **CrateDB** (port 5432/4200) : Stockage temporel PostgreSQL-compatible
| FROST-Server | SensorThings | 8080 | Things → Datastreams → Observations | 4. **Grafana** : Dashboards connectés à CrateDB (PostgreSQL datasource)
### 3⃣ Flux Pulsar — Event Streaming
- **Topics** : `persistent://public/default/smartcity-traffic`, `smartcity-airquality`, `smartcity-parking`, `smartcity-noise`, `smartcity-weather`, `smartcity-light`
- **Port binaire** : `6650` (connectable depuis le host)
- **Distribution** : Le service `pulsar-distribution` consomme ces topics et republie vers les brokers MQTT et context brokers
### 4⃣ Flux Redpanda — Kafka-compatible REST
- **REST Proxy** : `http://localhost:8082`
- **Topics** : `traffic`, `air-quality`, `parking`, `noise`, `weather`, `air-quality`
- **Payload** : Base64(JSON) dans `{"records": [{"value": "<base64>"}]}`
- **Consumer** : `redpanda/consumer.py` — poll toutes les 10s et écrit dans InfluxDB
### 5⃣ Flux InfluxDB — Temps Réel
### 4⃣ Flux InfluxDB — Temps Réel
- **API** : `http://localhost:8086/api/v2/write` - **API** : `http://localhost:8086/api/v2/write`
- **Bucket** : `iot_data` - **Bucket** : `iot_data`
- **Org** : `digitribe` - **Org** : `digitribe`
- **Mode** : Asynchrone (thread daemon) pour ne pas bloquer le publish MQTT - **Mode** : Asynchrone (thread daemon) pour ne pas bloquer le publish MQTT
### 6️⃣ OpenRemote — MQTT Agent ### 5️⃣ OpenRemote — MQTT Agent
L'agent MQTT d'OpenRemote souscrit aux topics `city/sensors/#` sur les brokers MQTT. Les payloads sont automatiquement parsés et les attributs des assets sont mis à jour.
L'agent MQTT d'OpenRemote souscrit aux topics `city/sensors/#` sur les brokers MQTT (EMQX, Mosquitto, BunkerM). Les payloads sont automatiquement parsés et les attributs des assets sont mis à jour. ### 6⃣ Flux Prometheus — Métriques
| Service | Endpoint `/metrics` | Statut |
**Configuration via Manager UI** (`https://openremote.digitribe.fr/manager/`) :
1. Se connecter avec `admin/Digitribe972`
2. Choisir le realm `smartcity`
3. **Assets → Agents → + Add Agent**
4. Type : **MQTT Agent**
5. Configurer :
- **MQTT Broker URI** : `tcp://emqx_emqx_1:1883` (réseau smartcity-shared)
- **Topic Filter** : `city/sensors/#`
- **QoS** : 1
- **Enabled** : ✅
### 7⃣ Flux Prometheus — Métriques
| Service | Endpoint `/metrics` | Scrape |
|---------|---------------------|--------| |---------|---------------------|--------|
| Simulator | `localhost:8001` | ✅ | | Simulator | `localhost:8001` | ✅ |
| EMQX | `emqx_emqx_1:8081/api/v5/metrics` | ✅ | | EMQX | `emqx_emqx_1:8081/api/v5/metrics` | ✅ |
| Stellio | `stellio-api-gateway:8080/actuator/prometheus` | ✅ | | Stellio | `stellio-api-gateway:8080/actuator/prometheus` | ✅ |
| FROST | `frost_http-web-1:8080/metrics` | ✅ |
| InfluxDB | `smart-city-influxdb:8086/metrics` | ✅ | | InfluxDB | `smart-city-influxdb:8086/metrics` | ✅ |
| Redpanda | `smart-city-redpanda-console:8080/public_metrics` | ✅ |
| OpenRemote | `openremote-manager-1:8080/actuator/prometheus` | ✅ | | OpenRemote | `openremote-manager-1:8080/actuator/prometheus` | ✅ |
| Grafana | `smart-city-grafana:3000/metrics` | ✅ | | Grafana | `smart-city-grafana:3000/metrics` | ✅ |
| IoT Agent | `iot-agent:4041/metrics` | ⚠️ À vérifier |
| QuantumLeap | `quantum-leap:8668/metrics` | ⚠️ À vérifier |
--- ---
## Tableau Récapitulatif ## Nouveaux Composants (06/05/2026)
### 🤖 IoT Agent JSON
- **Rôle** : Pont entre MQTT et NGSI-LD (Orion-LD / Stellio)
- **Port** : 4041
- **Statut** : ❌ En cours de réparation (erreur MongoDB)
- **Correction** : Fournir `IOTA_MONGO_URL=mongodb://mongodb:27017/iotagent`
### 📈 QuantumLeap
- **Rôle** : Analytics NGSI-LD → CrateDB
- **Port** : 8668
- **Statut** : ✅ Fonctionnel (interne), port non exposé sur l'hôte
- **Action** : Exposer le port dans docker-compose
### 🗄️ CrateDB
- **Rôle** : Base de données temporelle PostgreSQL-compatible
- **Port** : 4200 (UI), 5432 (PostgreSQL)
- **Statut** : ✅ Opérationnel
- **Usage** : Stockage des séries temporelles depuis QuantumLeap
---
## Tableau Récapitulatif (Mise à jour)
| Composant | Technologie | Port | Statut | | Composant | Technologie | Port | Statut |
|-----------|-------------|------|--------| |-----------|-------------|------|--------|
@@ -182,42 +183,54 @@ L'agent MQTT d'OpenRemote souscrit aux topics `city/sensors/#` sur les brokers M
| EMQX | MQTT Broker | 11883 | ✅ Connecté | | EMQX | MQTT Broker | 11883 | ✅ Connecté |
| Mosquitto | MQTT Broker | 1883 | ✅ Connecté | | Mosquitto | MQTT Broker | 1883 | ✅ Connecté |
| BunkerM | MQTTS Broker | 1900 | ✅ Connecté | | BunkerM | MQTTS Broker | 1900 | ✅ Connecté |
| Orion-LD | NGSI-LD Broker | 1026 | ✅ Données | | **IoT Agent** | **NGSI-LD Bridge** | **4041** | **❌ Erreur MongoDB** |
| Stellio | NGSI-LD Broker | 8080 | ✅ Données | | Orion-LD | NGSI-LD Broker | 1026 | ⚠️ À vérifier |
| FROST-Server | SensorThings API | 8080 | ✅ Données | | Stellio | NGSI-LD Broker | 8080 | ⚠️ Ports occupés par OpenRemote |
| OpenRemote | IoT Platform | 8080 | ✅ UI OK | | FROST-Server | SensorThings API | 8080 | ⚠️ À vérifier |
| **QuantumLeap** | **NGSI-LD → CrateDB** | **8668** | **✅ Interne** |
| **CrateDB** | **PostgreSQL Time-Series** | **4200/5432** | **✅ Opérationnel** |
| OpenRemote | IoT Platform | 8080 | ⚠️ 403 (Service Account) |
| InfluxDB | Time Series DB | 8086 | ✅ Bucket iot_data | | InfluxDB | Time Series DB | 8086 | ✅ Bucket iot_data |
| Redpanda | Kafka-compatible | 8082 REST | ✅ Topics actifs | | Grafana | Visualisation | 3001 | ✅ Dashboards + CrateDB |
| Pulsar | Event Streaming | 6650 | ✅ Connecté |
| Prometheus | Metrics | 9090 (conf) | ⏳ Container arrêté |
| Grafana | Visualisation | 3000 | ✅ Dashboards |
| GeoServer | Geo Data | 8080 | ✅ REST OK | | GeoServer | Geo Data | 8080 | ✅ REST OK |
| MapStore | Cartographie | 8080 | ✅ WMS/WMTS | | MapStore | Cartographie | 8080 | ✅ WMS/WMTS |
--- ---
## Actions Prioritaires
1. **Corriger IoT Agent** : Ajouter MongoDB et configurer `IOTA_MONGO_URL`
2. **Exposer QuantumLeap** : Mapper le port 8668 dans docker-compose
3. **Déployer Orion-LD** : Créer le service s'il n'existe pas
4. **Libérer les ports** : Résoudre le conflit Stellio/OpenRemote sur le port 8080
5. **Configurer CrateDB** : Créer les tables pour QuantumLeap
6. **Mettre à jour le simulateur** : `ENABLE_PULSAR=false` (recommandé)
---
## Commandes Utiles ## Commandes Utiles
```bash ```bash
# Redémarrer le service de distribution Pulsar # Vérifier IoT Agent
cd ~/smart-city-digital-twin-martinique curl -s http://localhost:4041/iot/services -H 'fiware-service: smartcity'
docker build -t smart-city-pulsar-distribution:latest -f pulsar/Dockerfile pulsar/
docker compose -f docker-compose.yml -f docker-compose.distribution.yml up -d pulsar-distribution
# Redémarrer Prometheus (prometheus-brokers) # Vérifier QuantumLeap
cd ~/smart-city-digital-twin-martinique curl -s http://localhost:8668/version
docker compose up -d prometheus-brokers
# Lancer le consumer Redpanda (host) # Vérifier CrateDB
cd ~/smart-city-digital-twin-martinique psql -h localhost -p 5432 -U crate -c "SELECT * FROM ql_entities LIMIT 5;"
python3 redpanda/consumer.py
# Vérifier les topics Redpanda # Vérifier Orion-LD
curl -s http://localhost:8082/topics curl -s http://localhost:1026/version
# Vérifier les métriques simulator # Voir les logs IoT Agent
curl -s http://localhost:8001/metrics | grep "^simulator_" docker logs smart-city-iot-agent --tail 30
# Logs distribution service
docker logs -f smart-city-pulsar-distribution
``` ```
---
**Fichiers associés :**
- Simulateur : `~/smart-city-digital-twin-martinique/simulator.py`
- Dashboard Grafana : `~/smart-city-digital-twin-martinique/grafana_dashboard_smartcity.json`
- Ce diagramme : `~/smart-city-digital-twin-martinique/data-flow-diagram.md`
- Session Resume : `~/smart-city-digital-twin-martinique/session_resume_2026-05-07.md`

View File

@@ -0,0 +1,40 @@
version: '3.8'
networks:
traefik-public:
external: true
smartcity-shared:
external: true
services:
iot-agent-ui-bff:
container_name: smart-city-iot-agent-ui-bff
build: /home/eric/fiware/iotagent-ui/iotagent-ui-bff
restart: unless-stopped
environment:
- KEYCLOAK_URL=
- KEYCLOAK_REALM=
- KEYCLOAK_CLIENT_ID=
- KEYCLOAK_AUTHORIZED_ROLE=
- BFF_API_BASE_URL=http://smart-city-iot-agent-ui-bff:9000/api/v1
networks:
- smartcity-shared
ports:
- "9000:9000"
iot-agent-ui-spa:
container_name: smart-city-iot-agent-ui-spa
build: /home/eric/fiware/iotagent-ui/iotagent-ui-spa
restart: unless-stopped
environment:
- BFF_API_BASE_URL=http://smart-city-iot-agent-ui-bff:9000/api/v1
- APP_BASE_HREF=/
networks:
- smartcity-shared
- traefik-public
labels:
- "traefik.enable=true"
- "traefik.http.routers.iot-agent-ui.rule=Host(`iot-agent-ui.digitribe.fr`)"
- "traefik.http.routers.iot-agent-ui.entrypoints=websecure"
- "traefik.http.routers.iot-agent-ui.tls=true"
- "traefik.http.services.iot-agent-ui.loadbalancer.server.port=80"

View File

@@ -0,0 +1,42 @@
version: '3.8'
networks:
traefik-public:
external: true
smartcity-shared:
external: true
services:
iot-agent:
container_name: smart-city-iot-agent
image: fiware/iotagent-json:latest
restart: unless-stopped
environment:
- IOTA_CB_HOST=fiware-gis-quickstart-orion-1
- IOTA_CB_PORT=1026
- IOTA_NORTH_PORT=4041
- IOTA_REGISTRY_TYPE=mongodb
- IOTA_MONGO_URL=mongodb://smart-city-mongodb:27017/iotagent
- IOTA_PROVIDER_URL=http://smart-city-iot-agent:4041
- IOTA_CB_NGSI_VERSION=ld
networks:
- smartcity-shared
- traefik-public
labels:
- "traefik.enable=true"
- "traefik.http.routers.iot-agent.rule=Host(`iot-agent.digitribe.fr`)"
- "traefik.http.routers.iot-agent.entrypoints=websecure"
- "traefik.http.routers.iot-agent.tls=true"
- "traefik.http.services.iot-agent.loadbalancer.server.port=4041"
iot-agent-mongodb:
container_name: smart-city-mongodb
image: mongo:4.4
restart: unless-stopped
networks:
- smartcity-shared
volumes:
- mongodb-data:/data/db
volumes:
mongodb-data:

60
docker-compose.loki.yml Normal file
View File

@@ -0,0 +1,60 @@
# Loki Stack — Smart City Digital Twin Martinique
# Usage: docker compose -f docker-compose.yml -f docker-compose.loki.yml up -d
# Uses default Loki config (local-config.yaml inside image)
networks:
smartcity-shared:
external: true
traefik-public:
external: true
volumes:
loki_data:
external: false
name: smart-city_loki_data
promtail_data:
external: false
name: smart-city_promtail_data
services:
# Loki — Log storage and query engine (default config)
loki:
image: grafana/loki:latest
container_name: smart-city-loki
networks:
- smartcity-shared
- traefik-public
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
volumes:
- loki_data:/loki
restart: unless-stopped
labels:
- "traefik.enable=true"
- "traefik.http.routers.loki.rule=Host(`loki.digitribe.fr`)"
- "traefik.http.routers.loki.entrypoints=websecure"
- "traefik.http.routers.loki.tls.certresolver=letsencrypt"
- "traefik.http.services.loki.loadbalancer.server.port=3100"
# Promtail — Log collector (scrapes Docker logs)
promtail:
image: grafana/promtail:latest
container_name: smart-city-promtail
networks:
- smartcity-shared
- traefik-public
command: -config.file=/etc/promtail/config.yml
volumes:
- /var/log:/var/log:ro
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./promtail-config.yml:/etc/promtail/config.yml:ro
- promtail_data:/tmp/promtail
restart: unless-stopped
labels:
- "traefik.enable=true"
- "traefik.http.routers.promtail.rule=Host(`promtail.digitribe.fr`)"
- "traefik.http.routers.promtail.entrypoints=websecure"
- "traefik.http.routers.promtail.tls.certresolver=letsencrypt"
- "traefik.http.services.promtail.loadbalancer.server.port=9080"

View File

@@ -0,0 +1,39 @@
# Prometheus Brokers — Smart City Digital Twin Martinique
# Usage: docker compose -f docker-compose.yml -f docker-compose.prometheus.yml up -d
# Scrapes metrics from MQTT brokers, Kafka, Context Brokers, and simulators
networks:
smartcity-shared:
external: true
traefik-public:
external: true
services:
prometheus-brokers:
image: prom/prometheus:latest
container_name: smart-city-prometheus-brokers
networks:
- smartcity-shared
- traefik-public
ports:
- "9090:9090"
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/usr/share/prometheus/console_libraries'
- '--web.console.templates=/usr/share/prometheus/consoles'
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus_brokers_data:/prometheus
restart: unless-stopped
labels:
- "traefik.enable=true"
- "traefik.http.routers.prometheus-brokers.rule=Host(`prometheus-brokers.digitribe.fr`)"
- "traefik.http.routers.prometheus-brokers.entrypoints=websecure"
- "traefik.http.routers.prometheus-brokers.tls.certresolver=letsencrypt"
- "traefik.http.services.prometheus-brokers.loadbalancer.server.port=9090"
volumes:
prometheus_brokers_data:
external: false
name: smart-city_prometheus_brokers_data

View File

@@ -0,0 +1,46 @@
version: '3.8'
networks:
traefik-public:
external: true
smartcity-shared:
external: true
services:
cratedb:
container_name: smart-city-cratedb
image: crate:5.5
restart: unless-stopped
environment:
- CRATE_HEAP_SIZE=1g
volumes:
- cratedb-data:/data
networks:
- smartcity-shared
ports:
- "4200:4200"
- "5432:5432"
quantumleap:
container_name: smart-city-quantumleap
image: fiware/quantum-leap:latest
restart: unless-stopped
environment:
- QL_CRATEDB_HOST=smart-city-cratedb
- QL_CRATEDB_PORT=5432
- QL_CRATEDB_DB_NAME=quantumleap
- QL_LOG_LEVEL=INFO
depends_on:
- cratedb
networks:
- smartcity-shared
- traefik-public
labels:
- "traefik.enable=true"
- "traefik.http.routers.quantumleap.rule=Host(`quantum-leap.digitribe.fr`)"
- "traefik.http.routers.quantumleap.entrypoints=websecure"
- "traefik.http.routers.quantumleap.tls=true"
- "traefik.http.services.quantumleap.loadbalancer.server.port=5000"
volumes:
cratedb-data:

View File

@@ -0,0 +1,18 @@
version: '3.8'
networks:
traefik-public:
external: true
smartcity-shared:
external: true
services:
telegraf-mqtt:
container_name: smart-city-telegraf
image: telegraf:1.28
restart: unless-stopped
volumes:
- /home/eric/smart-city-digital-twin-martinique/telegraf.conf:/etc/telegraf/telegraf.conf:ro
networks:
- smartcity-shared
# depends_on removed - InfluxDB is external

View File

@@ -19,14 +19,14 @@ services:
- smartcity-shared - smartcity-shared
- traefik-public - traefik-public
environment: environment:
# MQTT Brokers (Disabled - using Pulsar distribution) # MQTT Brokers
- ENABLE_EMQX=false - ENABLE_EMQX=true
- ENABLE_MOSQUITTO=false - ENABLE_MOSQUITTO=true
- ENABLE_BUNKER=false - ENABLE_BUNKER=true
# Context Brokers (Disabled - using Pulsar distribution) # Context Brokers
- ENABLE_ORION=false - ENABLE_ORION=true
- ENABLE_STELLIO=false - ENABLE_STELLIO=true
- ENABLE_FROST=true # Temporaire: test direct pour Grafana - ENABLE_FROST=true
# Databases # Databases
- ENABLE_INFLUX=true - ENABLE_INFLUX=true
- INFLUX_URL=http://smart-city-influxdb:8086 - INFLUX_URL=http://smart-city-influxdb:8086

41
loki-config.yml Normal file
View File

@@ -0,0 +1,41 @@
auth_enabled: false
server:
http_listen_port: 3100
common:
path_prefix: /loki
storage:
filesystem:
chunks_directory: /loki/chunks
rules_directory: /loki/rules
replication_factor: 1
ring:
kvstore:
store: inmemory
schema_config:
configs:
- from: 2020-10-24
store: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
storage_config:
boltdb_shipper:
active_index_directory: /loki/index
cache_location: /loki/boltdb-cache
shared_store: filesystem
filesystem:
directory: /loki/chunks
compactor:
working_directory: /loki/compactor
shared_store: filesystem
limits_config:
reject_old_samples: true
reject_old_samples_max_age: 168h

38
promtail-config.yml Normal file
View File

@@ -0,0 +1,38 @@
# Promtail configuration — Smart City Digital Twin
# Collects Docker logs and sends to Loki
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/promtail/positions.yaml
clients:
- url: http://smart-city-loki:3100/loki/api/v1/push
scrape_configs:
# Collect logs from all Docker containers
- job_name: docker
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 5s
relabel_configs:
# Keep only Smart City containers
- source_labels: [__meta_docker_container_name]
regex: 'smart-city-.*'
action: keep
# Add container name as label
- source_labels: [__meta_docker_container_name]
target_label: container
- source_labels: [__meta_docker_container_name]
target_label: job
replacement: ${1}
# Add image as label
- source_labels: [__meta_docker_container_image]
target_label: image
# Add service label from container name
- source_labels: [__meta_docker_container_name]
regex: 'smart-city-(.*)'
target_label: service
replacement: '${1}'

View File

@@ -6,7 +6,7 @@ services:
container_name: smart-city-pulsar-manager-db container_name: smart-city-pulsar-manager-db
restart: unless-stopped restart: unless-stopped
environment: environment:
POSTGRES_USER: superset POSTGRES_USER: admin
POSTGRES_PASSWORD: Digitribe972 POSTGRES_PASSWORD: Digitribe972
POSTGRES_DB: pulsar_manager POSTGRES_DB: pulsar_manager
volumes: volumes:

View File

@@ -78,7 +78,7 @@ services:
- PULSAR_PORT=6650 - PULSAR_PORT=6650
- EMQX_HOST=emqx_emqx_1 - EMQX_HOST=emqx_emqx_1
- EMQX_PORT=1883 - EMQX_PORT=1883
- MOSQUITTO_HOST=mosquitto-traefik - MOSQUITTO_HOST=mainfluxlabs-mosquitto
- MOSQUITTO_PORT=1883 - MOSQUITTO_PORT=1883
- ORION_URL=http://fiware-gis-quickstart-orion-1:1026 - ORION_URL=http://fiware-gis-quickstart-orion-1:1026
- STELLIO_URL=http://stellio-api-gateway:8080 - STELLIO_URL=http://stellio-api-gateway:8080

1
requirements.txt Normal file
View File

@@ -0,0 +1 @@
prometheus_client

111
scripts/smartcity_monitor.py Executable file
View File

@@ -0,0 +1,111 @@
#!/usr/bin/env python3
"""
Smart City Digital Twin Martinique - Monitoring Script
Hybrid mode: Periodic checks + webhook-ready output
Alerts via Telegram when issues detected
"""
import subprocess
import json
import sys
from datetime import datetime
# Configuration
CRITICAL_CONTAINERS = [
"openremote_manager_1", "openremote_keycloak_1", "smart-city-simulator",
"emqx_emqx_1", "mainfluxlabs-broker", "stellio-api-gateway",
"smart-city-influxdb", "smart-city-grafana", "traefik",
"smart-city-prometheus-brokers"
]
ENDPOINTS = [
("OpenRemote", "https://openremote.digitribe.fr"),
("Grafana", "https://grafana.digitribe.fr"),
("Orion-LD", "http://fiware-gis-quickstart-orion-1:1026/version"),
("Stellio", "https://stellio.digitribe.fr"),
("FROST", "http://frost_http-web-1:8080/FROST-Server/core/v1.0/info")
]
NETWORK = "smartcity-shared"
TELEGRAM_USER = "@ericf972" # Will be used by Hermes send_message
def run_cmd(cmd):
"""Run shell command and return output"""
try:
result = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=10)
return result.stdout.strip(), result.stderr.strip(), result.returncode
except Exception as e:
return "", str(e), 1
def check_containers():
"""Check if critical containers are running"""
issues = []
for container in CRITICAL_CONTAINERS:
cmd = f"docker ps --format '{{{{.Names}}}}' | grep -w '{container}'"
out, err, code = run_cmd(cmd)
if not out:
issues.append(f"🛑 Container DOWN: {container}")
return issues
def check_endpoints():
"""Check if key endpoints are accessible"""
issues = []
for name, url in ENDPOINTS:
cmd = f"curl -k -s -o /dev/null -w '%{{http_code}}' --connect-timeout 5 {url}"
out, err, code = run_cmd(cmd)
if code != 0 or out not in ["200", "301", "302"]:
issues.append(f"🌐 Endpoint DOWN: {name} ({url}) - HTTP {out}")
return issues
def check_network():
"""Check network connectivity between containers"""
issues = []
# Check if Traefik can reach OpenRemote
cmd = "docker exec traefik wget -q --spider http://openremote_manager_1:8080 2>&1"
out, err, code = run_cmd(cmd)
if code != 0:
issues.append(f"🔌 Network issue: Traefik → OpenRemote")
return issues
def check_resources():
"""Check system resources"""
issues = []
# Disk space
cmd = "df -h / | awk 'NR==2 {print $5}' | tr -d '%'"
out, err, code = run_cmd(cmd)
if out and int(out) > 80:
issues.append(f"💾 Disk space critical: {out}% used")
# Memory
cmd = "free | awk '/Mem:/ {print int($3/$2 * 100)}'"
out, err, code = run_cmd(cmd)
if out and int(out) > 90:
issues.append(f"🧠 Memory critical: {out}% used")
return issues
def main():
"""Main monitoring function"""
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
all_issues = []
print(f"🔍 Smart City Monitoring Check - {timestamp}")
print("=" * 50)
# Run all checks
all_issues.extend(check_containers())
all_issues.extend(check_endpoints())
all_issues.extend(check_network())
all_issues.extend(check_resources())
# Output results
if all_issues:
print(f"⚠️ ALERT: {len(all_issues)} issue(s) detected!")
for issue in all_issues:
print(f" - {issue}")
# This output will be captured by Hermes cron job and sent to Telegram
sys.exit(1) # Non-zero exit code indicates issues
else:
print("✅ All systems operational")
sys.exit(0)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,60 @@
#!/usr/bin/env python3
"""
Webhook listener for Smart City Digital Twin Alerts
Receives Docker events and sends Telegram alerts
"""
from http.server import HTTPServer, BaseHTTPRequestHandler
import json
import subprocess
import threading
TELEGRAM_USER = "@ericf972" # Will be replaced with actual send_message in production
class WebhookHandler(BaseHTTPRequestHandler):
def do_POST(self):
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
try:
event = json.loads(post_data.decode('utf-8'))
self.process_event(event)
self.send_response(200)
self.end_headers()
except Exception as e:
print(f"Error processing webhook: {e}")
self.send_response(500)
self.end_headers()
def process_event(self, event):
"""Process incoming webhook event"""
event_type = event.get('Type', '')
event_action = event.get('Action', '')
event_actor = event.get('Actor', {}).get('Attributes', {}).get('name', '')
if event_type == 'container' and event_action in ['die', 'destroy', 'stop']:
message = f"🚨 Smart City Alert!\n"
message += f"Container: {event_actor}\n"
message += f"Action: {event_action}\n"
message += f"Time: {event.get('time', '')}\n"
# Send Telegram alert (using subprocess to call Hermes send_message)
subprocess.run([
'hermes', 'send-message',
'--target', TELEGRAM_USER,
'--message', message
], timeout=10)
print(f"Alert sent: {message}")
def log_message(self, format, *args):
"""Suppress default logging"""
pass
def run_webhook_server(port=8089):
"""Start webhook server"""
server = HTTPServer(('0.0.0.0', port), WebhookHandler)
print(f"Webhook server started on port {port}")
server.serve_forever()
if __name__ == '__main__':
run_webhook_server()

20
session_end_2026-05-06.md Normal file
View File

@@ -0,0 +1,20 @@
# FIN SESSION (02h30)
## ⏱️ TEMPS PASSÉ
- **OpenRemote Map** : 2h30+ (76+ tentatives) → NON RÉSOLU
- **Simulator Fix** : 30 min (ModuleNotFoundError) → ✅ RÉSOLU
- **Grafana/Loki** : 30 min → PARTIELLEMENT RÉSOLU
## ✅ RÉALISÉ (Pour démo demain)
1. **Simulator** : UP, 22,325+ messages Prometheus
2. **Grafana** : Dashboards IDs 19, 20 accessibles
3. **GeoServer** : 400 error fixé
## ❌ NON RÉSOLU (Accepter l'échec)
1. **OpenRemote Map** : martinique.json = 404 (MapService bug)
2. **Loki** : Pas de données (timestamps)
## 🎯 ACTIONS DEMAIN (AVANT DÉMO)
1. Vérifier Grafana affiche les données (pas seulement accessible)
2. Tester https://openremote.digitribe.fr/ (expliquer carte HS)
3. Préparer démo sur Grafana + Simulateur

View File

@@ -1,58 +1,65 @@
# Session Resume - 2026-05-06 (Demo Day) # Session Resume - 2026-05-06 (02:30 AM Martinique)
## Objectif ## 🎯 Objectif Démo
Démonstration Smart City Digital Twin Martinique à 09h00. - **Date** : Jeudi 8 Mai 2026 (ou Mercredi 7 si progrès suffisant)
Status : ✅ TOUT CORRIGÉ (7/7 services opérationnels) - **Stack** : Smart City Digital Twin Martinique
- **Statut** : Débogage OpenRemote (Carte, Agents, Brokers) + Pulsar Manager
## Services en cours (vérifies à 17h40) ## ✅ Réalisations (174 tentatives)
- ✅ OpenRemote : https://openremote.digitribe.fr (admin/Digitribe972) 1. **Simulateur** : Fonctionnel, publie vers MQTT, InfluxDB, Prometheus (`smart-city-simulator` container).
- ✅ InfluxDB : http://localhost:8086 (36,801+ points, bucket iot_data) 2. **Grafana** : Dashboards opérationnels avec données Prometheus.
- ✅ Grafana : http://localhost:3001 (admin/Digitribe972, dashboards OK) 3. **GeoServer** : Accessible (erreur 400 corrigée), MapStore configuré.
- ✅ FROST Server : http://localhost:8090 (Things/Datastreams créés) 4. **Pulsar Manager** : `curl` installé dans le conteneur, `init_db.sql` modifié pour `admin/Digitribe972`.
- ✅ Stellio : https://stellio.digitribe.fr (NGSI-LD, HTTP 204) 5. **Traefik** : Fichier `27-bunkerm-web.yml` corrigé (hostname `bunkerm_bunkerm_1` avec underscores).
- ✅ Redpanda : http://localhost:8082 (topics: air-quality, traffic, weather, etc.)
- ✅ Pulsar : localhost:6650 (volume reset, BookKeeper fixé)
## Simulateur ## ❌ Problèmes Restants
- PID : 2020948 1. **OpenRemote Maps** :
- Log : `simulator_pulsar_success.log` - Carte Martinique ne s'affiche pas bien (bounds à corriger dans `martinique.mbtiles` via sqlite3).
- Status : TOUS ✅ (FROST, InfluxDB, Stellio, Redpanda, Pulsar, Orion-LD) - Légendes et icônes capteurs à configurer.
- Commande : - `mapsettings.json` doit être restauré depuis template Martinique.
2. **OpenRemote Agents (CRITIQUE)** :
- API REST bloquée 401 (174 tentatives échouées).
- Solution : Utiliser **UNIQUEMENT l'UI** (`https://openremote.digitribe.fr/manager/#/agents`).
- Agents à créer : MQTT (EMQX, Mosquitto, BunkerM, Redpanda, Pulsar) + HTTP (Orion-LD, Stellio).
3. **Pulsar Manager** : Login `admin/Digitribe972` échoue (401). Nécessite reset volume `pulsar_pulsar-manager-db-data`.
## 🛠️ Actions à Faire Demain (Mercredi 7 Mai)
### OpenRemote (Priorité 1)
- [ ] Restaurer `mapsettings.json` depuis `templates/mapsettings_martinique_2026-05-02.json`.
- [ ] Corriger bounds mbtiles : `sqlite3 martinique.mbtiles "UPDATE metadata SET value='-61.3,14.3,-60.8,14.9' WHERE name='bounds';"`
- [ ] UI : Créer Agents MQTT (EMQX:11883, Mosquitto:1900, BunkerM:1900, Redpanda:2181, Pulsar:6650).
- [ ] UI : Créer Agents HTTP (Orion-LD:2026, Stellio:8087) avec headers NGSI-LD.
- [ ] UI : Lier Assets (AirQualityObserved, etc.) aux Agents.
### Pulsar Manager
- [ ] `docker volume rm pulsar_pulsar-manager-db-data`
- [ ] `docker compose up -d pulsar-manager` (rejoue init_db.sql)
- [ ] Tester login `admin/Digitribe972`.
### Traefik
- [ ] Vérifier accès `https://bunkerm.digitribe.fr` (port 2000 web UI BunkerM).
## 📝 Commandes Clés
```bash ```bash
cd ~/smart-city-digital-twin-martinique && \ # OpenRemote Map Fix
ENABLE_INFLUX=true ENABLE_STELLIO=true ENABLE_REDPANDA=true ENABLE_PULSAR=true \ docker exec openremote-manager-1 cp /deployment/map/mapsettings_martinique_2026-05-02.json /deployment/map/mapsettings.json
PULSAR_HOST=localhost REDPANDA_HOST=localhost REDPANDA_PORT=8082 \ docker cp openremote-manager-1:/deployment/map/martinique.mbtiles /tmp/
STELLIO_URL=https://stellio.digitribe.fr \ sqlite3 /tmp/martinique.mbtiles "UPDATE metadata SET value='-61.3,14.3,-60.8,14.9' WHERE name='bounds';"
INFLUX_URL=http://localhost:8086 INFLUX_TOKEN=my-super-secret-admin-token INFLUX_ORG=digitribe \ docker cp /tmp/martinique.mbtiles openremote-manager-1:/deployment/map/
INTERVAL=1 python3 simulator.py 2>&1 | tee simulator_pulsar_success.log docker restart openremote-manager-1
# Pulsar Manager Fix
docker stop smart-city-pulsar-manager
docker volume rm smart-city-digital-twin-martinique_pulsar-manager-db-data
cd ~/smart-city-digital-twin-martinique && docker compose up -d smart-city-pulsar-manager
``` ```
## Corrections effectuées (Actions 1-174) ## 💾 Fichiers Modifiés Aujourd'hui
1. OpenRemote : mapsettings.json Martinique, bounds, sources.vector_tiles - `/home/eric/traefik-config/dynamic/27-bunkerm-web.yml` (hostname corrigé)
2. FROST : Port 8090 mappé sur localhost - `/home/eric/traefik-config/dynamic/21-pulsar.yml` (si modifié)
3. Stellio : docker-compose.yml corrigé, démarré manuellement - `init_db.sql` (dans conteneur pulsar-manager, mot de passe admin changé)
4. Redpanda : Topics créés via rpk, content-type corrigé, port 8082 mappé
5. Pulsar : Volume reset (/pulsar/data), BookKeeper fixé, port 6650 mappé
6. Bugs simulateur : ENABLE_INFLUX/STELLIO/REDPANDA=true (lowercase), content-type Redpanda
## En cas de crash avant la démo ## ⏰ Prochain Créneau
1. `docker ps` (vérifier services) - **Mercredi 7 Mai 2026, 14h00 (heure Martinique)**.
2. `tail -20 simulator_pulsar_success.log | grep "✅"` (vérifier simulateur) - **Durée prévue** : 4-5 heures jusqu'à 19h00.
3. Si Pulsar down : `cd ~/smart-city-digital-twin-martinique/pulsar && docker compose up -d` - **Objectif** : Stack 100% fonctionnel pour démo Jeudi.
4. Si simulateur down : relancer commande ci-dessus
## Git
- Repo : https://gitea.digitribe.fr/eric/smart-city-digital-twin-martinique
- Branch : master (à jour)
- Dernier commit : "feat: PULSAR FIXED - All 7 services ✅"
## Checklist Démo 9h00
```bash
1. Ouvrir https://openremote.digitribe.fr → Login admin/Digitribe972
2. Vérifier carte Martinique interactive
3. Ouvrir http://localhost:3001 → Dashboard 'Air Quality Monitoring'
4. Confirmer graphiques actifs (InfluxDB + FROST)
5. Vérifier Stellio : https://stellio.digitribe.fr
```
**OBJECTIF ATTEINT : "Il faut que tout soit corrigé d'ici ce soir" = 100% COMPLETE**

View File

@@ -6,7 +6,7 @@ Publie vers MULTIPLES brokers MQTT + context brokers NGSI-LD.
Brokers MQTT: Brokers MQTT:
- EMQX: emqx_emqx_1:1883 (sans auth) - EMQX: emqx_emqx_1:1883 (sans auth)
- Mosquitto: mosquitto-traefik:1883 (bunker/bunker) - Mosquitto: mainfluxlabs-mosquitto:1883 (bunker/bunker)
- BunkerM: bunkerm_bunkerm_1:1900 (TLS, bunker/bunker) - BunkerM: bunkerm_bunkerm_1:1900 (TLS, bunker/bunker)
- OpenRemote: openremote-manager-1:1883 (admin/Digitribe972) - OpenRemote: openremote-manager-1:1883 (admin/Digitribe972)

File diff suppressed because it is too large Load Diff

987
simulator_demo_final.log Normal file
View File

@@ -0,0 +1,987 @@
[INFLUX] ✅ Connected to http://localhost:8086
╔══════════════════════════════════════════════════╗
║ Smart City Simulator — Martinique ║
╚══════════════════════════════════════════════════╝
[CFG] Capteurs: 10 | Intervalle: 1s
[CFG] Orion-LD: True | Stellio: True | FROST: True
[CFG] InfluxDB: True | Pulsar: True | Redpanda: True
[PULSAR] ⚠️ Cannot reach http://localhost:8080: HTTP Error 404: Not Found
🌪️ DEBUG: Test Pulsar direct...
2026-05-05 17:51:35.592 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:51:35.592 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:51:35.593 INFO [130543902521024] ClientConnection:421 | [127.0.0.1:59220 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:51:35.594 INFO [130543902521024] HandlerBase:112 | [persistent://public/default/smartcity-air-quality, ] Getting connection from pool
2026-05-05 17:51:35.595 INFO [130543902521024] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-air-quality, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:59220 -> 127.0.0.1:6650]
2026-05-05 17:51:35.595 INFO [130543902521024] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-air-quality, producerName: on [127.0.0.1:59220 -> 127.0.0.1:6650]
2026-05-05 17:51:35.764 INFO [130543902521024] ProducerImpl:222 | [persistent://public/default/smartcity-air-quality, ] Created producer on broker [127.0.0.1:59220 -> 127.0.0.1:6650]
2026-05-05 17:51:35.764 INFO [130543902521024] HandlerBase:134 | Finished connecting to broker after 169 ms
2026-05-05 17:51:35.767 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:51:35.767 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-air-quality, standalone-0-504] Closing producer for topic persistent://public/default/smartcity-air-quality
2026-05-05 17:51:35.767 INFO [130543902521024] ProducerImpl:767 | [persistent://public/default/smartcity-air-quality, standalone-0-504] Closed producer 0
2026-05-05 17:51:35.767 INFO [130543885735616] ClientConnection:1285 | [127.0.0.1:59220 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:51:35.767 INFO [130543885735616] ClientConnection:301 | [127.0.0.1:59220 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ DEBUG: Test Pulsar result: True
[REDPANDA] ⚠️ Cannot reach http://localhost:8082: HTTP Error 404: Not Found
[MQTT] 🔌 Connexion aux brokers...
/home/eric/smart-city-digital-twin-martinique/simulator.py:407: DeprecationWarning: Callback API version 1 is deprecated, update to latest version
c = mqtt.Client(client_id=cid, protocol=mqtt.MQTTv311)
[MQTT] ✅ EMQX connecté
[MQTT] ✅ Mosquitto connecté
[MQTT] ✅ BunkerM connecté
[SIM] ⏱️ It #1 — 17:51:38
📤 city/sensors/traffic/traffic_000 → EMQX,Mosquitto
⚠️ OpenRemote token → HTTP Error 405: Method Not Allowed
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
📊 FROST: POST Thing traffic_000...
✅ FROST Thing traffic_000 créé (ID: 114)
📊 FROST: POST Datastream traffic_000/vehicle_count...
✅ FROST Datastream traffic_000/vehicle_count créé (ID: 493)
📊 FROST: POST Datastream traffic_000/average_speed_kmh...
✅ FROST Datastream traffic_000/average_speed_kmh créé (ID: 494)
📊 FROST: POST Datastream traffic_000/congestion_level...
✅ FROST Datastream traffic_000/congestion_level créé (ID: 495)
📊 FROST: POST Datastream traffic_000/occupancy_percent...
✅ FROST Datastream traffic_000/occupancy_percent créé (ID: 496)
⚠️ HTTP POST http://localhost:8090/FROST-Server/v1.1/Datastreams(493)/Observations → 400: {"code":400,"type":"error","message":"No FeatureOfInterest provided, and none can be generated."}
📊 FROST: ❌
✅ FROST Observation traffic_000/average_speed_kmh → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_000/congestion_level → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_000/occupancy_percent → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for traffic_000, payload_mqtt exists: True
2026-05-05 17:51:42.173 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:51:42.173 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:51:42.175 INFO [130543868950208] ClientConnection:421 | [127.0.0.1:59234 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:51:42.178 INFO [130543868950208] HandlerBase:112 | [persistent://public/default/smartcity-traffic, ] Getting connection from pool
2026-05-05 17:51:42.180 INFO [130543868950208] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-traffic, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:59234 -> 127.0.0.1:6650]
2026-05-05 17:51:42.180 INFO [130543868950208] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-traffic, producerName: on [127.0.0.1:59234 -> 127.0.0.1:6650]
2026-05-05 17:51:42.182 INFO [130543868950208] ProducerImpl:222 | [persistent://public/default/smartcity-traffic, ] Created producer on broker [127.0.0.1:59234 -> 127.0.0.1:6650]
2026-05-05 17:51:42.182 INFO [130543868950208] HandlerBase:134 | Finished connecting to broker after 2 ms
2026-05-05 17:51:42.186 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:51:42.186 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-traffic, standalone-0-505] Closing producer for topic persistent://public/default/smartcity-traffic
2026-05-05 17:51:42.187 INFO [130543868950208] ProducerImpl:767 | [persistent://public/default/smartcity-traffic, standalone-0-505] Closed producer 0
2026-05-05 17:51:42.187 INFO [130543509300928] ClientConnection:1285 | [127.0.0.1:59234 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:51:42.188 INFO [130543509300928] ClientConnection:301 | [127.0.0.1:59234 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
🐟 Redpanda: ✅
📤 city/sensors/traffic/traffic_001 → EMQX,Mosquitto
⚠️ OpenRemote token → HTTP Error 405: Method Not Allowed
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
📊 FROST: POST Thing traffic_001...
✅ FROST Thing traffic_001 créé (ID: 115)
📊 FROST: POST Datastream traffic_001/vehicle_count...
📈 InfluxDB: 4 points written
✅ FROST Datastream traffic_001/vehicle_count créé (ID: 497)
📊 FROST: POST Datastream traffic_001/average_speed_kmh...
✅ FROST Datastream traffic_001/average_speed_kmh créé (ID: 498)
📊 FROST: POST Datastream traffic_001/congestion_level...
✅ FROST Datastream traffic_001/congestion_level créé (ID: 499)
📊 FROST: POST Datastream traffic_001/occupancy_percent...
✅ FROST Datastream traffic_001/occupancy_percent créé (ID: 500)
⚠️ HTTP POST http://localhost:8090/FROST-Server/v1.1/Datastreams(497)/Observations → 400: {"code":400,"type":"error","message":"No FeatureOfInterest provided, and none can be generated."}
📊 FROST: ❌
✅ FROST Observation traffic_001/average_speed_kmh → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_001/congestion_level → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_001/occupancy_percent → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for traffic_001, payload_mqtt exists: True
2026-05-05 17:51:44.270 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:51:44.271 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:51:44.272 INFO [130543517693632] ClientConnection:421 | [127.0.0.1:45610 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:51:44.276 INFO [130543517693632] HandlerBase:112 | [persistent://public/default/smartcity-traffic, ] Getting connection from pool
2026-05-05 17:51:44.277 INFO [130543517693632] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-traffic, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:45610 -> 127.0.0.1:6650]
2026-05-05 17:51:44.277 INFO [130543517693632] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-traffic, producerName: on [127.0.0.1:45610 -> 127.0.0.1:6650]
2026-05-05 17:51:44.279 INFO [130543517693632] ProducerImpl:222 | [persistent://public/default/smartcity-traffic, ] Created producer on broker [127.0.0.1:45610 -> 127.0.0.1:6650]
2026-05-05 17:51:44.279 INFO [130543517693632] HandlerBase:134 | Finished connecting to broker after 2 ms
2026-05-05 17:51:44.281 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:51:44.281 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-traffic, standalone-0-506] Closing producer for topic persistent://public/default/smartcity-traffic
2026-05-05 17:51:44.282 INFO [130543517693632] ProducerImpl:767 | [persistent://public/default/smartcity-traffic, standalone-0-506] Closed producer 0
2026-05-05 17:51:44.282 INFO [130543868950208] ClientConnection:1285 | [127.0.0.1:45610 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:51:44.282 INFO [130543868950208] ClientConnection:301 | [127.0.0.1:45610 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
🐟 Redpanda: ✅
📤 city/sensors/traffic/traffic_002 → EMQX,Mosquitto
⚠️ OpenRemote token → HTTP Error 405: Method Not Allowed
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
📈 InfluxDB: 4 points written
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
📊 FROST: POST Thing traffic_002...
✅ FROST Thing traffic_002 créé (ID: 116)
📊 FROST: POST Datastream traffic_002/vehicle_count...
✅ FROST Datastream traffic_002/vehicle_count créé (ID: 501)
📊 FROST: POST Datastream traffic_002/average_speed_kmh...
✅ FROST Datastream traffic_002/average_speed_kmh créé (ID: 502)
📊 FROST: POST Datastream traffic_002/congestion_level...
✅ FROST Datastream traffic_002/congestion_level créé (ID: 503)
📊 FROST: POST Datastream traffic_002/occupancy_percent...
✅ FROST Datastream traffic_002/occupancy_percent créé (ID: 504)
⚠️ HTTP POST http://localhost:8090/FROST-Server/v1.1/Datastreams(501)/Observations → 400: {"code":400,"type":"error","message":"No FeatureOfInterest provided, and none can be generated."}
📊 FROST: ❌
✅ FROST Observation traffic_002/average_speed_kmh → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_002/congestion_level → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_002/occupancy_percent → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for traffic_002, payload_mqtt exists: True
2026-05-05 17:51:45.149 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:51:45.149 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:51:45.149 INFO [130543509300928] ClientConnection:421 | [127.0.0.1:45612 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:51:45.150 INFO [130543509300928] HandlerBase:112 | [persistent://public/default/smartcity-traffic, ] Getting connection from pool
2026-05-05 17:51:45.150 INFO [130543509300928] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-traffic, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:45612 -> 127.0.0.1:6650]
2026-05-05 17:51:45.150 INFO [130543509300928] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-traffic, producerName: on [127.0.0.1:45612 -> 127.0.0.1:6650]
2026-05-05 17:51:45.151 INFO [130543509300928] ProducerImpl:222 | [persistent://public/default/smartcity-traffic, ] Created producer on broker [127.0.0.1:45612 -> 127.0.0.1:6650]
2026-05-05 17:51:45.151 INFO [130543509300928] HandlerBase:134 | Finished connecting to broker after 1 ms
2026-05-05 17:51:45.153 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:51:45.153 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-traffic, standalone-0-507] Closing producer for topic persistent://public/default/smartcity-traffic
2026-05-05 17:51:45.154 INFO [130543509300928] ProducerImpl:767 | [persistent://public/default/smartcity-traffic, standalone-0-507] Closed producer 0
2026-05-05 17:51:45.154 INFO [130543517693632] ClientConnection:1285 | [127.0.0.1:45612 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:51:45.154 INFO [130543517693632] ClientConnection:301 | [127.0.0.1:45612 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
🐟 Redpanda: ✅
📤 city/sensors/airquality/airquality_003 → EMQX,Mosquitto
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
📈 InfluxDB: 4 points written
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
📊 FROST: POST Thing airquality_003...
✅ FROST Thing airquality_003 créé (ID: 117)
📊 FROST: POST Datastream airquality_003/pm25_ugm3...
✅ FROST Datastream airquality_003/pm25_ugm3 créé (ID: 505)
📊 FROST: POST Datastream airquality_003/pm10_ugm3...
✅ FROST Datastream airquality_003/pm10_ugm3 créé (ID: 506)
📊 FROST: POST Datastream airquality_003/no2_ugm3...
✅ FROST Datastream airquality_003/no2_ugm3 créé (ID: 507)
📊 FROST: POST Datastream airquality_003/o3_ugm3...
✅ FROST Datastream airquality_003/o3_ugm3 créé (ID: 508)
📊 FROST: POST Datastream airquality_003/co_mgm3...
✅ FROST Datastream airquality_003/co_mgm3 créé (ID: 509)
📊 FROST: POST Datastream airquality_003/temperature_celsius...
✅ FROST Datastream airquality_003/temperature_celsius créé (ID: 510)
📊 FROST: POST Datastream airquality_003/humidity_percent...
✅ FROST Datastream airquality_003/humidity_percent créé (ID: 511)
⚠️ HTTP POST http://localhost:8090/FROST-Server/v1.1/Datastreams(505)/Observations → 400: {"code":400,"type":"error","message":"No FeatureOfInterest provided, and none can be generated."}
📊 FROST: ❌
✅ FROST Observation airquality_003/pm10_ugm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_003/no2_ugm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_003/o3_ugm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_003/co_mgm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_003/temperature_celsius → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_003/humidity_percent → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for airquality_003, payload_mqtt exists: True
2026-05-05 17:51:46.370 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:51:46.370 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:51:46.371 INFO [130543868950208] ClientConnection:421 | [127.0.0.1:45616 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:51:46.372 INFO [130543868950208] HandlerBase:112 | [persistent://public/default/smartcity-airquality, ] Getting connection from pool
2026-05-05 17:51:46.372 INFO [130543868950208] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-airquality, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:45616 -> 127.0.0.1:6650]
2026-05-05 17:51:46.372 INFO [130543868950208] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-airquality, producerName: on [127.0.0.1:45616 -> 127.0.0.1:6650]
2026-05-05 17:51:46.373 INFO [130543868950208] ProducerImpl:222 | [persistent://public/default/smartcity-airquality, ] Created producer on broker [127.0.0.1:45616 -> 127.0.0.1:6650]
2026-05-05 17:51:46.373 INFO [130543868950208] HandlerBase:134 | Finished connecting to broker after 1 ms
2026-05-05 17:51:46.375 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:51:46.375 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-airquality, standalone-0-508] Closing producer for topic persistent://public/default/smartcity-airquality
2026-05-05 17:51:46.375 INFO [130543868950208] ProducerImpl:767 | [persistent://public/default/smartcity-airquality, standalone-0-508] Closed producer 0
2026-05-05 17:51:46.375 INFO [130543517693632] ClientConnection:1285 | [127.0.0.1:45616 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:51:46.375 INFO [130543517693632] ClientConnection:301 | [127.0.0.1:45616 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
📈 InfluxDB: 7 points written
⚠️ Redpanda → timed out
🐟 Redpanda: ❌
📤 city/sensors/airquality/airquality_004 → EMQX,Mosquitto
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
📊 FROST: POST Thing airquality_004...
✅ FROST Thing airquality_004 créé (ID: 118)
📊 FROST: POST Datastream airquality_004/pm25_ugm3...
✅ FROST Datastream airquality_004/pm25_ugm3 créé (ID: 512)
📊 FROST: POST Datastream airquality_004/pm10_ugm3...
✅ FROST Datastream airquality_004/pm10_ugm3 créé (ID: 513)
📊 FROST: POST Datastream airquality_004/no2_ugm3...
✅ FROST Datastream airquality_004/no2_ugm3 créé (ID: 514)
📊 FROST: POST Datastream airquality_004/o3_ugm3...
✅ FROST Datastream airquality_004/o3_ugm3 créé (ID: 515)
📊 FROST: POST Datastream airquality_004/co_mgm3...
✅ FROST Datastream airquality_004/co_mgm3 créé (ID: 516)
📊 FROST: POST Datastream airquality_004/temperature_celsius...
✅ FROST Datastream airquality_004/temperature_celsius créé (ID: 517)
📊 FROST: POST Datastream airquality_004/humidity_percent...
✅ FROST Datastream airquality_004/humidity_percent créé (ID: 518)
⚠️ HTTP POST http://localhost:8090/FROST-Server/v1.1/Datastreams(512)/Observations → 400: {"code":400,"type":"error","message":"No FeatureOfInterest provided, and none can be generated."}
📊 FROST: ❌
✅ FROST Observation airquality_004/pm10_ugm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_004/no2_ugm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_004/o3_ugm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_004/co_mgm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_004/temperature_celsius → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_004/humidity_percent → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for airquality_004, payload_mqtt exists: True
2026-05-05 17:51:54.690 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:51:54.690 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:51:54.690 INFO [130543509300928] ClientConnection:421 | [127.0.0.1:52632 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:51:54.692 INFO [130543509300928] HandlerBase:112 | [persistent://public/default/smartcity-airquality, ] Getting connection from pool
2026-05-05 17:51:54.693 INFO [130543509300928] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-airquality, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:52632 -> 127.0.0.1:6650]
2026-05-05 17:51:54.693 INFO [130543509300928] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-airquality, producerName: on [127.0.0.1:52632 -> 127.0.0.1:6650]
2026-05-05 17:51:54.694 INFO [130543509300928] ProducerImpl:222 | [persistent://public/default/smartcity-airquality, ] Created producer on broker [127.0.0.1:52632 -> 127.0.0.1:6650]
2026-05-05 17:51:54.694 INFO [130543509300928] HandlerBase:134 | Finished connecting to broker after 2 ms
2026-05-05 17:51:54.697 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:51:54.697 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-airquality, standalone-0-509] Closing producer for topic persistent://public/default/smartcity-airquality
2026-05-05 17:51:54.697 INFO [130543509300928] ProducerImpl:767 | [persistent://public/default/smartcity-airquality, standalone-0-509] Closed producer 0
2026-05-05 17:51:54.697 INFO [130543868950208] ClientConnection:1285 | [127.0.0.1:52632 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:51:54.697 INFO [130543868950208] ClientConnection:301 | [127.0.0.1:52632 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
📈 InfluxDB: 7 points written
⚠️ Redpanda → timed out
🐟 Redpanda: ❌
📤 city/sensors/parking/parking_005 → EMQX,Mosquitto
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
📊 FROST: POST Thing parking_005...
✅ FROST Thing parking_005 créé (ID: 119)
📊 FROST: POST Datastream parking_005/total_spots...
✅ FROST Datastream parking_005/total_spots créé (ID: 519)
📊 FROST: POST Datastream parking_005/available_spots...
✅ FROST Datastream parking_005/available_spots créé (ID: 520)
📊 FROST: POST Datastream parking_005/occupancy_percent...
✅ FROST Datastream parking_005/occupancy_percent créé (ID: 521)
📊 FROST: POST Datastream parking_005/turnover_per_hour...
✅ FROST Datastream parking_005/turnover_per_hour créé (ID: 522)
⚠️ HTTP POST http://localhost:8090/FROST-Server/v1.1/Datastreams(519)/Observations → 400: {"code":400,"type":"error","message":"No FeatureOfInterest provided, and none can be generated."}
📊 FROST: ❌
✅ FROST Observation parking_005/available_spots → OK (cached)
📊 FROST: ✅
✅ FROST Observation parking_005/occupancy_percent → OK (cached)
📊 FROST: ✅
✅ FROST Observation parking_005/turnover_per_hour → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for parking_005, payload_mqtt exists: True
2026-05-05 17:52:02.881 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:52:02.881 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:52:02.881 INFO [130543517693632] ClientConnection:421 | [127.0.0.1:52636 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:52:02.882 INFO [130543517693632] HandlerBase:112 | [persistent://public/default/smartcity-parking, ] Getting connection from pool
2026-05-05 17:52:02.883 INFO [130543517693632] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-parking, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:52636 -> 127.0.0.1:6650]
2026-05-05 17:52:02.883 INFO [130543517693632] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-parking, producerName: on [127.0.0.1:52636 -> 127.0.0.1:6650]
2026-05-05 17:52:02.883 INFO [130543517693632] ProducerImpl:222 | [persistent://public/default/smartcity-parking, ] Created producer on broker [127.0.0.1:52636 -> 127.0.0.1:6650]
2026-05-05 17:52:02.883 INFO [130543517693632] HandlerBase:134 | Finished connecting to broker after 1 ms
2026-05-05 17:52:02.885 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:52:02.885 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-parking, standalone-0-510] Closing producer for topic persistent://public/default/smartcity-parking
2026-05-05 17:52:02.886 INFO [130543517693632] ProducerImpl:767 | [persistent://public/default/smartcity-parking, standalone-0-510] Closed producer 0
2026-05-05 17:52:02.886 INFO [130543509300928] ClientConnection:1285 | [127.0.0.1:52636 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:52:02.886 INFO [130543509300928] ClientConnection:301 | [127.0.0.1:52636 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
📈 InfluxDB: 4 points written
🐟 Redpanda: ✅
📤 city/sensors/parking/parking_006 → EMQX,Mosquitto
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
📊 FROST: POST Thing parking_006...
✅ FROST Thing parking_006 créé (ID: 120)
📊 FROST: POST Datastream parking_006/total_spots...
✅ FROST Datastream parking_006/total_spots créé (ID: 523)
📊 FROST: POST Datastream parking_006/available_spots...
✅ FROST Datastream parking_006/available_spots créé (ID: 524)
📊 FROST: POST Datastream parking_006/occupancy_percent...
✅ FROST Datastream parking_006/occupancy_percent créé (ID: 525)
📊 FROST: POST Datastream parking_006/turnover_per_hour...
✅ FROST Datastream parking_006/turnover_per_hour créé (ID: 526)
⚠️ HTTP POST http://localhost:8090/FROST-Server/v1.1/Datastreams(523)/Observations → 400: {"code":400,"type":"error","message":"No FeatureOfInterest provided, and none can be generated."}
📊 FROST: ❌
✅ FROST Observation parking_006/available_spots → OK (cached)
📊 FROST: ✅
✅ FROST Observation parking_006/occupancy_percent → OK (cached)
📊 FROST: ✅
✅ FROST Observation parking_006/turnover_per_hour → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for parking_006, payload_mqtt exists: True
2026-05-05 17:52:03.239 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:52:03.239 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:52:03.239 INFO [130543868950208] ClientConnection:421 | [127.0.0.1:52644 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:52:03.241 INFO [130543868950208] HandlerBase:112 | [persistent://public/default/smartcity-parking, ] Getting connection from pool
2026-05-05 17:52:03.241 INFO [130543868950208] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-parking, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:52644 -> 127.0.0.1:6650]
2026-05-05 17:52:03.241 INFO [130543868950208] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-parking, producerName: on [127.0.0.1:52644 -> 127.0.0.1:6650]
2026-05-05 17:52:03.241 INFO [130543868950208] ProducerImpl:222 | [persistent://public/default/smartcity-parking, ] Created producer on broker [127.0.0.1:52644 -> 127.0.0.1:6650]
2026-05-05 17:52:03.241 INFO [130543868950208] HandlerBase:134 | Finished connecting to broker after 0 ms
2026-05-05 17:52:03.244 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:52:03.244 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-parking, standalone-0-511] Closing producer for topic persistent://public/default/smartcity-parking
2026-05-05 17:52:03.244 INFO [130543868950208] ProducerImpl:767 | [persistent://public/default/smartcity-parking, standalone-0-511] Closed producer 0
2026-05-05 17:52:03.244 INFO [130543517693632] ClientConnection:1285 | [127.0.0.1:52644 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:52:03.244 INFO [130543517693632] ClientConnection:301 | [127.0.0.1:52644 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
📈 InfluxDB: 4 points written
🐟 Redpanda: ✅
📤 city/sensors/noise/noise_007 → EMQX,Mosquitto
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
📊 FROST: POST Thing noise_007...
✅ FROST Thing noise_007 créé (ID: 121)
📊 FROST: POST Datastream noise_007/noise_level_db...
✅ FROST Datastream noise_007/noise_level_db créé (ID: 527)
📊 FROST: POST Datastream noise_007/peak_db...
✅ FROST Datastream noise_007/peak_db créé (ID: 528)
⚠️ HTTP POST http://localhost:8090/FROST-Server/v1.1/Datastreams(527)/Observations → 400: {"code":400,"type":"error","message":"No FeatureOfInterest provided, and none can be generated."}
📊 FROST: ❌
✅ FROST Observation noise_007/peak_db → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for noise_007, payload_mqtt exists: True
2026-05-05 17:52:03.455 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:52:03.455 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:52:03.455 INFO [130543509300928] ClientConnection:421 | [127.0.0.1:52646 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:52:03.456 INFO [130543509300928] HandlerBase:112 | [persistent://public/default/smartcity-noise, ] Getting connection from pool
2026-05-05 17:52:03.457 INFO [130543509300928] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-noise, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:52646 -> 127.0.0.1:6650]
2026-05-05 17:52:03.457 INFO [130543509300928] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-noise, producerName: on [127.0.0.1:52646 -> 127.0.0.1:6650]
2026-05-05 17:52:03.457 INFO [130543509300928] ProducerImpl:222 | [persistent://public/default/smartcity-noise, ] Created producer on broker [127.0.0.1:52646 -> 127.0.0.1:6650]
2026-05-05 17:52:03.457 INFO [130543509300928] HandlerBase:134 | Finished connecting to broker after 0 ms
2026-05-05 17:52:03.459 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:52:03.459 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-noise, standalone-0-512] Closing producer for topic persistent://public/default/smartcity-noise
2026-05-05 17:52:03.459 INFO [130543509300928] ProducerImpl:767 | [persistent://public/default/smartcity-noise, standalone-0-512] Closed producer 0
2026-05-05 17:52:03.460 INFO [130543868950208] ClientConnection:1285 | [127.0.0.1:52646 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:52:03.460 INFO [130543868950208] ClientConnection:301 | [127.0.0.1:52646 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
📈 InfluxDB: 2 points written
🐟 Redpanda: ✅
📤 city/sensors/weather/weather_008 → EMQX,Mosquitto
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
📊 FROST: POST Thing weather_008...
✅ FROST Thing weather_008 créé (ID: 122)
📊 FROST: POST Datastream weather_008/temperature_celsius...
✅ FROST Datastream weather_008/temperature_celsius créé (ID: 529)
📊 FROST: POST Datastream weather_008/humidity_percent...
✅ FROST Datastream weather_008/humidity_percent créé (ID: 530)
📊 FROST: POST Datastream weather_008/wind_speed_kmh...
✅ FROST Datastream weather_008/wind_speed_kmh créé (ID: 531)
📊 FROST: POST Datastream weather_008/pressure_hpa...
✅ FROST Datastream weather_008/pressure_hpa créé (ID: 532)
📊 FROST: POST Datastream weather_008/rain_mm...
✅ FROST Datastream weather_008/rain_mm créé (ID: 533)
📊 FROST: POST Datastream weather_008/uv_index...
✅ FROST Datastream weather_008/uv_index créé (ID: 534)
⚠️ HTTP POST http://localhost:8090/FROST-Server/v1.1/Datastreams(529)/Observations → 400: {"code":400,"type":"error","message":"No FeatureOfInterest provided, and none can be generated."}
📊 FROST: ❌
✅ FROST Observation weather_008/humidity_percent → OK (cached)
📊 FROST: ✅
✅ FROST Observation weather_008/wind_speed_kmh → OK (cached)
📊 FROST: ✅
✅ FROST Observation weather_008/pressure_hpa → OK (cached)
📊 FROST: ✅
✅ FROST Observation weather_008/rain_mm → OK (cached)
📊 FROST: ✅
✅ FROST Observation weather_008/uv_index → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for weather_008, payload_mqtt exists: True
2026-05-05 17:52:03.884 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:52:03.884 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:52:03.885 INFO [130543517693632] ClientConnection:421 | [127.0.0.1:47964 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:52:03.889 INFO [130543517693632] HandlerBase:112 | [persistent://public/default/smartcity-weather, ] Getting connection from pool
2026-05-05 17:52:03.890 INFO [130543517693632] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-weather, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:47964 -> 127.0.0.1:6650]
2026-05-05 17:52:03.890 INFO [130543517693632] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-weather, producerName: on [127.0.0.1:47964 -> 127.0.0.1:6650]
2026-05-05 17:52:03.892 INFO [130543517693632] ProducerImpl:222 | [persistent://public/default/smartcity-weather, ] Created producer on broker [127.0.0.1:47964 -> 127.0.0.1:6650]
2026-05-05 17:52:03.892 INFO [130543517693632] HandlerBase:134 | Finished connecting to broker after 3 ms
2026-05-05 17:52:03.896 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:52:03.896 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-weather, standalone-0-513] Closing producer for topic persistent://public/default/smartcity-weather
2026-05-05 17:52:03.898 INFO [130543517693632] ProducerImpl:767 | [persistent://public/default/smartcity-weather, standalone-0-513] Closed producer 0
2026-05-05 17:52:03.898 INFO [130543509300928] ClientConnection:1285 | [127.0.0.1:47964 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:52:03.898 INFO [130543509300928] ClientConnection:301 | [127.0.0.1:47964 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
📈 InfluxDB: 6 points written
🐟 Redpanda: ✅
📤 city/sensors/light/light_009 → EMQX,Mosquitto
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
📊 FROST: POST Thing light_009...
✅ FROST Thing light_009 créé (ID: 123)
📊 FROST: POST Datastream light_009/brightness_lux...
✅ FROST Datastream light_009/brightness_lux créé (ID: 535)
📊 FROST: POST Datastream light_009/power_consumption_w...
✅ FROST Datastream light_009/power_consumption_w créé (ID: 536)
⚠️ HTTP POST http://localhost:8090/FROST-Server/v1.1/Datastreams(535)/Observations → 400: {"code":400,"type":"error","message":"No FeatureOfInterest provided, and none can be generated."}
📊 FROST: ❌
✅ FROST Observation light_009/power_consumption_w → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for light_009, payload_mqtt exists: True
2026-05-05 17:52:04.256 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:52:04.256 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:52:04.257 INFO [130543868950208] ClientConnection:421 | [127.0.0.1:47968 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:52:04.258 INFO [130543868950208] HandlerBase:112 | [persistent://public/default/smartcity-light, ] Getting connection from pool
2026-05-05 17:52:04.258 INFO [130543868950208] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-light, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:47968 -> 127.0.0.1:6650]
2026-05-05 17:52:04.258 INFO [130543868950208] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-light, producerName: on [127.0.0.1:47968 -> 127.0.0.1:6650]
2026-05-05 17:52:04.259 INFO [130543868950208] ProducerImpl:222 | [persistent://public/default/smartcity-light, ] Created producer on broker [127.0.0.1:47968 -> 127.0.0.1:6650]
2026-05-05 17:52:04.259 INFO [130543868950208] HandlerBase:134 | Finished connecting to broker after 0 ms
2026-05-05 17:52:04.261 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:52:04.261 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-light, standalone-0-514] Closing producer for topic persistent://public/default/smartcity-light
2026-05-05 17:52:04.261 INFO [130543868950208] ProducerImpl:767 | [persistent://public/default/smartcity-light, standalone-0-514] Closed producer 0
2026-05-05 17:52:04.261 INFO [130543517693632] ClientConnection:1285 | [127.0.0.1:47968 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:52:04.261 INFO [130543517693632] ClientConnection:301 | [127.0.0.1:47968 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
📈 InfluxDB: 2 points written
🐟 Redpanda: ✅
[SIM] ✅ 10 capteurs | MQTT OK: 2/3 | OR: True
[SIM] ⏱️ It #2 — 17:52:05
📤 city/sensors/traffic/traffic_000 → EMQX,Mosquitto
⚠️ OpenRemote token → HTTP Error 405: Method Not Allowed
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
✅ FROST Observation traffic_000/vehicle_count → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_000/average_speed_kmh → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_000/congestion_level → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_000/occupancy_percent → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for traffic_000, payload_mqtt exists: True
2026-05-05 17:52:05.742 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:52:05.742 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:52:05.743 INFO [130543509300928] ClientConnection:421 | [127.0.0.1:47970 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:52:05.743 INFO [130543509300928] HandlerBase:112 | [persistent://public/default/smartcity-traffic, ] Getting connection from pool
2026-05-05 17:52:05.744 INFO [130543509300928] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-traffic, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:47970 -> 127.0.0.1:6650]
2026-05-05 17:52:05.744 INFO [130543509300928] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-traffic, producerName: on [127.0.0.1:47970 -> 127.0.0.1:6650]
2026-05-05 17:52:05.744 INFO [130543509300928] ProducerImpl:222 | [persistent://public/default/smartcity-traffic, ] Created producer on broker [127.0.0.1:47970 -> 127.0.0.1:6650]
2026-05-05 17:52:05.744 INFO [130543509300928] HandlerBase:134 | Finished connecting to broker after 0 ms
2026-05-05 17:52:05.746 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:52:05.746 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-traffic, standalone-0-515] Closing producer for topic persistent://public/default/smartcity-traffic
2026-05-05 17:52:05.747 INFO [130543509300928] ProducerImpl:767 | [persistent://public/default/smartcity-traffic, standalone-0-515] Closed producer 0
2026-05-05 17:52:05.747 INFO [130543868950208] ClientConnection:1285 | [127.0.0.1:47970 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:52:05.747 INFO [130543868950208] ClientConnection:301 | [127.0.0.1:47970 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
🐟 Redpanda: ✅
📤 city/sensors/traffic/traffic_001 → EMQX,Mosquitto
⚠️ OpenRemote token → HTTP Error 405: Method Not Allowed
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
📈 InfluxDB: 4 points written
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
✅ FROST Observation traffic_001/vehicle_count → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_001/average_speed_kmh → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_001/congestion_level → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_001/occupancy_percent → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for traffic_001, payload_mqtt exists: True
2026-05-05 17:52:07.038 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:52:07.038 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:52:07.038 INFO [130543517693632] ClientConnection:421 | [127.0.0.1:47982 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:52:07.040 INFO [130543517693632] HandlerBase:112 | [persistent://public/default/smartcity-traffic, ] Getting connection from pool
2026-05-05 17:52:07.041 INFO [130543517693632] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-traffic, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:47982 -> 127.0.0.1:6650]
2026-05-05 17:52:07.041 INFO [130543517693632] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-traffic, producerName: on [127.0.0.1:47982 -> 127.0.0.1:6650]
2026-05-05 17:52:07.041 INFO [130543517693632] ProducerImpl:222 | [persistent://public/default/smartcity-traffic, ] Created producer on broker [127.0.0.1:47982 -> 127.0.0.1:6650]
2026-05-05 17:52:07.041 INFO [130543517693632] HandlerBase:134 | Finished connecting to broker after 1 ms
2026-05-05 17:52:07.044 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:52:07.044 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-traffic, standalone-0-516] Closing producer for topic persistent://public/default/smartcity-traffic
2026-05-05 17:52:07.044 INFO [130543517693632] ProducerImpl:767 | [persistent://public/default/smartcity-traffic, standalone-0-516] Closed producer 0
2026-05-05 17:52:07.044 INFO [130543509300928] ClientConnection:1285 | [127.0.0.1:47982 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:52:07.045 INFO [130543509300928] ClientConnection:301 | [127.0.0.1:47982 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
🐟 Redpanda: ✅
📤 city/sensors/traffic/traffic_002 → EMQX,Mosquitto
⚠️ OpenRemote token → HTTP Error 405: Method Not Allowed
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
📈 InfluxDB: 4 points written
✅ FROST Observation traffic_002/vehicle_count → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_002/average_speed_kmh → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_002/congestion_level → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_002/occupancy_percent → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for traffic_002, payload_mqtt exists: True
2026-05-05 17:52:08.687 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:52:08.687 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:52:08.688 INFO [130543868950208] ClientConnection:421 | [127.0.0.1:47998 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:52:08.689 INFO [130543868950208] HandlerBase:112 | [persistent://public/default/smartcity-traffic, ] Getting connection from pool
2026-05-05 17:52:08.690 INFO [130543868950208] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-traffic, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:47998 -> 127.0.0.1:6650]
2026-05-05 17:52:08.690 INFO [130543868950208] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-traffic, producerName: on [127.0.0.1:47998 -> 127.0.0.1:6650]
2026-05-05 17:52:08.690 INFO [130543868950208] ProducerImpl:222 | [persistent://public/default/smartcity-traffic, ] Created producer on broker [127.0.0.1:47998 -> 127.0.0.1:6650]
2026-05-05 17:52:08.690 INFO [130543868950208] HandlerBase:134 | Finished connecting to broker after 1 ms
2026-05-05 17:52:08.693 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:52:08.693 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-traffic, standalone-0-517] Closing producer for topic persistent://public/default/smartcity-traffic
2026-05-05 17:52:08.693 INFO [130543868950208] ProducerImpl:767 | [persistent://public/default/smartcity-traffic, standalone-0-517] Closed producer 0
2026-05-05 17:52:08.693 INFO [130543517693632] ClientConnection:1285 | [127.0.0.1:47998 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:52:08.694 INFO [130543517693632] ClientConnection:301 | [127.0.0.1:47998 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
📈 InfluxDB: 4 points written
🐟 Redpanda: ✅
📤 city/sensors/airquality/airquality_003 → EMQX,Mosquitto
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
✅ FROST Observation airquality_003/pm25_ugm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_003/pm10_ugm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_003/no2_ugm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_003/o3_ugm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_003/co_mgm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_003/temperature_celsius → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_003/humidity_percent → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for airquality_003, payload_mqtt exists: True
2026-05-05 17:52:09.223 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:52:09.223 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:52:09.223 INFO [130543509300928] ClientConnection:421 | [127.0.0.1:48014 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:52:09.224 INFO [130543509300928] HandlerBase:112 | [persistent://public/default/smartcity-airquality, ] Getting connection from pool
2026-05-05 17:52:09.225 INFO [130543509300928] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-airquality, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:48014 -> 127.0.0.1:6650]
2026-05-05 17:52:09.225 INFO [130543509300928] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-airquality, producerName: on [127.0.0.1:48014 -> 127.0.0.1:6650]
2026-05-05 17:52:09.225 INFO [130543509300928] ProducerImpl:222 | [persistent://public/default/smartcity-airquality, ] Created producer on broker [127.0.0.1:48014 -> 127.0.0.1:6650]
2026-05-05 17:52:09.225 INFO [130543509300928] HandlerBase:134 | Finished connecting to broker after 0 ms
2026-05-05 17:52:09.227 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:52:09.227 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-airquality, standalone-0-518] Closing producer for topic persistent://public/default/smartcity-airquality
2026-05-05 17:52:09.227 INFO [130543509300928] ProducerImpl:767 | [persistent://public/default/smartcity-airquality, standalone-0-518] Closed producer 0
2026-05-05 17:52:09.227 INFO [130543868950208] ClientConnection:1285 | [127.0.0.1:48014 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:52:09.227 INFO [130543868950208] ClientConnection:301 | [127.0.0.1:48014 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
📈 InfluxDB: 7 points written
⚠️ Redpanda → timed out
🐟 Redpanda: ❌
📤 city/sensors/airquality/airquality_004 → EMQX,Mosquitto
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
✅ FROST Observation airquality_004/pm25_ugm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_004/pm10_ugm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_004/no2_ugm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_004/o3_ugm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_004/co_mgm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_004/temperature_celsius → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_004/humidity_percent → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for airquality_004, payload_mqtt exists: True
2026-05-05 17:52:17.382 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:52:17.382 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:52:17.382 INFO [130543517693632] ClientConnection:421 | [127.0.0.1:58274 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:52:17.383 INFO [130543517693632] HandlerBase:112 | [persistent://public/default/smartcity-airquality, ] Getting connection from pool
2026-05-05 17:52:17.384 INFO [130543517693632] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-airquality, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:58274 -> 127.0.0.1:6650]
2026-05-05 17:52:17.384 INFO [130543517693632] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-airquality, producerName: on [127.0.0.1:58274 -> 127.0.0.1:6650]
2026-05-05 17:52:17.385 INFO [130543517693632] ProducerImpl:222 | [persistent://public/default/smartcity-airquality, ] Created producer on broker [127.0.0.1:58274 -> 127.0.0.1:6650]
2026-05-05 17:52:17.385 INFO [130543517693632] HandlerBase:134 | Finished connecting to broker after 1 ms
2026-05-05 17:52:17.387 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:52:17.387 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-airquality, standalone-0-519] Closing producer for topic persistent://public/default/smartcity-airquality
2026-05-05 17:52:17.387 INFO [130543517693632] ProducerImpl:767 | [persistent://public/default/smartcity-airquality, standalone-0-519] Closed producer 0
2026-05-05 17:52:17.387 INFO [130543868950208] ClientConnection:1285 | [127.0.0.1:58274 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:52:17.388 INFO [130543868950208] ClientConnection:301 | [127.0.0.1:58274 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
📈 InfluxDB: 7 points written
⚠️ Redpanda → timed out
🐟 Redpanda: ❌
📤 city/sensors/parking/parking_005 → EMQX,Mosquitto
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
✅ FROST Observation parking_005/total_spots → OK (cached)
📊 FROST: ✅
✅ FROST Observation parking_005/available_spots → OK (cached)
📊 FROST: ✅
✅ FROST Observation parking_005/occupancy_percent → OK (cached)
📊 FROST: ✅
✅ FROST Observation parking_005/turnover_per_hour → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for parking_005, payload_mqtt exists: True
2026-05-05 17:52:25.728 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:52:25.728 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:52:25.728 INFO [130543509300928] ClientConnection:421 | [127.0.0.1:45874 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:52:25.730 INFO [130543509300928] HandlerBase:112 | [persistent://public/default/smartcity-parking, ] Getting connection from pool
2026-05-05 17:52:25.730 INFO [130543509300928] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-parking, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:45874 -> 127.0.0.1:6650]
2026-05-05 17:52:25.730 INFO [130543509300928] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-parking, producerName: on [127.0.0.1:45874 -> 127.0.0.1:6650]
2026-05-05 17:52:25.731 INFO [130543509300928] ProducerImpl:222 | [persistent://public/default/smartcity-parking, ] Created producer on broker [127.0.0.1:45874 -> 127.0.0.1:6650]
2026-05-05 17:52:25.731 INFO [130543509300928] HandlerBase:134 | Finished connecting to broker after 1 ms
2026-05-05 17:52:25.733 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:52:25.733 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-parking, standalone-0-520] Closing producer for topic persistent://public/default/smartcity-parking
2026-05-05 17:52:25.734 INFO [130543509300928] ProducerImpl:767 | [persistent://public/default/smartcity-parking, standalone-0-520] Closed producer 0
2026-05-05 17:52:25.734 INFO [130543517693632] ClientConnection:1285 | [127.0.0.1:45874 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:52:25.734 INFO [130543517693632] ClientConnection:301 | [127.0.0.1:45874 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
📈 InfluxDB: 4 points written
🐟 Redpanda: ✅
📤 city/sensors/parking/parking_006 → EMQX,Mosquitto
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
✅ FROST Observation parking_006/total_spots → OK (cached)
📊 FROST: ✅
✅ FROST Observation parking_006/available_spots → OK (cached)
📊 FROST: ✅
✅ FROST Observation parking_006/occupancy_percent → OK (cached)
📊 FROST: ✅
✅ FROST Observation parking_006/turnover_per_hour → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for parking_006, payload_mqtt exists: True
2026-05-05 17:52:26.115 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:52:26.115 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:52:26.115 INFO [130543868950208] ClientConnection:421 | [127.0.0.1:45878 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:52:26.117 INFO [130543868950208] HandlerBase:112 | [persistent://public/default/smartcity-parking, ] Getting connection from pool
2026-05-05 17:52:26.117 INFO [130543868950208] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-parking, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:45878 -> 127.0.0.1:6650]
2026-05-05 17:52:26.117 INFO [130543868950208] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-parking, producerName: on [127.0.0.1:45878 -> 127.0.0.1:6650]
2026-05-05 17:52:26.118 INFO [130543868950208] ProducerImpl:222 | [persistent://public/default/smartcity-parking, ] Created producer on broker [127.0.0.1:45878 -> 127.0.0.1:6650]
2026-05-05 17:52:26.118 INFO [130543868950208] HandlerBase:134 | Finished connecting to broker after 1 ms
2026-05-05 17:52:26.120 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:52:26.120 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-parking, standalone-0-521] Closing producer for topic persistent://public/default/smartcity-parking
2026-05-05 17:52:26.121 INFO [130543868950208] ProducerImpl:767 | [persistent://public/default/smartcity-parking, standalone-0-521] Closed producer 0
2026-05-05 17:52:26.121 INFO [130543509300928] ClientConnection:1285 | [127.0.0.1:45878 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:52:26.121 INFO [130543509300928] ClientConnection:301 | [127.0.0.1:45878 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
📈 InfluxDB: 4 points written
🐟 Redpanda: ✅
📤 city/sensors/noise/noise_007 → EMQX,Mosquitto
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
✅ FROST Observation noise_007/noise_level_db → OK (cached)
📊 FROST: ✅
✅ FROST Observation noise_007/peak_db → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for noise_007, payload_mqtt exists: True
2026-05-05 17:52:26.464 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:52:26.464 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:52:26.465 INFO [130543517693632] ClientConnection:421 | [127.0.0.1:45894 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:52:26.466 INFO [130543517693632] HandlerBase:112 | [persistent://public/default/smartcity-noise, ] Getting connection from pool
2026-05-05 17:52:26.466 INFO [130543517693632] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-noise, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:45894 -> 127.0.0.1:6650]
2026-05-05 17:52:26.466 INFO [130543517693632] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-noise, producerName: on [127.0.0.1:45894 -> 127.0.0.1:6650]
2026-05-05 17:52:26.466 INFO [130543517693632] ProducerImpl:222 | [persistent://public/default/smartcity-noise, ] Created producer on broker [127.0.0.1:45894 -> 127.0.0.1:6650]
2026-05-05 17:52:26.466 INFO [130543517693632] HandlerBase:134 | Finished connecting to broker after 0 ms
2026-05-05 17:52:26.468 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:52:26.468 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-noise, standalone-0-522] Closing producer for topic persistent://public/default/smartcity-noise
2026-05-05 17:52:26.469 INFO [130543517693632] ProducerImpl:767 | [persistent://public/default/smartcity-noise, standalone-0-522] Closed producer 0
2026-05-05 17:52:26.469 INFO [130543868950208] ClientConnection:1285 | [127.0.0.1:45894 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:52:26.469 INFO [130543868950208] ClientConnection:301 | [127.0.0.1:45894 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
🐟 Redpanda: ✅
📤 city/sensors/weather/weather_008 → EMQX,Mosquitto
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
📈 InfluxDB: 2 points written
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
✅ FROST Observation weather_008/temperature_celsius → OK (cached)
📊 FROST: ✅
✅ FROST Observation weather_008/humidity_percent → OK (cached)
📊 FROST: ✅
✅ FROST Observation weather_008/wind_speed_kmh → OK (cached)
📊 FROST: ✅
✅ FROST Observation weather_008/pressure_hpa → OK (cached)
📊 FROST: ✅
✅ FROST Observation weather_008/rain_mm → OK (cached)
📊 FROST: ✅
✅ FROST Observation weather_008/uv_index → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for weather_008, payload_mqtt exists: True
2026-05-05 17:52:26.974 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:52:26.974 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:52:26.975 INFO [130543509300928] ClientConnection:421 | [127.0.0.1:45896 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:52:26.976 INFO [130543509300928] HandlerBase:112 | [persistent://public/default/smartcity-weather, ] Getting connection from pool
2026-05-05 17:52:26.977 INFO [130543509300928] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-weather, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:45896 -> 127.0.0.1:6650]
2026-05-05 17:52:26.977 INFO [130543509300928] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-weather, producerName: on [127.0.0.1:45896 -> 127.0.0.1:6650]
2026-05-05 17:52:26.977 INFO [130543509300928] ProducerImpl:222 | [persistent://public/default/smartcity-weather, ] Created producer on broker [127.0.0.1:45896 -> 127.0.0.1:6650]
2026-05-05 17:52:26.977 INFO [130543509300928] HandlerBase:134 | Finished connecting to broker after 1 ms
2026-05-05 17:52:26.980 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:52:26.980 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-weather, standalone-0-523] Closing producer for topic persistent://public/default/smartcity-weather
2026-05-05 17:52:26.980 INFO [130543509300928] ProducerImpl:767 | [persistent://public/default/smartcity-weather, standalone-0-523] Closed producer 0
2026-05-05 17:52:26.980 INFO [130543517693632] ClientConnection:1285 | [127.0.0.1:45896 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:52:26.980 INFO [130543517693632] ClientConnection:301 | [127.0.0.1:45896 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
📈 InfluxDB: 6 points written
🐟 Redpanda: ✅
📤 city/sensors/light/light_009 → EMQX,Mosquitto
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
✅ FROST Observation light_009/brightness_lux → OK (cached)
📊 FROST: ✅
✅ FROST Observation light_009/power_consumption_w → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for light_009, payload_mqtt exists: True
2026-05-05 17:52:28.029 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:52:28.029 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:52:28.030 INFO [130543868950208] ClientConnection:421 | [127.0.0.1:45908 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:52:28.032 INFO [130543868950208] HandlerBase:112 | [persistent://public/default/smartcity-light, ] Getting connection from pool
2026-05-05 17:52:28.034 INFO [130543868950208] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-light, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:45908 -> 127.0.0.1:6650]
2026-05-05 17:52:28.034 INFO [130543868950208] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-light, producerName: on [127.0.0.1:45908 -> 127.0.0.1:6650]
2026-05-05 17:52:28.035 INFO [130543868950208] ProducerImpl:222 | [persistent://public/default/smartcity-light, ] Created producer on broker [127.0.0.1:45908 -> 127.0.0.1:6650]
2026-05-05 17:52:28.035 INFO [130543868950208] HandlerBase:134 | Finished connecting to broker after 2 ms
2026-05-05 17:52:28.039 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:52:28.039 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-light, standalone-0-524] Closing producer for topic persistent://public/default/smartcity-light
2026-05-05 17:52:28.040 INFO [130543868950208] ProducerImpl:767 | [persistent://public/default/smartcity-light, standalone-0-524] Closed producer 0
2026-05-05 17:52:28.041 INFO [130543509300928] ClientConnection:1285 | [127.0.0.1:45908 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:52:28.041 INFO [130543509300928] ClientConnection:301 | [127.0.0.1:45908 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
📈 InfluxDB: 2 points written
🐟 Redpanda: ✅
[SIM] ✅ 10 capteurs | MQTT OK: 2/3 | OR: True
[SIM] ⏱️ It #3 — 17:52:29
📤 city/sensors/traffic/traffic_000 → EMQX,Mosquitto
⚠️ OpenRemote token → HTTP Error 405: Method Not Allowed
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
✅ FROST Observation traffic_000/vehicle_count → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_000/average_speed_kmh → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_000/congestion_level → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_000/occupancy_percent → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for traffic_000, payload_mqtt exists: True
2026-05-05 17:52:29.453 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:52:29.453 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:52:29.454 INFO [130543517693632] ClientConnection:421 | [127.0.0.1:45920 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:52:29.455 INFO [130543517693632] HandlerBase:112 | [persistent://public/default/smartcity-traffic, ] Getting connection from pool
2026-05-05 17:52:29.455 INFO [130543517693632] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-traffic, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:45920 -> 127.0.0.1:6650]
2026-05-05 17:52:29.455 INFO [130543517693632] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-traffic, producerName: on [127.0.0.1:45920 -> 127.0.0.1:6650]
2026-05-05 17:52:29.456 INFO [130543517693632] ProducerImpl:222 | [persistent://public/default/smartcity-traffic, ] Created producer on broker [127.0.0.1:45920 -> 127.0.0.1:6650]
2026-05-05 17:52:29.456 INFO [130543517693632] HandlerBase:134 | Finished connecting to broker after 0 ms
2026-05-05 17:52:29.457 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:52:29.457 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-traffic, standalone-0-525] Closing producer for topic persistent://public/default/smartcity-traffic
2026-05-05 17:52:29.458 INFO [130543517693632] ProducerImpl:767 | [persistent://public/default/smartcity-traffic, standalone-0-525] Closed producer 0
2026-05-05 17:52:29.458 INFO [130543868950208] ClientConnection:1285 | [127.0.0.1:45920 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:52:29.458 INFO [130543868950208] ClientConnection:301 | [127.0.0.1:45920 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
📈 InfluxDB: 4 points written
🐟 Redpanda: ✅
📤 city/sensors/traffic/traffic_001 → EMQX,Mosquitto
⚠️ OpenRemote token → HTTP Error 405: Method Not Allowed
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
✅ FROST Observation traffic_001/vehicle_count → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_001/average_speed_kmh → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_001/congestion_level → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_001/occupancy_percent → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for traffic_001, payload_mqtt exists: True
2026-05-05 17:52:29.929 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:52:29.929 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:52:29.930 INFO [130543509300928] ClientConnection:421 | [127.0.0.1:45924 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:52:29.931 INFO [130543509300928] HandlerBase:112 | [persistent://public/default/smartcity-traffic, ] Getting connection from pool
2026-05-05 17:52:29.931 INFO [130543509300928] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-traffic, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:45924 -> 127.0.0.1:6650]
2026-05-05 17:52:29.931 INFO [130543509300928] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-traffic, producerName: on [127.0.0.1:45924 -> 127.0.0.1:6650]
2026-05-05 17:52:29.932 INFO [130543509300928] ProducerImpl:222 | [persistent://public/default/smartcity-traffic, ] Created producer on broker [127.0.0.1:45924 -> 127.0.0.1:6650]
2026-05-05 17:52:29.932 INFO [130543509300928] HandlerBase:134 | Finished connecting to broker after 0 ms
2026-05-05 17:52:29.934 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:52:29.934 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-traffic, standalone-0-526] Closing producer for topic persistent://public/default/smartcity-traffic
2026-05-05 17:52:29.935 INFO [130543509300928] ProducerImpl:767 | [persistent://public/default/smartcity-traffic, standalone-0-526] Closed producer 0
2026-05-05 17:52:29.935 INFO [130543517693632] ClientConnection:1285 | [127.0.0.1:45924 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:52:29.935 INFO [130543517693632] ClientConnection:301 | [127.0.0.1:45924 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
🐟 Redpanda: ✅
📤 city/sensors/traffic/traffic_002 → EMQX,Mosquitto
⚠️ OpenRemote token → HTTP Error 405: Method Not Allowed
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
📈 InfluxDB: 4 points written
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
✅ FROST Observation traffic_002/vehicle_count → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_002/average_speed_kmh → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_002/congestion_level → OK (cached)
📊 FROST: ✅
✅ FROST Observation traffic_002/occupancy_percent → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for traffic_002, payload_mqtt exists: True
2026-05-05 17:52:31.371 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:52:31.371 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:52:31.372 INFO [130543868950208] ClientConnection:421 | [127.0.0.1:45928 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:52:31.375 INFO [130543868950208] HandlerBase:112 | [persistent://public/default/smartcity-traffic, ] Getting connection from pool
2026-05-05 17:52:31.376 INFO [130543868950208] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-traffic, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:45928 -> 127.0.0.1:6650]
2026-05-05 17:52:31.376 INFO [130543868950208] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-traffic, producerName: on [127.0.0.1:45928 -> 127.0.0.1:6650]
2026-05-05 17:52:31.377 INFO [130543868950208] ProducerImpl:222 | [persistent://public/default/smartcity-traffic, ] Created producer on broker [127.0.0.1:45928 -> 127.0.0.1:6650]
2026-05-05 17:52:31.377 INFO [130543868950208] HandlerBase:134 | Finished connecting to broker after 1 ms
2026-05-05 17:52:31.379 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:52:31.379 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-traffic, standalone-0-527] Closing producer for topic persistent://public/default/smartcity-traffic
2026-05-05 17:52:31.380 INFO [130543868950208] ProducerImpl:767 | [persistent://public/default/smartcity-traffic, standalone-0-527] Closed producer 0
2026-05-05 17:52:31.380 INFO [130543509300928] ClientConnection:1285 | [127.0.0.1:45928 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:52:31.380 INFO [130543509300928] ClientConnection:301 | [127.0.0.1:45928 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
🐟 Redpanda: ✅
📤 city/sensors/airquality/airquality_003 → EMQX,Mosquitto
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
📈 InfluxDB: 4 points written
✅ FROST Observation airquality_003/pm25_ugm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_003/pm10_ugm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_003/no2_ugm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_003/o3_ugm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_003/co_mgm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_003/temperature_celsius → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_003/humidity_percent → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for airquality_003, payload_mqtt exists: True
2026-05-05 17:52:33.516 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:52:33.516 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:52:33.516 INFO [130543517693632] ClientConnection:421 | [127.0.0.1:45938 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:52:33.518 INFO [130543517693632] HandlerBase:112 | [persistent://public/default/smartcity-airquality, ] Getting connection from pool
2026-05-05 17:52:33.518 INFO [130543517693632] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-airquality, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:45938 -> 127.0.0.1:6650]
2026-05-05 17:52:33.518 INFO [130543517693632] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-airquality, producerName: on [127.0.0.1:45938 -> 127.0.0.1:6650]
2026-05-05 17:52:33.519 INFO [130543517693632] ProducerImpl:222 | [persistent://public/default/smartcity-airquality, ] Created producer on broker [127.0.0.1:45938 -> 127.0.0.1:6650]
2026-05-05 17:52:33.519 INFO [130543517693632] HandlerBase:134 | Finished connecting to broker after 1 ms
2026-05-05 17:52:33.521 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:52:33.521 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-airquality, standalone-0-528] Closing producer for topic persistent://public/default/smartcity-airquality
2026-05-05 17:52:33.521 INFO [130543517693632] ProducerImpl:767 | [persistent://public/default/smartcity-airquality, standalone-0-528] Closed producer 0
2026-05-05 17:52:33.522 INFO [130543868950208] ClientConnection:1285 | [127.0.0.1:45938 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:52:33.522 INFO [130543868950208] ClientConnection:301 | [127.0.0.1:45938 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
📈 InfluxDB: 7 points written
⚠️ Redpanda → timed out
🐟 Redpanda: ❌
📤 city/sensors/airquality/airquality_004 → EMQX,Mosquitto
🏠 OpenRemote: ⚠️ skipped
🌐 Orion-LD: ✅ (HTTP 204 updated)
🌐 Orion-LD: ✅
🏢 Stellio: ✅ (HTTP 204 updated)
🏢 Stellio: ✅
✅ FROST Observation airquality_004/pm25_ugm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_004/pm10_ugm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_004/no2_ugm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_004/o3_ugm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_004/co_mgm3 → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_004/temperature_celsius → OK (cached)
📊 FROST: ✅
✅ FROST Observation airquality_004/humidity_percent → OK (cached)
📊 FROST: ✅
📈 InfluxDB: ✅
🌪️ DEBUG: calling publish_pulsar for airquality_004, payload_mqtt exists: True
2026-05-05 17:52:41.983 INFO [130544186099520] ClientConnection:209 | [<none> -> pulsar://localhost:6650] Create ClientConnection, timeout=10000
2026-05-05 17:52:41.983 INFO [130544186099520] ConnectionPool:148 | Created connection for pulsar://localhost:6650-pulsar://localhost:6650-0
2026-05-05 17:52:41.983 INFO [130543509300928] ClientConnection:421 | [127.0.0.1:42852 -> 127.0.0.1:6650] Connected to broker
2026-05-05 17:52:41.986 INFO [130543509300928] HandlerBase:112 | [persistent://public/default/smartcity-airquality, ] Getting connection from pool
2026-05-05 17:52:41.986 INFO [130543509300928] BinaryProtoLookupService:85 | Lookup response for persistent://public/default/smartcity-airquality, lookup-broker-url pulsar://localhost:6650, from [127.0.0.1:42852 -> 127.0.0.1:6650]
2026-05-05 17:52:41.986 INFO [130543509300928] ProducerImpl:148 | Creating producer for topic:persistent://public/default/smartcity-airquality, producerName: on [127.0.0.1:42852 -> 127.0.0.1:6650]
2026-05-05 17:52:41.987 INFO [130543509300928] ProducerImpl:222 | [persistent://public/default/smartcity-airquality, ] Created producer on broker [127.0.0.1:42852 -> 127.0.0.1:6650]
2026-05-05 17:52:41.987 INFO [130543509300928] HandlerBase:134 | Finished connecting to broker after 1 ms
2026-05-05 17:52:41.991 INFO [130544186099520] ClientImpl:718 | Closing Pulsar client with 1 producers and 0 consumers
2026-05-05 17:52:41.991 INFO [130544186099520] ProducerImpl:803 | [persistent://public/default/smartcity-airquality, standalone-0-529] Closing producer for topic persistent://public/default/smartcity-airquality
2026-05-05 17:52:41.991 INFO [130543509300928] ProducerImpl:767 | [persistent://public/default/smartcity-airquality, standalone-0-529] Closed producer 0
2026-05-05 17:52:41.992 INFO [130543517693632] ClientConnection:1285 | [127.0.0.1:42852 -> 127.0.0.1:6650] Connection disconnected (refCnt: 4)
2026-05-05 17:52:41.992 INFO [130543517693632] ClientConnection:301 | [127.0.0.1:42852 -> 127.0.0.1:6650] Destroyed connection to pulsar://localhost:6650-0
🌪️ Pulsar: ✅
📈 InfluxDB: 7 points written

40128
simulator_nohup.log Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

479211
simulator_run.log Normal file

File diff suppressed because it is too large Load Diff

29
telegraf.conf Normal file
View File

@@ -0,0 +1,29 @@
[global_tags]
[agent]
interval = "10s"
round_interval = true
metric_batch_size = 1000
metric_buffer_limit = 10000
collection_jitter = "0s"
flush_interval = "10s"
flush_jitter = "0s"
# Input: MQTT Consumer
[[inputs.mqtt_consumer]]
servers = ["tcp://emqx_emqx_1:1883"]
topics = [
"airquality/#",
"traffic/#",
"sensor/#",
"smartcity/#"
]
data_format = "json"
qos = 0
# Output: InfluxDB v2
[[outputs.influxdb_v2]]
urls = ["http://smart-city-influxdb:8086"]
token = "my-super-token"
organization = "digitribe"
bucket = "smartcity"