Language first. Signals second. Safety always.
A minimal, standard‑library Python gateway that polls infrastructure read‑only, normalizes operators + currencies into canonical tokens, and exposes results over a clean HTTP surface—ready for observability and ClickHouse ingestion.
⬇️ Downloads
- Dev build (ZIP): solveforce-code-20250819-054125.zip
- Single‑file runner: solveforce_gateway_single.py
- SHA‑256 (ZIP):
fef17c50dd6af27d2a1784336b0c3a6b85965723bd87ea2cb5438b1a19f0964a
Requires: Python 3.8+ (no external dependencies)
✨ What it does (at a glance)
- 🔒 Safe by default: all built‑ins are read‑only; writes require explicit code.
- 🔤 Language‑centric normalization:
/translateconverts+ − × ÷ = ≈ < ≤ > ≥ ^ %and currency symbols ($ € £ ¥ ₩ ₹ ₿ …) into canonical tokens (+ - * / = ~,<USD>,<EUR>, etc.). - 🌐 HTTP surface (no frameworks):
/health,/adapters,/results/latest,/translate,/metrics. - 🗂️ Adapter model: drop‑in modules for heartbeat, band plans, IEC‑61850 path helper; stubs for SNMP/NETCONF/gNMI/OpenADR/IEC‑61850/DNP3/TM Forum.
- 📈 Observability: Prometheus text at
/metricsand JSONL exports (JSONEachRow) for ClickHouse. - 🛡️ Orthography = safety: semantics ride with the signal; everything spelled, typed, and auditable.
🚀 Quick start
# Option A: full scaffold
unzip solveforce-code-20250819-054125.zip
cd solveforce-code
python ucls_infra_gateway.py --config config.example.json
# Open: http://127.0.0.1:8080/health
# Option B: single-file runner
python solveforce_gateway_single.py --host 127.0.0.1 --port 8080 --poll 5
🔌 Endpoints
| Method | Path | Purpose | Example |
|---|---|---|---|
| GET | /health | Heartbeat, UTC time, uptime | /health |
| GET | /adapters | Enabled adapters + state | /adapters |
| GET | /results/latest | Latest payloads per adapter | /results/latest |
| GET | /translate?q=... | Currency + operator normalization | /translate?q=$199.99+VAT=€210≈ |
| GET | /metrics | Prometheus exposition (text) | /metrics |
⚙️ Configuration (edit config.example.json)
{
"http": {"host": "127.0.0.1", "port": 8080},
"poll_interval_sec": 5,
"adapters": [
{"name": "heartbeat", "enabled": true},
{"name": "currency_operator", "enabled": true, "config": {"load_currency_sample": true}},
{"name": "bandplan", "enabled": true, "config": {
"bandplan_files": ["solveforce_gateway/data/bandplans/US_FCC_2.4_5.json"]
}},
{"name": "iec61850_helper", "enabled": true}
],
"exports": {
"enable_prometheus": true,
"export_jsonl": true,
"export_dir": "exports"
}
}
🧰 Included adapters (read‑only)
- heartbeat — proof‑of‑life sequence + timestamps
- currency_operator — math operator + currency symbol normalizer; shows example parse
- bandplan — sample US FCC 2.4/5 GHz (inc. DFS) with channels
- iec61850_helper — parses
MMXU1.A.phsA.cVal.mag.fstyle LN/DO/DA path components
Stubs you can wire next
snmp, netconf, gnmi, openadr, iec61850, dnp3, tmforum
Keep them read‑only: poll/get/subscribe only; no control ops; explicit capability allowlists.
🧭 How to extend (drop‑in pattern)
Create solveforce_gateway/adapters/my_adapter.py:
from ..core import AdapterInterface
class MyAdapter(AdapterInterface):
NAME = "my_adapter"
def poll(self):
self.seq += 1
return {"seq": self.seq, "payload": "hello, world"}
Enable it in the config:
{"name": "my_adapter", "enabled": true}
The manager will handle polling, /results/latest, /adapters, /metrics, and JSONL export.
🔍 Observability & exports
- Prometheus scrape:
GET /metrics - ClickHouse ingest:
exports/*.jsonlwithJSONEachRow(e.g.,CREATE TABLE gw_heartbeat ... ENGINE=MergeTree)
🛡️ Safety posture
- Read‑only adapters by design; any write requires a new adapter with explicit verbs.
- Short‑lived sessions for network protocols; no stored credentials in code; keep secrets in env/keystore.
- Canonical tokens prevent silent ambiguity (
−vs-,×vs*,$vsA$|C$|NZ$).
🗺️ Roadmap (wire‑up sequence)
- SNMP (ifTable, sysUpTime, optics DOM, CPU/mem)
- NETCONF
<get>trees (noedit-config) - gNMI subscribe/get (read‑only)
- OpenADR 2.0b / IEEE 2030.5 (VEN polling, no control)
- IEC‑61850 MMS reads using the path helper for LN/DO/DA traversal
- DNP3 class scans (no control ops, no restarts)
- TM Forum Open APIs (Service/ResourceInventory, TroubleTicket—GET only)
- Global band plans + CLDR script allowlists for IDNs/brand TLD bundles
🪪 License & attribution
- MIT License — © 2025 Ronald Joseph Legarski, Jr.
- Published by: SolveForce (Nationwide & International Services)
📞 Contact SolveForce
(888) 765‑8301 • SolveForce Communications — Telecom & Technology Solutions
From smart grids to edge, from language to energy, we unify signals with sense.
🧠 Why this matters (the recursive bit)
Language orders the network; the network carries language. By spelling every signal (operators, currencies, paths) in one canonical grammar, we make infrastructure legible, interoperable, and auditable—from substations to routers to ledgers. Meaning travels with the measurement.
🧰 Troubleshooting
- Port in use? Change
"port"inconfig.example.json. - No Python 3.8+?
pyenvor system package upgrade recommended. - No data under
/results/latest? Ensure the adapter is"enabled": trueand wait one poll interval. - Metrics empty? Hit
/healthfirst, then/metricsto verify counters advance.
“Speak, and the network listens; listen, and the network spells back in order.”