1. The Problem

TBD

2. The Solution

2.1 Overview

2.2 Logical Diagram (high level)


<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 600" width="100%" height="auto" role="img" aria-label="DataHub with Historian and Edge Sites">
  <defs>
    <style>
      text{font-family: ui-sans-serif, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Noto Sans", "Liberation Sans", sans-serif; font-size:16px; fill:#111}
      .sub{fill:#333; font-size:15px}
      .box{fill:#f9f9f9; stroke:#333; rx:10; ry:10}
      .outer{fill:#fff; stroke:#ccc; rx:16; ry:16}
      .cap{font-weight:600}
    </style>
    <marker id="arrow" markerWidth="10" markerHeight="7" refX="10" refY="3.5" orient="auto" markerUnits="strokeWidth">
      <polygon points="0 0, 10 3.5, 0 7" fill="#333"></polygon>
    </marker>
  </defs>

  <!-- background -->
  <rect class="outer" x="0" y="0" width="1200" height="600"></rect>

  <!-- Top: DataHub -->
  <rect class="box" x="420" y="40" width="360" height="70"></rect>
  <text x="432" y="84" class="cap">[ DataHub (TapProvider)/UI ]</text>

  <!-- Spine -->
  <line x1="600" y1="110" x2="600" y2="160" stroke="#333"></line>
  <line x1="120" y1="160" x2="1080" y2="160" stroke="#333"></line>

  <!-- Left leg -->
  <line x1="200" y1="160" x2="200" y2="340" stroke="#333"></line>
  <text x="240" y="250" class="sub">reads historical + alarms</text>

  <!-- Right leg -->
  <line x1="980" y1="160" x2="980" y2="300" stroke="#333"></line>
  <text x="820" y="250" class="sub">reads live device values</text>

  <!-- Left box -->
  <rect class="box" x="80" y="340" width="420" height="160"></rect>
  <text x="92" y="364" class="cap">[ Postgres + TimescaleDB ]</text>
  <text x="100" y="392" class="sub">Historian + Alarms</text>

  <!-- Right box -->
  <rect class="box" x="700" y="300" width="420" height="220"></rect>
  <text x="712" y="324" class="cap">[ Edge Sites ×5 ]</text>
  <text x="720" y="352" class="sub">• FrameworX EdgeConnect</text>
  <text x="720" y="376" class="sub">• Collects Modbus (read)</text>
  <text x="720" y="400" class="sub">• Publishes to DNP3 (write)</text>
  <text x="720" y="424" class="sub">• Exposes device values (read)</text>
  <text x="720" y="448" class="sub">• Sends timeseries/alarms ? Historian</text>

  <!-- Arrow (Edge -> Historian) -->
  <line x1="700" y1="410" x2="500" y2="410" stroke="#333" marker-end="url(#arrow)"></line>
</svg>


Expanded flow:

2.3 Architecture Summary

2.4 Redundancy & Store-and-Forward

3. Key Enablers

4. The Results

TBD