pyobs-alpaca 2.0.0.dev6__tar.gz → 2.0.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyobs_alpaca-2.0.2/CHANGELOG.md +178 -0
- pyobs_alpaca-2.0.2/CONTRIBUTING.md +35 -0
- pyobs_alpaca-2.0.2/PKG-INFO +81 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/pyobs_alpaca/dome.py +25 -2
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/pyobs_alpaca/focuser.py +7 -4
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/pyproject.toml +9 -2
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/uv.lock +39 -39
- pyobs_alpaca-2.0.0.dev6/CHANGELOG.rst +0 -2
- pyobs_alpaca-2.0.0.dev6/PKG-INFO +0 -10
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/.flake8 +0 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/.github/dependabot.yml +0 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/.github/workflows/dependabot-automerge.yml +0 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/.github/workflows/pypi.yml +0 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/.github/workflows/pyrefly.yml +0 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/.github/workflows/pytest.yml +0 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/.github/workflows/ruff.yml +0 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/.pre-commit-config.yaml +0 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/.readthedocs.yml +0 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/LICENSE +0 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/README.md +0 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/docs/Makefile +0 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/docs/make.bat +0 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/docs/requirements.txt +0 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/docs/source/_static/pyobs.gif +0 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/docs/source/conf.py +0 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/docs/source/index.rst +0 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/pyobs_alpaca/__init__.py +0 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/pyobs_alpaca/device.py +0 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/pyobs_alpaca/telescope.py +0 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/tests/test_cooperative_init.py +0 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/tests/test_device.py +0 -0
- {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/tests/test_import.py +0 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
Entries for releases before this file existed were generated from commit subjects.
|
|
9
|
+
|
|
10
|
+
## [2.0.1] - 2026-09-03
|
|
11
|
+
|
|
12
|
+
- Add DOMESHUT FITS header; adopt FocuserHeaderMixin for FOCOFF (#872)
|
|
13
|
+
|
|
14
|
+
## [2.0.0] - 2026-08-26
|
|
15
|
+
|
|
16
|
+
- Require stable pyobs-core>=2.0.0
|
|
17
|
+
- Gate auto-merge on the PR author, not the event actor
|
|
18
|
+
- Enable Dependabot auto-merge for patch/minor updates
|
|
19
|
+
- Lock DEVICE_INIT_KWARGS/OBJECT_SHARED_KWARGS against real constructor signatures
|
|
20
|
+
- Convert AlpacaDome/AlpacaFocuser/AlpacaTelescope to cooperative super().__init__() chains
|
|
21
|
+
- Add baseline test suite and CI (pytest, pyrefly), grouped Dependabot
|
|
22
|
+
- Upgrade uv.lock to clear open Dependabot alerts
|
|
23
|
+
- Require pyobs-core>=2.0.0.dev48
|
|
24
|
+
- Add dependabot.yml, targeting develop for PRs
|
|
25
|
+
- Add TODO for register_exception rename coming in pyobs-core
|
|
26
|
+
- Update to pyobs-core 2.0.0.dev10, apply FitsHeaderEntry to get_fits_header_before
|
|
27
|
+
- Add missing docs/requirements.txt to readthedocs config
|
|
28
|
+
- Write proper README with install and configuration docs
|
|
29
|
+
- refactored Alpaca device class and modules to standardize logging, type hints, and state publishing
|
|
30
|
+
- added Ruff GitHub Action
|
|
31
|
+
- migrated to Ruff and updated `uv.lock`
|
|
32
|
+
- changing old-style type hints to new style
|
|
33
|
+
- changed underscore parameters for vfs, comm, etc
|
|
34
|
+
- renamed Object parameters (comm, observer, ...) to start with an underscore
|
|
35
|
+
- new lock file
|
|
36
|
+
|
|
37
|
+
## [1.1.2] - 2025-07-07
|
|
38
|
+
|
|
39
|
+
- .
|
|
40
|
+
- readthedocs
|
|
41
|
+
|
|
42
|
+
## [1.1.1] - 2025-07-03
|
|
43
|
+
|
|
44
|
+
- github action
|
|
45
|
+
- pre-commit
|
|
46
|
+
|
|
47
|
+
## [1.1.0] - 2025-07-03
|
|
48
|
+
|
|
49
|
+
- migrated to uv
|
|
50
|
+
|
|
51
|
+
## [1.0.3] - 2023-07-26
|
|
52
|
+
|
|
53
|
+
- updated deps
|
|
54
|
+
|
|
55
|
+
## [1.0.2] - 2023-07-26
|
|
56
|
+
|
|
57
|
+
- up to Python 3.11
|
|
58
|
+
|
|
59
|
+
## [1.0.1] - 2022-10-16
|
|
60
|
+
|
|
61
|
+
- resend open/close command every 10s
|
|
62
|
+
|
|
63
|
+
## [1.0.0] - 2022-09-13
|
|
64
|
+
|
|
65
|
+
- added license
|
|
66
|
+
|
|
67
|
+
## [0.18.0] - 2022-03-18
|
|
68
|
+
|
|
69
|
+
- changed valid states
|
|
70
|
+
|
|
71
|
+
## [0.16.6] - 2022-03-03
|
|
72
|
+
|
|
73
|
+
- check for weather in init()
|
|
74
|
+
|
|
75
|
+
## [0.16.5] - 2022-03-03
|
|
76
|
+
|
|
77
|
+
- pyobs version
|
|
78
|
+
|
|
79
|
+
## [0.16.4] - 2022-03-03
|
|
80
|
+
|
|
81
|
+
- changed handling of parking and setting offsets, closes #111, closes #101
|
|
82
|
+
- removed requests from dependencies
|
|
83
|
+
|
|
84
|
+
## [0.16.3] - 2022-02-12
|
|
85
|
+
|
|
86
|
+
- fixed bug
|
|
87
|
+
- example config
|
|
88
|
+
- added file
|
|
89
|
+
|
|
90
|
+
## [0.16.2] - 2022-01-18
|
|
91
|
+
|
|
92
|
+
- fixed all dependencies
|
|
93
|
+
|
|
94
|
+
## [0.16.1] - 2022-01-18
|
|
95
|
+
|
|
96
|
+
- fixed docstrings
|
|
97
|
+
- added basic docs
|
|
98
|
+
|
|
99
|
+
## [0.16.0] - 2022-01-14
|
|
100
|
+
|
|
101
|
+
- added exception handling
|
|
102
|
+
- set InterruptedError instead of AbortedError
|
|
103
|
+
- replaced AbortedError with builtin InterruptedError
|
|
104
|
+
- fixed exceptions
|
|
105
|
+
- reacting to abort event
|
|
106
|
+
|
|
107
|
+
## [0.15.1] - 2022-01-06
|
|
108
|
+
|
|
109
|
+
- use actual timeout
|
|
110
|
+
- added black and pre-commit to dev dependencies
|
|
111
|
+
- added .pre-commit-config.yaml
|
|
112
|
+
- running black
|
|
113
|
+
- added pyproject.toml
|
|
114
|
+
|
|
115
|
+
## [0.15.0] - 2021-12-29
|
|
116
|
+
|
|
117
|
+
- changed used Python version to 3.9
|
|
118
|
+
- replaced requests with aiohttp, #66
|
|
119
|
+
- removed self.closing in all Modules
|
|
120
|
+
- fixed bug
|
|
121
|
+
- type -> device_type and cleanup
|
|
122
|
+
- added some awaits
|
|
123
|
+
- new alpha
|
|
124
|
+
- added option for get_object & co to create object from type directly
|
|
125
|
+
- with -> async with
|
|
126
|
+
- alpha1
|
|
127
|
+
- asyncio
|
|
128
|
+
- github action
|
|
129
|
+
- changed to Poetry
|
|
130
|
+
- send OffsetsEvents when moving offset
|
|
131
|
+
- v0.14
|
|
132
|
+
- renamed IFitsHeaderProvider to IFitsHeaderBefore and get_fits_headers() to get_fits_header_before()
|
|
133
|
+
- Added type hints
|
|
134
|
+
- fixed IPointingAltAz
|
|
135
|
+
- renamed set/get_*_offsets to set/get_offsets-*
|
|
136
|
+
- renamed some interfaces (IPointing* and IOffsets*)
|
|
137
|
+
- only move when ready
|
|
138
|
+
- follow on parking
|
|
139
|
+
- don't move if in some state
|
|
140
|
+
- ignore move commands in certain states
|
|
141
|
+
- v0.13
|
|
142
|
+
- do nothing in park() if already parking
|
|
143
|
+
- allow move always
|
|
144
|
+
- allow dome to follow even if closed
|
|
145
|
+
- documentation
|
|
146
|
+
- added __module__
|
|
147
|
+
- made add_thread_func and add_child_func public
|
|
148
|
+
- updated docstrings
|
|
149
|
+
- fixed docstrings
|
|
150
|
+
- moved IMotion.Status to utils.enums.MotionStatus
|
|
151
|
+
- removed Module import from global __init__
|
|
152
|
+
- fixed types to make mypy happy
|
|
153
|
+
- fixed type hints
|
|
154
|
+
- set higher timeout for Park command
|
|
155
|
+
- correct az by 360
|
|
156
|
+
- catch all exceptions on get/put
|
|
157
|
+
- added handling ReadTimeout exception
|
|
158
|
+
- errors to warnings
|
|
159
|
+
- error handling
|
|
160
|
+
- customize parameter requested for alive ping
|
|
161
|
+
- request Connected instead of DriverVersion in connection check
|
|
162
|
+
- run Object.open() in open()
|
|
163
|
+
- logging on (dis)connect
|
|
164
|
+
- changed exception handling
|
|
165
|
+
- removed imports
|
|
166
|
+
- check connected on put
|
|
167
|
+
- status handling
|
|
168
|
+
- AlpacaDevice is not parent class any more but attribute
|
|
169
|
+
- rotate dome to az=0 on park
|
|
170
|
+
- wait for shutter
|
|
171
|
+
- no correction for az
|
|
172
|
+
- some error handling
|
|
173
|
+
- added timeout
|
|
174
|
+
- correct init position
|
|
175
|
+
- correct az by 180
|
|
176
|
+
- added dome
|
|
177
|
+
- don't correct az by 180
|
|
178
|
+
- initial commit
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Contributing to pyobs-alpaca
|
|
2
|
+
|
|
3
|
+
Thanks for your interest in contributing. Bug reports, questions and pull requests are welcome.
|
|
4
|
+
|
|
5
|
+
## Reporting issues
|
|
6
|
+
|
|
7
|
+
Please use the [issue tracker](https://github.com/pyobs/pyobs-alpaca/issues). For a bug, include what you did, what you expected, what happened instead, and the version you are running. For larger changes, open an issue first so we can agree on the approach before you spend time on code.
|
|
8
|
+
|
|
9
|
+
## Development setup
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
uv sync
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Making a change
|
|
16
|
+
|
|
17
|
+
1. Fork the repository and create a branch from `develop`.
|
|
18
|
+
2. Keep the change focused. Unrelated cleanups belong in a separate pull request.
|
|
19
|
+
3. Add or update tests and documentation where it makes sense.
|
|
20
|
+
4. Run the checks before you push:
|
|
21
|
+
|
|
22
|
+
- `uv run ruff check .`
|
|
23
|
+
- `uv run black --check .`
|
|
24
|
+
- `uv run pyrefly check`
|
|
25
|
+
- `uv run pytest`
|
|
26
|
+
|
|
27
|
+
5. Open a pull request against `develop`, not `main`. CI runs on every pull request.
|
|
28
|
+
|
|
29
|
+
## Releases
|
|
30
|
+
|
|
31
|
+
Releases are cut by the maintainers from `main`. Notable changes are listed in [CHANGELOG.md](CHANGELOG.md).
|
|
32
|
+
|
|
33
|
+
## License
|
|
34
|
+
|
|
35
|
+
By contributing, you agree that your contributions are licensed under the MIT License of this project.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: pyobs-alpaca
|
|
3
|
+
Version: 2.0.2
|
|
4
|
+
Summary: pyobs module for ASCOM Alpaca
|
|
5
|
+
Project-URL: Homepage, https://www.pyobs.org
|
|
6
|
+
Project-URL: Documentation, https://docs.pyobs.org
|
|
7
|
+
Project-URL: Repository, https://github.com/pyobs/pyobs-alpaca
|
|
8
|
+
Project-URL: Issues, https://github.com/pyobs/pyobs-alpaca/issues
|
|
9
|
+
Author-email: Tim-Oliver Husser <thusser@uni-goettingen.de>
|
|
10
|
+
License-Expression: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Requires-Python: >=3.11
|
|
13
|
+
Requires-Dist: numpy<3,>=2.2.5
|
|
14
|
+
Requires-Dist: pyobs-core<3,>=2.6.1
|
|
15
|
+
Description-Content-Type: text/markdown
|
|
16
|
+
|
|
17
|
+
ASCOM Alpaca wrapper for *pyobs*
|
|
18
|
+
================================
|
|
19
|
+
|
|
20
|
+
This is a [pyobs](https://www.pyobs.org) module for wrapping devices accessible via
|
|
21
|
+
[ASCOM Alpaca](https://ascom-standards.org/AlpacaDeveloper/), a HTTP proxy for ASCOM. It provides
|
|
22
|
+
telescope, focuser and dome implementations.
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
Install *pyobs-alpaca*
|
|
26
|
+
-----------------------
|
|
27
|
+
Clone the repository:
|
|
28
|
+
|
|
29
|
+
git clone https://github.com/pyobs/pyobs-alpaca.git
|
|
30
|
+
cd pyobs-alpaca
|
|
31
|
+
|
|
32
|
+
Install it with [uv](https://docs.astral.sh/uv/):
|
|
33
|
+
|
|
34
|
+
uv sync
|
|
35
|
+
|
|
36
|
+
Alternatively, with plain `venv`/`pip`:
|
|
37
|
+
|
|
38
|
+
python3 -m venv .venv
|
|
39
|
+
source .venv/bin/activate
|
|
40
|
+
pip install .
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
Configuration
|
|
44
|
+
-------------
|
|
45
|
+
This is an example configuration for a telescope:
|
|
46
|
+
|
|
47
|
+
class: pyobs_alpaca.AlpacaTelescope
|
|
48
|
+
name: ASCOM Telescope
|
|
49
|
+
server: 1.2.3.4
|
|
50
|
+
port: 11111
|
|
51
|
+
device_type: telescope
|
|
52
|
+
device: 0
|
|
53
|
+
wait_for_dome: dome
|
|
54
|
+
weather: weather
|
|
55
|
+
alive_parameter: Name
|
|
56
|
+
|
|
57
|
+
And for a focusing unit:
|
|
58
|
+
|
|
59
|
+
class: pyobs_alpaca.AlpacaFocuser
|
|
60
|
+
name: ASCOM Focuser
|
|
61
|
+
server: 1.2.3.4
|
|
62
|
+
port: 11111
|
|
63
|
+
device_type: focuser
|
|
64
|
+
device: 0
|
|
65
|
+
alive_parameter: Position
|
|
66
|
+
|
|
67
|
+
And finally, for a dome:
|
|
68
|
+
|
|
69
|
+
class: pyobs_alpaca.AlpacaDome
|
|
70
|
+
server: 1.2.3.4
|
|
71
|
+
port: 11111
|
|
72
|
+
device_type: dome
|
|
73
|
+
device: 0
|
|
74
|
+
follow: telescope
|
|
75
|
+
weather: weather
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
Dependencies
|
|
79
|
+
------------
|
|
80
|
+
* [pyobs-core](https://github.com/pyobs/pyobs-core) for the core functionality.
|
|
81
|
+
* [NumPy](https://numpy.org/) for array handling.
|
|
@@ -4,7 +4,7 @@ import time
|
|
|
4
4
|
from typing import Any
|
|
5
5
|
|
|
6
6
|
from pyobs.events import RoofClosingEvent, RoofOpenedEvent
|
|
7
|
-
from pyobs.interfaces import AltAzState, IPointingAltAz, IReady, ReadyState
|
|
7
|
+
from pyobs.interfaces import AltAzState, FitsHeaderEntry, IPointingAltAz, IReady, ReadyState
|
|
8
8
|
from pyobs.mixins import FollowMixin
|
|
9
9
|
from pyobs.modules import timeout
|
|
10
10
|
from pyobs.modules.roof import BaseDome
|
|
@@ -17,6 +17,9 @@ from .device import DEVICE_INIT_KWARGS, OBJECT_SHARED_KWARGS, AlpacaDevice
|
|
|
17
17
|
|
|
18
18
|
log = logging.getLogger("pyobs")
|
|
19
19
|
|
|
20
|
+
# ASCOM Alpaca ShutterState values (ICameraV3/IDomeV2 spec).
|
|
21
|
+
_SHUTTER_STATUS = {0: "OPEN", 1: "CLOSED", 2: "OPENING", 3: "CLOSING", 4: "ERROR"}
|
|
22
|
+
|
|
20
23
|
|
|
21
24
|
class AlpacaDome(BaseDome, FollowMixin):
|
|
22
25
|
__module__ = "pyobs_alpaca"
|
|
@@ -55,7 +58,7 @@ class AlpacaDome(BaseDome, FollowMixin):
|
|
|
55
58
|
self._abort_move = asyncio.Event()
|
|
56
59
|
|
|
57
60
|
# status
|
|
58
|
-
self._shutter = None
|
|
61
|
+
self._shutter: int | None = None
|
|
59
62
|
self._altitude = 0.0
|
|
60
63
|
self._azimuth = 0.0
|
|
61
64
|
self._set_az = 0.0
|
|
@@ -104,6 +107,7 @@ class AlpacaDome(BaseDome, FollowMixin):
|
|
|
104
107
|
await event_wait(self._abort_shutter, 1)
|
|
105
108
|
try:
|
|
106
109
|
status = await self._device.get("ShutterStatus")
|
|
110
|
+
self._shutter = status
|
|
107
111
|
except ConnectionError:
|
|
108
112
|
await self._change_motion_status(MotionStatus.UNKNOWN)
|
|
109
113
|
raise exc.InitError("Could not open dome.")
|
|
@@ -150,6 +154,7 @@ class AlpacaDome(BaseDome, FollowMixin):
|
|
|
150
154
|
await event_wait(self._abort_shutter, 1)
|
|
151
155
|
try:
|
|
152
156
|
status = await self._device.get("ShutterStatus")
|
|
157
|
+
self._shutter = status
|
|
153
158
|
except ConnectionError:
|
|
154
159
|
await self._change_motion_status(MotionStatus.UNKNOWN)
|
|
155
160
|
raise exc.ParkError("Could not close dome.")
|
|
@@ -249,5 +254,23 @@ class AlpacaDome(BaseDome, FollowMixin):
|
|
|
249
254
|
az -= 360
|
|
250
255
|
return az
|
|
251
256
|
|
|
257
|
+
async def get_fits_header_before(
|
|
258
|
+
self, namespaces: list[str] | None = None, **kwargs: Any
|
|
259
|
+
) -> dict[str, FitsHeaderEntry]:
|
|
260
|
+
"""Returns FITS header for the current status of this module.
|
|
261
|
+
|
|
262
|
+
Args:
|
|
263
|
+
namespaces: If given, only return FITS headers for the given namespaces.
|
|
264
|
+
|
|
265
|
+
Returns:
|
|
266
|
+
Dictionary containing FITS headers.
|
|
267
|
+
"""
|
|
268
|
+
|
|
269
|
+
hdr = await BaseDome.get_fits_header_before(self, namespaces, **kwargs)
|
|
270
|
+
|
|
271
|
+
shutter = _SHUTTER_STATUS.get(self._shutter, "UNKNOWN") if self._shutter is not None else "UNKNOWN"
|
|
272
|
+
hdr["DOMESHUT"] = FitsHeaderEntry(shutter, "Dome shutter status")
|
|
273
|
+
return hdr
|
|
274
|
+
|
|
252
275
|
|
|
253
276
|
__all__ = ["AlpacaDome"]
|
|
@@ -3,7 +3,7 @@ import logging
|
|
|
3
3
|
from typing import Any
|
|
4
4
|
|
|
5
5
|
from pyobs.interfaces import FitsHeaderEntry, FocuserState, IFitsHeaderBefore, IFocuser, IReady, ReadyState
|
|
6
|
-
from pyobs.mixins import MotionStatusMixin
|
|
6
|
+
from pyobs.mixins import FocuserHeaderMixin, MotionStatusMixin
|
|
7
7
|
from pyobs.modules import Module, timeout
|
|
8
8
|
from pyobs.utils import exceptions as exc
|
|
9
9
|
from pyobs.utils.enums import MotionStatus
|
|
@@ -14,7 +14,7 @@ from .device import DEVICE_INIT_KWARGS, OBJECT_SHARED_KWARGS, AlpacaDevice
|
|
|
14
14
|
log = logging.getLogger(__name__)
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
class AlpacaFocuser(Module, MotionStatusMixin, IFocuser, IFitsHeaderBefore):
|
|
17
|
+
class AlpacaFocuser(FocuserHeaderMixin, Module, MotionStatusMixin, IFocuser, IFitsHeaderBefore):
|
|
18
18
|
__module__ = "pyobs_alpaca"
|
|
19
19
|
|
|
20
20
|
def __init__(self, **kwargs: Any):
|
|
@@ -62,13 +62,16 @@ class AlpacaFocuser(Module, MotionStatusMixin, IFocuser, IFitsHeaderBefore):
|
|
|
62
62
|
) -> dict[str, FitsHeaderEntry]:
|
|
63
63
|
"""Returns FITS header for the current status of this module."""
|
|
64
64
|
|
|
65
|
+
hdr = await super().get_fits_header_before(namespaces, **kwargs)
|
|
66
|
+
|
|
65
67
|
try:
|
|
66
68
|
pos = await self._device.get("Position")
|
|
67
69
|
step = await self._device.get("StepSize") * 1000.0
|
|
68
|
-
|
|
70
|
+
hdr["TEL-FOCU"] = FitsHeaderEntry(pos / step, "Focus of telescope [mm]")
|
|
69
71
|
except ConnectionError as e:
|
|
70
72
|
log.warning("Could not determine focus position: %s", e)
|
|
71
|
-
|
|
73
|
+
|
|
74
|
+
return hdr
|
|
72
75
|
|
|
73
76
|
@timeout(60000)
|
|
74
77
|
async def set_focus(self, focus: float, **kwargs: Any) -> None:
|
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "pyobs-alpaca"
|
|
3
|
-
version = "2.0.
|
|
3
|
+
version = "2.0.2"
|
|
4
4
|
description = "pyobs module for ASCOM Alpaca"
|
|
5
5
|
authors = [{ name = "Tim-Oliver Husser", email = "thusser@uni-goettingen.de" }]
|
|
6
6
|
requires-python = ">=3.11"
|
|
7
7
|
license = "MIT"
|
|
8
|
+
readme = "README.md"
|
|
8
9
|
dependencies = [
|
|
9
10
|
"numpy>=2.2.5,<3",
|
|
10
|
-
"pyobs-core>=2.
|
|
11
|
+
"pyobs-core>=2.6.1,<3",
|
|
11
12
|
]
|
|
12
13
|
|
|
14
|
+
[project.urls]
|
|
15
|
+
Homepage = "https://www.pyobs.org"
|
|
16
|
+
Documentation = "https://docs.pyobs.org"
|
|
17
|
+
Repository = "https://github.com/pyobs/pyobs-alpaca"
|
|
18
|
+
Issues = "https://github.com/pyobs/pyobs-alpaca/issues"
|
|
19
|
+
|
|
13
20
|
[dependency-groups]
|
|
14
21
|
dev = [
|
|
15
22
|
"black>=25.1.0,<27",
|
|
@@ -1902,7 +1902,7 @@ wheels = [
|
|
|
1902
1902
|
|
|
1903
1903
|
[[package]]
|
|
1904
1904
|
name = "pyobs-alpaca"
|
|
1905
|
-
version = "2.0.
|
|
1905
|
+
version = "2.0.2"
|
|
1906
1906
|
source = { editable = "." }
|
|
1907
1907
|
dependencies = [
|
|
1908
1908
|
{ name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
|
|
@@ -1923,7 +1923,7 @@ dev = [
|
|
|
1923
1923
|
[package.metadata]
|
|
1924
1924
|
requires-dist = [
|
|
1925
1925
|
{ name = "numpy", specifier = ">=2.2.5,<3" },
|
|
1926
|
-
{ name = "pyobs-core", specifier = ">=2.
|
|
1926
|
+
{ name = "pyobs-core", specifier = ">=2.6.1,<3" },
|
|
1927
1927
|
]
|
|
1928
1928
|
|
|
1929
1929
|
[package.metadata.requires-dev]
|
|
@@ -1938,7 +1938,7 @@ dev = [
|
|
|
1938
1938
|
|
|
1939
1939
|
[[package]]
|
|
1940
1940
|
name = "pyobs-core"
|
|
1941
|
-
version = "2.
|
|
1941
|
+
version = "2.10.7"
|
|
1942
1942
|
source = { registry = "https://pypi.org/simple" }
|
|
1943
1943
|
dependencies = [
|
|
1944
1944
|
{ name = "aiohttp" },
|
|
@@ -1970,28 +1970,28 @@ dependencies = [
|
|
|
1970
1970
|
{ name = "tenacity" },
|
|
1971
1971
|
{ name = "typing-extensions" },
|
|
1972
1972
|
]
|
|
1973
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1973
|
+
sdist = { url = "https://files.pythonhosted.org/packages/7e/db/b197375974c8436095fdfa53db228e1e8b323f12183433ee960c99e96cef/pyobs_core-2.10.7.tar.gz", hash = "sha256:2bd17b1ea609692c6f8925f2d80afc515ac2209b807205ffaa9129730321116e", size = 424175, upload-time = "2026-09-23T18:20:53.969Z" }
|
|
1974
1974
|
wheels = [
|
|
1975
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1975
|
+
{ url = "https://files.pythonhosted.org/packages/52/4e/ebdb9836eae127a70ab9fd618eb7782394158592cb35b5a97ff133cfa757/pyobs_core-2.10.7-py3-none-any.whl", hash = "sha256:14cfea0a0633ba31593323ff0bff919d9510b987369e0cc3f758a948f9dd396e", size = 656647, upload-time = "2026-09-23T18:20:52.624Z" },
|
|
1976
1976
|
]
|
|
1977
1977
|
|
|
1978
1978
|
[[package]]
|
|
1979
1979
|
name = "pyrefly"
|
|
1980
|
-
version = "1.
|
|
1980
|
+
version = "1.3.1"
|
|
1981
1981
|
source = { registry = "https://pypi.org/simple" }
|
|
1982
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1982
|
+
sdist = { url = "https://files.pythonhosted.org/packages/4c/7e/082cc1b392318bacfbc087732524f3e089e9e7fe45b7645c4649b6f1f1e9/pyrefly-1.3.1.tar.gz", hash = "sha256:b774f1dfac82867fc16fe2175d80a630e2a72a6835d5b7e492568d6bfb6b05e7", size = 6679145, upload-time = "2026-09-15T05:09:34.49Z" }
|
|
1983
1983
|
wheels = [
|
|
1984
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1985
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1986
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1987
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1988
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1989
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1990
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1991
|
-
{ url = "https://files.pythonhosted.org/packages/5d/
|
|
1992
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1993
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1994
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1984
|
+
{ url = "https://files.pythonhosted.org/packages/6b/bc/f09b5bd7eed796349bd93627aa2c3086df7ed0a114dafc3d2b2841599ee7/pyrefly-1.3.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0a2a7dfed824fb066aa8a7c8d856c152b98e998fb84b954d5f892fb9834c0bd1", size = 15090117, upload-time = "2026-09-15T05:08:58.477Z" },
|
|
1985
|
+
{ url = "https://files.pythonhosted.org/packages/78/24/a31e7de8e0f310c9f0753826d0df8b6a8ff86793941a6bd88ba24b735633/pyrefly-1.3.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:37a1a1fb41e7190fe3964a877875dd809d6ee2887809e2c3d6e5f25a69805bfd", size = 14430773, upload-time = "2026-09-15T05:09:01.67Z" },
|
|
1986
|
+
{ url = "https://files.pythonhosted.org/packages/75/e1/022352beb186f36d6213a95a975c42676ee418ff5e730629378d25564c5e/pyrefly-1.3.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45b7650bc651a5a784701f2fb4f579da9a421c4d1b5fd91f9048f4529e46093c", size = 14877762, upload-time = "2026-09-15T05:09:04.767Z" },
|
|
1987
|
+
{ url = "https://files.pythonhosted.org/packages/19/2c/d62a1b445aad1fd46375b83393b8a67da53883aeeba73d269ce71b3e8fd1/pyrefly-1.3.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad57f38bc73679c14a5f62995a2bd3bc43649b7270c858487e2eab78a6f95362", size = 16118225, upload-time = "2026-09-15T05:09:07.828Z" },
|
|
1988
|
+
{ url = "https://files.pythonhosted.org/packages/32/67/3c3fa8a13e3ce8d8322ffb3627255a41a52261f17793e1a24e9214f10857/pyrefly-1.3.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3506b1252e9f5d755d0693c5a46d46b85579d36534f6e22a41eb8e098d0dde90", size = 16051197, upload-time = "2026-09-15T05:09:10.81Z" },
|
|
1989
|
+
{ url = "https://files.pythonhosted.org/packages/19/d1/84f81b9e32288b5d11c75e006f67e0f6b78b85da575673bd1a21524c8172/pyrefly-1.3.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39d5a17c1ad655e5f93a6e8e0be90b8db28c6015fe07d6ed4e054891c9e14ef8", size = 15440062, upload-time = "2026-09-15T05:09:14.641Z" },
|
|
1990
|
+
{ url = "https://files.pythonhosted.org/packages/46/3c/2aa0c5ad6a2957a728bb38cfab70d1e9cafad21b0b1c1d92df74a3cf22bd/pyrefly-1.3.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c61e9dcf888beb81ca0e0c60ea4442640fdcf2f1f65bfe3d9f5d89b85516eb03", size = 14898534, upload-time = "2026-09-15T05:09:17.823Z" },
|
|
1991
|
+
{ url = "https://files.pythonhosted.org/packages/03/5d/2974f249fb2e285f966485719d977c5a2248cc4866403af94d935775ff15/pyrefly-1.3.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a78eed1c53f37807f0e2997be8edbe833b91eb9915f2cb553a1bdcd599e7105c", size = 15477758, upload-time = "2026-09-15T05:09:20.964Z" },
|
|
1992
|
+
{ url = "https://files.pythonhosted.org/packages/68/79/d31f8f0abf5b0610ec24183286ee8a1ee5b76c9aaaa91091399d7e1aaf60/pyrefly-1.3.1-py3-none-win32.whl", hash = "sha256:ea0d0349f1bc80fe8e00a7b3640e40db7486398b685f87b9bd5d2207063668f0", size = 14133005, upload-time = "2026-09-15T05:09:25.03Z" },
|
|
1993
|
+
{ url = "https://files.pythonhosted.org/packages/3f/23/1859f47f536314755d80c4ec2a76d2698435ae8b73604bcd1dfa57ecb39b/pyrefly-1.3.1-py3-none-win_amd64.whl", hash = "sha256:4c24e7d99df9237916c33be23714219a7c8eaf22bad2ac0c3e1d45adcf7df8fb", size = 15066557, upload-time = "2026-09-15T05:09:28.265Z" },
|
|
1994
|
+
{ url = "https://files.pythonhosted.org/packages/92/2a/73e3721921c2bb2c950a9f8c362ee5e2367556b5d4416eb4f8f88503e66f/pyrefly-1.3.1-py3-none-win_arm64.whl", hash = "sha256:1ed85e2b957a78e93353125d890ce3668ce450e49b74025a15c87b6e8ec7f3d1", size = 14348209, upload-time = "2026-09-15T05:09:31.422Z" },
|
|
1995
1995
|
]
|
|
1996
1996
|
|
|
1997
1997
|
[[package]]
|
|
@@ -2196,27 +2196,27 @@ wheels = [
|
|
|
2196
2196
|
|
|
2197
2197
|
[[package]]
|
|
2198
2198
|
name = "ruff"
|
|
2199
|
-
version = "0.16.
|
|
2200
|
-
source = { registry = "https://pypi.org/simple" }
|
|
2201
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
2202
|
-
wheels = [
|
|
2203
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2204
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2205
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2206
|
-
{ url = "https://files.pythonhosted.org/packages/24/
|
|
2207
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2208
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2209
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2210
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2211
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2212
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2213
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2214
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2215
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2216
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2217
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2218
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2219
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2199
|
+
version = "0.16.9"
|
|
2200
|
+
source = { registry = "https://pypi.org/simple" }
|
|
2201
|
+
sdist = { url = "https://files.pythonhosted.org/packages/96/bf/c935ca98e73fe8ce65b87ef08a280c0c1e85295d569228c15e87d8fdfaf1/ruff-0.16.9.tar.gz", hash = "sha256:12b625c6cfba78d285d9f48eda5f053374f1e53cb10ef17342a383750db99161", size = 4948764, upload-time = "2026-09-24T20:37:49.416Z" }
|
|
2202
|
+
wheels = [
|
|
2203
|
+
{ url = "https://files.pythonhosted.org/packages/0d/26/df51322b52ee1ada7eff2d071ea09d11d5c2d1dcc9f02594f5785c4d1635/ruff-0.16.9-py3-none-linux_armv6l.whl", hash = "sha256:95e6f022090368ab3b824c36276839c53b2adf1a3f4c09fefc33dfc400f6da96", size = 10082922, upload-time = "2026-09-24T20:37:13.045Z" },
|
|
2204
|
+
{ url = "https://files.pythonhosted.org/packages/a5/27/7bf51f5a7aa375e9f339280a303aab44ca75dc1525f1cdc5991761685b0f/ruff-0.16.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a5f27be168556594a86d2f415db0cf43f5291917849318f873c7e2791f7a8c67", size = 10236360, upload-time = "2026-09-24T20:37:16.049Z" },
|
|
2205
|
+
{ url = "https://files.pythonhosted.org/packages/b6/63/09659283f92f02dff45809da194a70da2f688d87c55d8875c4fae3536072/ruff-0.16.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1632eb1d6197f33bd00b1acbc5b71009e89a8895c158e2d2b03a834fac964ab6", size = 9892940, upload-time = "2026-09-24T20:37:17.957Z" },
|
|
2206
|
+
{ url = "https://files.pythonhosted.org/packages/24/58/98de1b72ec172f5f8f1731236fe21585b3998bf7dfe9fcc44ae9ba626012/ruff-0.16.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3f951b14d865d5952c89d40a5ca07e87abe24fa5453299878411e127748fb1c", size = 10032114, upload-time = "2026-09-24T20:37:19.942Z" },
|
|
2207
|
+
{ url = "https://files.pythonhosted.org/packages/c8/7d/f1e17c54ab59d4bad1dce8ee3e22a7a1d0ef4745240decacdcf3832b5bb2/ruff-0.16.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:447fc07e1573afff7cb02803462b12b6c8ece7cf10e2cd78565fa6d7a1c0bf8d", size = 9910227, upload-time = "2026-09-24T20:37:21.872Z" },
|
|
2208
|
+
{ url = "https://files.pythonhosted.org/packages/34/19/436f647a65075bbd3bab2668b3bdaa5120559b294694018cdcefabbbf30b/ruff-0.16.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a3e039a6a40ed976c491722b60e0ae4a4aa1a86057f540ee7a37a5d19ae9120", size = 10547484, upload-time = "2026-09-24T20:37:24.229Z" },
|
|
2209
|
+
{ url = "https://files.pythonhosted.org/packages/03/59/38430a6bc2f6d8095447ac39625cf8b6e9344a47e6c26225c8ba1bff3ffb/ruff-0.16.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4684dded7db60aa57cb118fa158630f5feade4af5782903b6053484bdf9bd129", size = 11412367, upload-time = "2026-09-24T20:37:26.307Z" },
|
|
2210
|
+
{ url = "https://files.pythonhosted.org/packages/c8/bd/bbb6d7fc7f208c8b8c50dd5dc8206e4cfdb1e7a8fb852606a3adf370c880/ruff-0.16.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d29c934357e45642fda2f34c0b1f4025b4a6c01e15e4bf0016879d60078a142c", size = 10869787, upload-time = "2026-09-24T20:37:28.35Z" },
|
|
2211
|
+
{ url = "https://files.pythonhosted.org/packages/bc/b8/9c543074918061abbefc3bd139bee22de35abedb00dde0f2d27288838962/ruff-0.16.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a21713e629d3e5bdb2f5c2def1cc7f04f47fa8e1a7eb0571b4a28e1da64bc728", size = 10406494, upload-time = "2026-09-24T20:37:30.624Z" },
|
|
2212
|
+
{ url = "https://files.pythonhosted.org/packages/35/7a/5a8851bd146e7ccf8fd4b003f6c75c11f8fbdb0e60673b45097986b6bf41/ruff-0.16.9-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:7baa24ef5fc8e77aa93879e1d3f43754a01ae488e869f1ae30cf431afd4d2452", size = 10590083, upload-time = "2026-09-24T20:37:32.439Z" },
|
|
2213
|
+
{ url = "https://files.pythonhosted.org/packages/87/f0/4c3467188f23f806960b46fa76575a7cd0514c9ba90562650b71efc96980/ruff-0.16.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a41aac6230aadfaa133bdfa1614488531ffa3e0837567ae04c0da2058a9c0f9e", size = 10119151, upload-time = "2026-09-24T20:37:34.581Z" },
|
|
2214
|
+
{ url = "https://files.pythonhosted.org/packages/15/34/5a4def5adea572ce6aea0bb64f21f928ee317b80e0db747d7979b01d7261/ruff-0.16.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:c2529fb5896d49115b0e9aa8f887490b34bbe76baf879ec2264ac59406869ce7", size = 9911544, upload-time = "2026-09-24T20:37:36.796Z" },
|
|
2215
|
+
{ url = "https://files.pythonhosted.org/packages/62/5d/d15ebea7499eef9373318c0ee6ca127832927c6529731f6d48e18dce7ca9/ruff-0.16.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:41e3870277694177429b56406d65dfbdb2c2802c52b715edaf6a0b829c69d4ee", size = 10269884, upload-time = "2026-09-24T20:37:38.857Z" },
|
|
2216
|
+
{ url = "https://files.pythonhosted.org/packages/d1/56/c5d3cd119ded7a3c7aba0e961b69cb3df701c91662c98ad694467d060ce1/ruff-0.16.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8adbe4e58af167f767d7b2ba5e83c42e878350796cf78c2f5e14ab9903a92588", size = 10749366, upload-time = "2026-09-24T20:37:41.042Z" },
|
|
2217
|
+
{ url = "https://files.pythonhosted.org/packages/ac/fe/734ec7527029ac757ecf821f143c9f3fcf69149c21f53a044a899b430f5a/ruff-0.16.9-py3-none-win32.whl", hash = "sha256:0e1dbc2073624dee6618d41d0098690a7244654af746704b64759e12b6b6b385", size = 10152355, upload-time = "2026-09-24T20:37:43.025Z" },
|
|
2218
|
+
{ url = "https://files.pythonhosted.org/packages/14/21/26e4643629b3ebb44f0a06f9c9a53058d63d989415f63a9a3c28e2ee7f22/ruff-0.16.9-py3-none-win_amd64.whl", hash = "sha256:6bd40fec8cd4c8a3d4dd589bd8ad4e6320c13c29234159bfd959a40d529d597b", size = 10592965, upload-time = "2026-09-24T20:37:44.944Z" },
|
|
2219
|
+
{ url = "https://files.pythonhosted.org/packages/51/60/5fb1a39dbb5ae314d5f59bc7348a63c1d5c20f3cd83914c4b5cb0be31d2d/ruff-0.16.9-py3-none-win_arm64.whl", hash = "sha256:ed1a252039200f57a59eebc063b54beabea67bfbaaca0eeaa7f54b5fbcda2284", size = 10458649, upload-time = "2026-09-24T20:37:46.882Z" },
|
|
2220
2220
|
]
|
|
2221
2221
|
|
|
2222
2222
|
[[package]]
|
pyobs_alpaca-2.0.0.dev6/PKG-INFO
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.5
|
|
2
|
-
Name: pyobs-alpaca
|
|
3
|
-
Version: 2.0.0.dev6
|
|
4
|
-
Summary: pyobs module for ASCOM Alpaca
|
|
5
|
-
Author-email: Tim-Oliver Husser <thusser@uni-goettingen.de>
|
|
6
|
-
License-Expression: MIT
|
|
7
|
-
License-File: LICENSE
|
|
8
|
-
Requires-Python: >=3.11
|
|
9
|
-
Requires-Dist: numpy<3,>=2.2.5
|
|
10
|
-
Requires-Dist: pyobs-core<3,>=2.0.0.dev82
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|