{"id":34113633,"url":"https://github.com/eosti/k3ng-rotator-python","last_synced_at":"2026-04-02T01:03:45.588Z","repository":{"id":229527070,"uuid":"776962596","full_name":"eosti/k3ng-rotator-python","owner":"eosti","description":"Python Controller for the K3NG Antenna Rotator","archived":false,"fork":false,"pushed_at":"2025-02-20T02:42:19.000Z","size":81,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-17T03:19:23.363Z","etag":null,"topics":["antenna","k3ng","rotator","rotator-controller","satellite"],"latest_commit_sha":null,"homepage":"","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/eosti.png","metadata":{"files":{"readme":"README.md","changelog":null,"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}},"created_at":"2024-03-24T22:54:07.000Z","updated_at":"2025-02-20T02:42:23.000Z","dependencies_parsed_at":"2024-03-25T00:21:24.586Z","dependency_job_id":"27596fb1-4cb6-4a6f-ab4b-989b21eccfb4","html_url":"https://github.com/eosti/k3ng-rotator-python","commit_stats":null,"previous_names":["eosti/k3ng-rotator-python"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/eosti/k3ng-rotator-python","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eosti%2Fk3ng-rotator-python","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eosti%2Fk3ng-rotator-python/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eosti%2Fk3ng-rotator-python/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eosti%2Fk3ng-rotator-python/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eosti","download_url":"https://codeload.github.com/eosti/k3ng-rotator-python/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eosti%2Fk3ng-rotator-python/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31293631,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T21:15:39.731Z","status":"ssl_error","status_checked_at":"2026-04-01T21:15:34.046Z","response_time":53,"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":["antenna","k3ng","rotator","rotator-controller","satellite"],"created_at":"2025-12-14T19:16:36.557Z","updated_at":"2026-04-02T01:03:45.579Z","avatar_url":"https://github.com/eosti.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# K3NG Rotator Python Controller\nA Python wrapper for controlling a [K3NG Rotator Controller](https://github.com/k3ng/k3ng_rotator_controller) over serial/USB. \nThis code has a specific bend towards satellite control, as the primary use for us is tracking the [HERON MkII](https://heron.utat.space/) satellite. \n\n## Installing\nDependencies are managed by `poetry`: `poetry install` to get 'em all. \nPoetry automatically creates a venv instead of installing globally, this is usually a good thing!\nFor most stuff, this is all you need. \n\nIf, for whatever reason, you need this available globally, you *can* run `pip3 install . --break-system-packages`, but this carries risks as the command implies. \n\nTo install development dependencies, use `poetry install --with=dev`\n\n## Usage\nSee `/examples` for various ways to control the rotator. \nIt may be useful to use `udev` rules to always map the Arduino connected to the rotator to a more meaningful serial devices (such as `/dev/ttyRotator`), especially if you have multiple serial devices which can change designators across boot. \nIn my experience, the Arduino can be pretty finicky around its serial connection and not constantly resetting -- tweak the `SEND_DELAY` and `RECV_DELAY` variables in `k3ng.py` if you're having issues with that.\n\nFor testing and development, the usage of `ipython` is reccomended. \nThere is a useful starter script located in `/examples` that can help you get started: `ipython3 -i ipython_start.py /dev/tty12345`\n\nPlease note: each time a script is run and a new `K3NG` object is instantiated, the Arduino will reset! \nThis will lose the current time, stored state, and stored TLEs. \nThis is a limitation of Arduinos, not this script; generally this is considered a feature but clearly there are some downsides.\n\n## RPC\nIn some cases, it may be useful to have a single persistent serial connection to avoid the aforementioned resets whenever a new connection is created. \nFor that reason, this repo provides the ability to run a RPC server as a service on Linux machines. \n\nTo install the script, you can use the `install.sh` script in the `/rpc_daemon` directory. \nBe warned, it's a pretty risky script with few safeguards and assumes a somewhat specific configuration. \nUse at your own risk! \n\nThe service installs itself as `k3ng_rotator`, and can be checked on using `sudo systemctl status k3ng_rotator`. \nBy default, it tries to connect to `/dev/ttyRotator`, and binds to port `18866`. \n\nUsing it in this remote state is designed to be plug and play with standard local usage. \nInstead of calling something like `rot = K3NG(\"/dev/ttyRotator\")`, instead create an RPC connection:\n\n```python\nimport rpyc\nrot = rpyc.connect(\"localhost\", args.rpc_port).root.k3ng\n```\n\nOnce initialized in this way, the K3NG object is exactly the same as if it was running locally, but `rpyc` will be handling back-and-forth behind the scenes. \nPretty neat!\n(ok, not exactly the same, for example tab completion doesn't work quite right currently...)\n\nAgain, for development, it is useful to use `ipython`, and in `/examples` there is another helper script for RPC environments: `ipython3 -i ipython_start_rpc.py`\n\n## Contributing\nIssues and PRs are always welcome! \nIf contributing code, please first run the linting + style suite as follows: `isort . \u0026\u0026 black . \u0026\u0026 flake8 . \u0026\u0026 mypy .`. \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feosti%2Fk3ng-rotator-python","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feosti%2Fk3ng-rotator-python","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feosti%2Fk3ng-rotator-python/lists"}