You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
After announcing python-oa3 and python-oa3-client to OpenADR 3 colleagues, we learned about a similar project: openadr3-client by ElaadNL. This discussion summarizes the two approaches.
The Projects
python-oa3 + python-oa3-client
openadr3-client (ElaadNL)
Author
Clark Communications Corporation
ElaadNL (Dutch DSO research institute)
License
MIT
Apache-2.0 (REUSE compliant)
Python
3.10–3.13
3.12+ only
Spec versions
3.1.0
3.0.1 and 3.1.0
Architecture
Two-layer: low-level library + client framework
Single monolithic package
HTTP library
httpx
requests
Package count
2 (openadr3, openadr3-client)
1 (openadr3-client)
LOC
~2,500
~8,900
Design Philosophy
grid-coordination (python-oa3 stack) — Minimalist, composable, Clojure-influenced. Two distinct layers:
python-oa3: Raw HTTP + Pydantic models with a novel two-layer entity system (raw camelCase wire format preserved alongside coerced snake_case typed models). Pendulum for time, Decimal for monetary values. Optional OpenAPI spec introspection for route/scope discovery.
python-oa3-client: VEN/BL lifecycle, MQTT/webhook notification channels, mDNS/DNS-SD discovery. Delegates all API calls to python-oa3 via __getattr__.
ElaadNL (openadr3-client) — Enterprise-grade, comprehensive, single package. Emphasizes type safety and immutability:
Frozen Pydantic models throughout (no accidental mutations)
Validator plugin architecture for extensible domain rules
Pandas integration for data science / analytics use cases
Heavier test infrastructure (real containerized VTNs)
REUSE license compliance (SPDX headers on every file)
More established CI/quality toolchain (mypy, bandit, ruff)
Overlap and Potential Collaboration
Both projects:
Are manually written (not code-generated)
Use Pydantic v2 for models
Use Hatchling for packaging
Support OAuth2 client credentials
Cover BL and VEN client roles
Support MQTT notifications
Are alpha-stage
The biggest complementary gaps: grid-coordination has mDNS + webhooks + VTN-RI quirk handling that ElaadNL lacks; ElaadNL has 3.0.1 support + pandas + plugin validation that grid-coordination lacks. There’s a reasonable argument for convergence on the model layer while keeping client-level features as optional extras.
Feedback and corrections welcome — especially from the ElaadNL team if they spot inaccuracies.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
After announcing python-oa3 and python-oa3-client to OpenADR 3 colleagues, we learned about a similar project: openadr3-client by ElaadNL. This discussion summarizes the two approaches.
The Projects
openadr3,openadr3-client)openadr3-client)Design Philosophy
grid-coordination (python-oa3 stack) — Minimalist, composable, Clojure-influenced. Two distinct layers:
__getattr__.ElaadNL (openadr3-client) — Enterprise-grade, comprehensive, single package. Emphasizes type safety and immutability:
Key Differentiators
._rawPrivateAttr on every entityDecimalcoercion for PRICE/USAGE payloadsfrozen=True)_openadr3._tcp.)ebus-mqtt-client(optional extra)paho-mqtt(optional extra)Strengths by Project
grid-coordination strengths:
ElaadNL strengths:
Overlap and Potential Collaboration
Both projects:
The biggest complementary gaps: grid-coordination has mDNS + webhooks + VTN-RI quirk handling that ElaadNL lacks; ElaadNL has 3.0.1 support + pandas + plugin validation that grid-coordination lacks. There’s a reasonable argument for convergence on the model layer while keeping client-level features as optional extras.
Feedback and corrections welcome — especially from the ElaadNL team if they spot inaccuracies.
Beta Was this translation helpful? Give feedback.
All reactions