{"id":37933213,"url":"https://github.com/totonga/ods-exd-api-box","last_synced_at":"2026-02-03T21:12:53.782Z","repository":{"id":332218594,"uuid":"1132975630","full_name":"totonga/ods-exd-api-box","owner":"totonga","description":"Helper package to build ASAM ODS EXD API grpc plugins.","archived":false,"fork":false,"pushed_at":"2026-01-20T19:14:21.000Z","size":70,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-21T04:24:37.957Z","etag":null,"topics":["asam","data-analysis","grpc","grpc-server","ods","plugin","python"],"latest_commit_sha":null,"homepage":"https://github.com/totonga/ods-exd-api-box","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/totonga.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-12T17:54:00.000Z","updated_at":"2026-01-20T19:11:45.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/totonga/ods-exd-api-box","commit_stats":null,"previous_names":["totonga/ods-exd-api-box"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/totonga/ods-exd-api-box","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/totonga%2Fods-exd-api-box","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/totonga%2Fods-exd-api-box/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/totonga%2Fods-exd-api-box/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/totonga%2Fods-exd-api-box/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/totonga","download_url":"https://codeload.github.com/totonga/ods-exd-api-box/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/totonga%2Fods-exd-api-box/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29057243,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-03T20:13:53.544Z","status":"ssl_error","status_checked_at":"2026-02-03T20:13:40.507Z","response_time":96,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asam","data-analysis","grpc","grpc-server","ods","plugin","python"],"created_at":"2026-01-16T17:37:18.552Z","updated_at":"2026-02-03T21:12:53.773Z","avatar_url":"https://github.com/totonga.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ASAM ODS EXD-API for NI TDMS Files\n\n[![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org/downloads/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n[![Type checking: mypy](https://img.shields.io/badge/type%20checking-mypy-blue.svg)](http://mypy-lang.org/)\n\n## ASAM ODS EXD-API Architecture\n\n```mermaid\nsequenceDiagram\n\nactor CLIENT as Client\nparticipant PDTT as 🛠️Importer\nparticipant PODS as 🗃️ASAM ODS server\nparticipant PLUGIN as 📊EXD-API plugin\nparticipant FILE as 🗂️File Storage\n\nautonumber\n\nopt Import phase\n  FILE -\u003e\u003e+ PDTT: New file shows up\n  PDTT -\u003e\u003e+ PLUGIN : Get Structure\n  PLUGIN -\u003e FILE: Extract content information\n  PLUGIN -\u003e\u003e PLUGIN: Create Structure\n  PLUGIN -\u003e\u003e- PDTT: Return Structure\n  PDTT -\u003e\u003e PODS: Import ODS structure\n  Note right of PDTT: Create hierarchy\u003cbr/\u003eAoTest,AoMeasurement,...\n  PDTT -\u003e\u003e- PODS: Add External Data info\n  Note right of PDTT: Attach AoFile ... for external data\u003cbr/\u003eAoFile,AoSubmatrix,AoLocalColumn,...\nend\n\nNote over CLIENT, FILE: Now we can work with the imported files\n\nloop Runtime phase\n  CLIENT -\u003e\u003e PODS: Establish ODS session\n  CLIENT -\u003e\u003e PODS: Work with meta data imported from structure\n  CLIENT -\u003e\u003e PODS: Access external channel in preview\n  PODS -\u003e\u003e PLUGIN: GetValues\n  PLUGIN -\u003e\u003e FILE: Get Channel values\n  PLUGIN -\u003e\u003e PODS: Return values of channels\n  PODS -\u003e\u003e CLIENT: Return values needed for plot\nend\n```\n\n## Configuration \u0026 Usage\n\n### Server Options\n\n```bash\npython external_data_file.py --help\n```\n\nKey configuration options:\n\n| Option | Env Variable | Default | Description |\n|--------|--------------|---------|-------------|\n| `--port` | `ODS_EXD_API_PORT` | `50051` | Port to run gRPC server on |\n| `--verbose` | `ODS_EXD_API_VERBOSE` | `False` | Enable debug logging |\n| `--bind-address` | `ODS_EXD_API_BIND_ADDRESS` | `[::]` | Address to bind gRPC server to |\n| `--max-workers` | `ODS_EXD_API_MAX_WORKERS` | `2 × CPU count` | Maximum number of worker threads |\n| `--max-concurrent-streams` | `ODS_EXD_API_MAX_CONCURRENT_STREAMS` | `None` | Maximum concurrent gRPC streams |\n| `--max-send-message-length` | `ODS_EXD_API_MAX_SEND_MESSAGE_LENGTH` | `512` | Max send message length (MB) |\n| `--max-receive-message-length` | `ODS_EXD_API_MAX_RECEIVE_MESSAGE_LENGTH` | `32` | Max receive message length (MB) |\n| `--use-tls` | `ODS_EXD_API_USE_TLS` | `False` | Enable TLS/SSL |\n| `--tls-cert-file` | `ODS_EXD_API_TLS_CERT_FILE` | `None` | Path to server certificate (PEM) |\n| `--tls-key-file` | `ODS_EXD_API_TLS_KEY_FILE` | `None` | Path to server private key (PEM) |\n| `--tls-client-ca-file` | `ODS_EXD_API_TLS_CLIENT_CA_FILE` | `None` | CA bundle for client verification |\n| `--require-client-cert` | `ODS_EXD_API_REQUIRE_CLIENT_CERT` | `False` | Require valid client certificate |\n| `--health-check-enabled` | `ODS_EXD_API_HEALTH_CHECK_ENABLED` | `False` | Enable health check service |\n| `--health-check-bind-address` | `ODS_EXD_API_HEALTH_CHECK_BIND_ADDRESS` | `[::]` | Health check service bind address |\n| `--health-check-port` | `ODS_EXD_API_HEALTH_CHECK_PORT` | `50052` | Health check service port |\n| `--env-prefix` | - | `ODS_EXD_API_` | Environment variable prefix for multi-instance deployments |\n\n#### Configuration Priority\n\nValues are resolved in this order (highest to lowest priority):\n1. Command line arguments\n2. Environment variables\n3. Default values\n\n### TLS Configuration\n\n**Basic TLS:**\n\n```bash\npython external_data_file.py \\\n  --use-tls \\\n  --tls-cert-file /path/to/server.crt \\\n  --tls-key-file /path/to/server.key\n```\n\n**Mutual TLS (mTLS):**\n\n```bash\npython external_data_file.py \\\n  --use-tls \\\n  --tls-cert-file /path/to/server.crt \\\n  --tls-key-file /path/to/server.key \\\n  --tls-client-ca-file /path/to/client-ca.crt \\\n  --require-client-cert\n```\n\n**Docker with TLS:**\n\n```bash\ndocker run \\\n  -v /path/to/certs:/certs \\\n  -p 50051:50051 \\\n  ghcr.io/totonga/asam-ods-exd-api-nptdms:latest \\\n  --use-tls \\\n  --tls-cert-file /certs/server.crt \\\n  --tls-key-file /certs/server.key\n```\n\n## Development\n\n### Setup Development Environment\n\n```bash\n# Install with development dependencies\npip install -e \".[dev]\"\n```\n\n### Type Checking\n\n```bash\nmypy .\n```\n\n### Running Tests\n\n```bash\npython -m unittest discover -s tests\n```\n\n### Running Docker Integration Tests\n\n```bash\npython -m unittest tests.test_docker_integration -v\n```\n\n### Code Style\n\nThe project uses:\n- **Black** for code formatting\n- **isort** for import sorting\n- **Pylint** for linting\n- **Mypy** for static type checking\n\n### Updating Protocol Buffers\n\nThe protobuf files are generated from the ASAM ODS standard specifications:\n\n```bash\n# Download latest proto files\ncurl -o ods.proto https://raw.githubusercontent.com/asam-ev/ASAM-ODS-Interfaces/main/ods.proto\ncurl -o ods_external_data.proto https://raw.githubusercontent.com/asam-ev/ASAM-ODS-Interfaces/main/ods_external_data.proto\n\n# Generate Python stubs\nmkdir -p ods_exd_api_box/proto\npython3 -m grpc_tools.protoc \\\n  -I. \\\n  --python_out=ods_exd_api_box/proto/. \\\n  --pyi_out=ods_exd_api_box/proto/. \\\n  --grpc_python_out=ods_exd_api_box/proto/. \\\n  ods.proto ods_external_data.proto\n```\n\n## Performance Considerations\n\n- **File Caching** - Opened files are cached to minimize I/O operations\n- **Reference Counting** - Automatic resource cleanup with reference counting\n- **Thread Pool** - Configurable worker threads for parallel request handling\n- **Message Size Limits** - Configurable max send/receive message sizes\n\n## Troubleshooting\n\n### Connection Refused\n\nEnsure the server is running and listening on the correct port:\n\n```bash\nnetstat -tlnp | grep 50051\n```\n\n### TLS Certificate Errors\n\nVerify certificate paths and permissions:\n\n```bash\nopenssl x509 -in /path/to/cert.crt -text -noout\n```\n\n### Type Checking Failures\n\nEnsure all dependencies are installed with type stubs:\n\n```bash\npip install -e \".[dev]\"\nmypy .\n```\n\n## Contributing\n\nContributions are welcome! Please:\n\n0. Use dev container or set up local dev environment\n1. Ensure type checking passes: `mypy .\n2. Run tests: `python -m unittest discover -s tests`\n3. Follow code style (Black, isort)\n4. Add tests for new features\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\n## References\n\n- [ASAM ODS Standard](https://www.asam.net/standards/detail/ods/)\n- [ASAM ODS GitHub Repository](https://github.com/asam-ev/ASAM-ODS-Interfaces)\n- [gRPC Documentation](https://grpc.io/docs/)\n- [Peak-Solution Data Management Learning Path](https://peak-solution.github.io/data_management_learning_path/exd_api/overview.html)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftotonga%2Fods-exd-api-box","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftotonga%2Fods-exd-api-box","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftotonga%2Fods-exd-api-box/lists"}