pyobs-core 2.0.0.dev9__tar.gz → 2.0.0.dev10__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.
Files changed (432) hide show
  1. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/PKG-INFO +1 -1
  2. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/comm/comm.py +14 -51
  3. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/comm/local/localcomm.py +1 -6
  4. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/comm/proxy.py +0 -6
  5. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/comm/xmpp/rpc.py +1 -1
  6. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/comm/xmpp/xmppcomm.py +53 -35
  7. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IAutoFocus.py +28 -17
  8. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IFitsHeaderAfter.py +2 -1
  9. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IFitsHeaderBefore.py +9 -2
  10. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IFocusModel.py +9 -4
  11. pyobs_core-2.0.0.dev10/pyobs/interfaces/IWeather.py +49 -0
  12. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/__init__.py +11 -4
  13. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/mixins/fitsheader.py +2 -7
  14. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/mixins/fitsnamespace.py +4 -2
  15. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/mixins/weatheraware.py +2 -1
  16. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/focus/focusmodel.py +15 -19
  17. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/focus/focusseries.py +14 -18
  18. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/module.py +1 -8
  19. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/pointing/_baseguiding.py +5 -5
  20. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/pointing/guidingstatistics/guidingstatistics.py +4 -2
  21. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/pointing/guidingstatistics/pixeloffset.py +5 -5
  22. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/pointing/guidingstatistics/skyoffsets.py +4 -4
  23. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/pointing/guidingstatistics/uptime.py +3 -3
  24. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/robotic/mastermind.py +4 -4
  25. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/roof/basedome.py +3 -3
  26. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/roof/baseroof.py +3 -3
  27. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/telescope/basetelescope.py +22 -15
  28. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/telescope/dummytelescope.py +3 -2
  29. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/weather/weather.py +46 -33
  30. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/weather/weather_state.py +1 -1
  31. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scripts/control/cases.py +3 -2
  32. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scripts/control/conditional.py +3 -2
  33. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scripts/imaging/imaging.py +4 -3
  34. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scripts/script.py +3 -2
  35. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/lco/scripts/default.py +4 -3
  36. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/lco/task.py +2 -1
  37. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/task.py +2 -1
  38. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/focusseries/base.py +5 -0
  39. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/focusseries/photometry.py +5 -0
  40. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/focusseries/projection.py +5 -0
  41. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/gui/camera/datadisplaywidget.py +2 -2
  42. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/parallel.py +2 -17
  43. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyproject.toml +1 -1
  44. pyobs_core-2.0.0.dev9/pyobs/interfaces/IWeather.py +0 -50
  45. pyobs_core-2.0.0.dev9/pyobs/utils/types.py +0 -242
  46. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/.gitignore +0 -0
  47. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/LICENSE +0 -0
  48. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/__init__.py +0 -0
  49. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/application.py +0 -0
  50. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/background_task.py +0 -0
  51. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/cli/__init__.py +0 -0
  52. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/cli/_cli.py +0 -0
  53. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/cli/pyobs.py +0 -0
  54. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/cli/pyobsd.py +0 -0
  55. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/cli/pyobsw.py +0 -0
  56. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/comm/__init__.py +0 -0
  57. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/comm/commlogging.py +0 -0
  58. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/comm/dummy/__init__.py +0 -0
  59. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/comm/dummy/dummycomm.py +0 -0
  60. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/comm/local/__init__.py +0 -0
  61. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/comm/local/localnetwork.py +0 -0
  62. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/comm/xmpp/__init__.py +0 -0
  63. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/comm/xmpp/serializer.py +0 -0
  64. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/comm/xmpp/xep_0009/__init__.py +0 -0
  65. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/comm/xmpp/xep_0009/binding.py +0 -0
  66. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/comm/xmpp/xep_0009/rpc.py +0 -0
  67. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/comm/xmpp/xep_0009_timeout/__init__.py +0 -0
  68. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/comm/xmpp/xep_0009_timeout/rpc.py +0 -0
  69. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/comm/xmpp/xep_0009_timeout/stanza/RPC.py +0 -0
  70. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/comm/xmpp/xep_0009_timeout/stanza/__init__.py +0 -0
  71. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/comm/xmpp/xmppclient.py +0 -0
  72. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/events/__init__.py +0 -0
  73. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/events/badweather.py +0 -0
  74. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/events/event.py +0 -0
  75. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/events/exposurestatuschanged.py +0 -0
  76. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/events/filterchanged.py +0 -0
  77. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/events/focusfound.py +0 -0
  78. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/events/goodweather.py +0 -0
  79. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/events/log.py +0 -0
  80. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/events/modechanged.py +0 -0
  81. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/events/moduleclosed.py +0 -0
  82. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/events/moduleopened.py +0 -0
  83. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/events/motionstatuschanged.py +0 -0
  84. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/events/move.py +0 -0
  85. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/events/newimage.py +0 -0
  86. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/events/newspectrum.py +0 -0
  87. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/events/offsets.py +0 -0
  88. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/events/roofclosing.py +0 -0
  89. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/events/roofopened.py +0 -0
  90. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/events/taskfailed.py +0 -0
  91. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/events/taskfinished.py +0 -0
  92. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/events/taskstarted.py +0 -0
  93. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/events/testevent.py +0 -0
  94. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/__init__.py +0 -0
  95. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/image.py +0 -0
  96. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/meta/__init__.py +0 -0
  97. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/meta/altazoffsets.py +0 -0
  98. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/meta/exptime.py +0 -0
  99. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/meta/genericoffset.py +0 -0
  100. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/meta/onskydistance.py +0 -0
  101. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/meta/pixeloffsets.py +0 -0
  102. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/meta/radecoffsets.py +0 -0
  103. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/meta/skyoffsets.py +0 -0
  104. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processor.py +0 -0
  105. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/__init__.py +0 -0
  106. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/_daobackgroundremover.py +0 -0
  107. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/annotation/__init__.py +0 -0
  108. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/annotation/_pillow.py +0 -0
  109. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/annotation/circle.py +0 -0
  110. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/annotation/crosshair.py +0 -0
  111. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/annotation/text.py +0 -0
  112. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/astrometry/__init__.py +0 -0
  113. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/astrometry/_dotnet_request.py +0 -0
  114. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/astrometry/_dotnet_request_builder.py +0 -0
  115. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/astrometry/_dotnet_request_logger.py +0 -0
  116. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/astrometry/_dotnet_response_saver.py +0 -0
  117. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/astrometry/astrometry.py +0 -0
  118. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/astrometry/dotnet.py +0 -0
  119. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/calibration/__init__.py +0 -0
  120. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/calibration/_calibration_cache.py +0 -0
  121. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/calibration/_ccddata_calibrator.py +0 -0
  122. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/calibration/calibration.py +0 -0
  123. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/detection/__init__.py +0 -0
  124. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/detection/_pysep_stats_calculator.py +0 -0
  125. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/detection/_source_catalog.py +0 -0
  126. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/detection/daophot.py +0 -0
  127. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/detection/pysep.py +0 -0
  128. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/detection/simpledisk.py +0 -0
  129. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/detection/sourcedetection.py +0 -0
  130. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/exptime/__init__.py +0 -0
  131. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/exptime/exptime.py +0 -0
  132. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/exptime/star.py +0 -0
  133. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/image/__init__.py +0 -0
  134. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/image/addfitsheaders.py +0 -0
  135. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/image/download.py +0 -0
  136. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/image/flip.py +0 -0
  137. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/image/grayscale.py +0 -0
  138. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/image/httpserver.py +0 -0
  139. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/image/normalize.py +0 -0
  140. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/image/save.py +0 -0
  141. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/image/saveimage.py +0 -0
  142. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/image/smooth.py +0 -0
  143. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/image/softbin.py +0 -0
  144. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/misc/__init__.py +0 -0
  145. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/misc/addmask.py +0 -0
  146. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/misc/catalogcircularmask.py +0 -0
  147. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/misc/circularmask.py +0 -0
  148. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/misc/createfilename.py +0 -0
  149. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/misc/imagesourcefilter.py +0 -0
  150. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/misc/removebackground.py +0 -0
  151. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/modules/__init__.py +0 -0
  152. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/modules/getfitsheaders.py +0 -0
  153. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/offsets/__init__.py +0 -0
  154. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/offsets/astrometry.py +0 -0
  155. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/offsets/brighteststar.py +0 -0
  156. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/offsets/brighteststar_guiding.py +0 -0
  157. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/offsets/dummyoffsets.py +0 -0
  158. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/offsets/dummyskyoffsets.py +0 -0
  159. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/offsets/fitsheader.py +0 -0
  160. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/offsets/offsets.py +0 -0
  161. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/offsets/pixeloffsets.py +0 -0
  162. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/offsets/projected.py +0 -0
  163. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/offsets/spilled_light.py +0 -0
  164. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/photometry/__init__.py +0 -0
  165. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/photometry/_photometry_calculator.py +0 -0
  166. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/photometry/_photutil_aperture_photometry.py +0 -0
  167. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/photometry/_sep_aperture_photometry.py +0 -0
  168. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/photometry/aperture_photometry.py +0 -0
  169. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/photometry/photometry.py +0 -0
  170. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/photometry/photutil.py +0 -0
  171. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/photometry/pysep.py +0 -0
  172. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/wcs/__init__.py +0 -0
  173. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/images/processors/wcs/solarhelioprojective.py +0 -0
  174. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IAbortable.py +0 -0
  175. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IAcquisition.py +0 -0
  176. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IAutoGuiding.py +0 -0
  177. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IAutonomous.py +0 -0
  178. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IBinning.py +0 -0
  179. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/ICalibrate.py +0 -0
  180. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/ICamera.py +0 -0
  181. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IConfig.py +0 -0
  182. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/ICooling.py +0 -0
  183. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IData.py +0 -0
  184. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IDome.py +0 -0
  185. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IExposure.py +0 -0
  186. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IExposureTime.py +0 -0
  187. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IFilters.py +0 -0
  188. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IFlatField.py +0 -0
  189. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IFocuser.py +0 -0
  190. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IGain.py +0 -0
  191. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IImageFormat.py +0 -0
  192. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IImageType.py +0 -0
  193. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IMode.py +0 -0
  194. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IModule.py +0 -0
  195. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IMotion.py +0 -0
  196. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IMultiFiber.py +0 -0
  197. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IOffsetsAltAz.py +0 -0
  198. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IOffsetsRaDec.py +0 -0
  199. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IPointingAltAz.py +0 -0
  200. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IPointingHGS.py +0 -0
  201. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IPointingHelioprojective.py +0 -0
  202. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IPointingRaDec.py +0 -0
  203. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IPointingSeries.py +0 -0
  204. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IReady.py +0 -0
  205. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IRoof.py +0 -0
  206. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IRotation.py +0 -0
  207. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IRunnable.py +0 -0
  208. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IRunning.py +0 -0
  209. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IScriptRunner.py +0 -0
  210. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/ISpectrograph.py +0 -0
  211. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IStartStop.py +0 -0
  212. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/ISyncTarget.py +0 -0
  213. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/ITelescope.py +0 -0
  214. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/ITemperatures.py +0 -0
  215. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IVideo.py +0 -0
  216. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/IWindow.py +0 -0
  217. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/interfaces/interface.py +0 -0
  218. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/mixins/__init__.py +0 -0
  219. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/mixins/camerasettings.py +0 -0
  220. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/mixins/follow.py +0 -0
  221. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/mixins/motionstatus.py +0 -0
  222. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/mixins/pipeline.py +0 -0
  223. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/mixins/waitformotion.py +0 -0
  224. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/__init__.py +0 -0
  225. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/camera/__init__.py +0 -0
  226. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/camera/adaptive.py +0 -0
  227. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/camera/basecamera.py +0 -0
  228. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/camera/basespectrograph.py +0 -0
  229. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/camera/basevideo.py +0 -0
  230. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/camera/dummycamera.py +0 -0
  231. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/camera/dummyspectrograph.py +0 -0
  232. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/camera/dummyvideo.py +0 -0
  233. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/camera/pipelinecamera.py +0 -0
  234. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/flatfield/__init__.py +0 -0
  235. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/flatfield/flatfield.py +0 -0
  236. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/flatfield/pointing.py +0 -0
  237. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/flatfield/scheduler.py +0 -0
  238. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/focus/__init__.py +0 -0
  239. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/image/__init__.py +0 -0
  240. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/image/imagewatcher.py +0 -0
  241. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/image/imagewriter.py +0 -0
  242. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/image/pipeline.py +0 -0
  243. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/image/seeing.py +0 -0
  244. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/pointing/__init__.py +0 -0
  245. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/pointing/_base.py +0 -0
  246. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/pointing/acquisition.py +0 -0
  247. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/pointing/autoguiding.py +0 -0
  248. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/pointing/dummyacquisition.py +0 -0
  249. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/pointing/dummyguiding.py +0 -0
  250. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/pointing/guidingstatistics/__init__.py +0 -0
  251. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/pointing/scienceframeguiding.py +0 -0
  252. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/robotic/__init__.py +0 -0
  253. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/robotic/pointing.py +0 -0
  254. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/robotic/scheduler.py +0 -0
  255. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/robotic/scriptrunner.py +0 -0
  256. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/roof/__init__.py +0 -0
  257. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/roof/dummyroof.py +0 -0
  258. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/telescope/__init__.py +0 -0
  259. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/test/__init__.py +0 -0
  260. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/test/standalone.py +0 -0
  261. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/utils/__init__.py +0 -0
  262. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/utils/autonomouswarning.py +0 -0
  263. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/utils/dummymode.py +0 -0
  264. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/utils/fluentlogger.py +0 -0
  265. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/utils/httpfilecache.py +0 -0
  266. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/utils/kiosk.py +0 -0
  267. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/utils/matrix.py +0 -0
  268. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/utils/stellarium.py +0 -0
  269. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/utils/telegram.py +0 -0
  270. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/utils/trigger.py +0 -0
  271. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/weather/__init__.py +0 -0
  272. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/modules/weather/weather_api.py +0 -0
  273. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/object.py +0 -0
  274. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/py.typed +0 -0
  275. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/__init__.py +0 -0
  276. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/observation.py +0 -0
  277. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/__init__.py +0 -0
  278. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/astroplanscheduler.py +0 -0
  279. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/constraints/__init__.py +0 -0
  280. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/constraints/airmassconstraint.py +0 -0
  281. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/constraints/constraint.py +0 -0
  282. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/constraints/moonilluminationconstraint.py +0 -0
  283. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/constraints/moonseparationconstraint.py +0 -0
  284. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/constraints/solarelevationconstraint.py +0 -0
  285. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/constraints/timeconstraint.py +0 -0
  286. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/dataprovider.py +0 -0
  287. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/merits/__init__.py +0 -0
  288. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/merits/aftertime.py +0 -0
  289. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/merits/beforetime.py +0 -0
  290. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/merits/constant.py +0 -0
  291. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/merits/follow.py +0 -0
  292. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/merits/interval.py +0 -0
  293. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/merits/merit.py +0 -0
  294. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/merits/pernight.py +0 -0
  295. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/merits/random.py +0 -0
  296. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/merits/timewindow.py +0 -0
  297. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/merits/transit.py +0 -0
  298. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/observationarchiveevolution.py +0 -0
  299. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/ondemandscheduler.py +0 -0
  300. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/targets/__init__.py +0 -0
  301. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/targets/dynamictarget.py +0 -0
  302. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/targets/helioprojectiveradialarget.py +0 -0
  303. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/targets/picker/__init__.py +0 -0
  304. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/targets/picker/csvpicker.py +0 -0
  305. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/targets/picker/picker.py +0 -0
  306. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/targets/siderealtarget.py +0 -0
  307. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/targets/target.py +0 -0
  308. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scheduler/taskscheduler.py +0 -0
  309. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scripts/__init__.py +0 -0
  310. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scripts/calibration/__init__.py +0 -0
  311. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scripts/calibration/darkbias.py +0 -0
  312. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scripts/calibration/pointing.py +0 -0
  313. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scripts/calibration/skyflats.py +0 -0
  314. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scripts/control/__init__.py +0 -0
  315. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scripts/control/parallel.py +0 -0
  316. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scripts/control/selector.py +0 -0
  317. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scripts/control/sequential.py +0 -0
  318. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scripts/imaging/__init__.py +0 -0
  319. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scripts/imaging/autofocus.py +0 -0
  320. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scripts/imaging/transitimaging.py +0 -0
  321. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scripts/utils/__init__.py +0 -0
  322. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scripts/utils/callmodule.py +0 -0
  323. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scripts/utils/debugtrigger.py +0 -0
  324. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/scripts/utils/log.py +0 -0
  325. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/__init__.py +0 -0
  326. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/backend/__init__.py +0 -0
  327. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/backend/observationarchive.py +0 -0
  328. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/backend/taskarchive.py +0 -0
  329. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/filesystem/__init__.py +0 -0
  330. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/filesystem/observationarchive.py +0 -0
  331. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/filesystem/taskarchive.py +0 -0
  332. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/lco/__init__.py +0 -0
  333. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/lco/_portal.py +0 -0
  334. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/lco/_schedulereader.py +0 -0
  335. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/lco/_schedulewriter.py +0 -0
  336. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/lco/configdb.py +0 -0
  337. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/lco/mockobservationarchive.py +0 -0
  338. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/lco/observationarchive.py +0 -0
  339. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/lco/scripts/__init__.py +0 -0
  340. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/lco/scripts/autofocus.py +0 -0
  341. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/lco/scripts/script.py +0 -0
  342. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/lco/taskarchive.py +0 -0
  343. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/lco/taskrunner.py +0 -0
  344. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/memory/__init__.py +0 -0
  345. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/memory/observationarchive.py +0 -0
  346. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/memory/taskarchive.py +0 -0
  347. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/observationarchive.py +0 -0
  348. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/storage/taskarchive.py +0 -0
  349. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/taskrunner.py +0 -0
  350. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/utils/__init__.py +0 -0
  351. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/utils/archive/__init__.py +0 -0
  352. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/utils/archive/archive.py +0 -0
  353. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/utils/archive/local_archive.py +0 -0
  354. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/utils/archive/pyobs_archive.py +0 -0
  355. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/utils/exptime/__init__.py +0 -0
  356. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/utils/exptime/exptime.py +0 -0
  357. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/utils/exptime/stellarexptime.py +0 -0
  358. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/utils/skyflats/__init__.py +0 -0
  359. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/utils/skyflats/exptimeeval.py +0 -0
  360. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/utils/skyflats/flatfielder.py +0 -0
  361. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/utils/skyflats/pointing/__init__.py +0 -0
  362. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/utils/skyflats/pointing/base.py +0 -0
  363. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/utils/skyflats/pointing/static.py +0 -0
  364. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/utils/skyflats/priorities/__init__.py +0 -0
  365. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/utils/skyflats/priorities/archive.py +0 -0
  366. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/utils/skyflats/priorities/base.py +0 -0
  367. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/utils/skyflats/priorities/const.py +0 -0
  368. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/robotic/utils/skyflats/scheduler.py +0 -0
  369. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/__init__.py +0 -0
  370. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/average.py +0 -0
  371. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/cache.py +0 -0
  372. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/config.py +0 -0
  373. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/coordinates.py +0 -0
  374. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/curvefit.py +0 -0
  375. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/enums.py +0 -0
  376. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/exceptions.py +0 -0
  377. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/fits.py +0 -0
  378. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/focusseries/__init__.py +0 -0
  379. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/grids/__init__.py +0 -0
  380. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/grids/filters.py +0 -0
  381. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/grids/grid.py +0 -0
  382. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/grids/gridnode.py +0 -0
  383. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/grids/pipeline.py +0 -0
  384. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/gui/__init__.py +0 -0
  385. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/gui/camera/__init__.py +0 -0
  386. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/gui/camera/binningwidget.py +0 -0
  387. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/gui/camera/exposewidget.py +0 -0
  388. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/gui/camera/exposuretimewidget.py +0 -0
  389. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/gui/camera/imageformatwidget.py +0 -0
  390. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/gui/camera/listpickerdialog.py +0 -0
  391. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/gui/camera/windowingwidget.py +0 -0
  392. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/http.py +0 -0
  393. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/influxdb.py +0 -0
  394. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/logger.py +0 -0
  395. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/logging/__init__.py +0 -0
  396. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/logging/context.py +0 -0
  397. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/logging/resolvableerror.py +0 -0
  398. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/modulegui.py +0 -0
  399. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/offsets/__init__.py +0 -0
  400. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/offsets/applyaltazoffsets.py +0 -0
  401. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/offsets/applyoffsets.py +0 -0
  402. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/offsets/applyradecoffsets.py +0 -0
  403. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/pipeline/__init__.py +0 -0
  404. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/pipeline/night.py +0 -0
  405. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/pipeline/pipeline.py +0 -0
  406. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/publisher/__init__.py +0 -0
  407. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/publisher/csv.py +0 -0
  408. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/publisher/http.py +0 -0
  409. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/publisher/log.py +0 -0
  410. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/publisher/multi.py +0 -0
  411. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/publisher/publisher.py +0 -0
  412. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/serialization.py +0 -0
  413. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/shellcommand.py +0 -0
  414. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/threads/__init__.py +0 -0
  415. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/threads/lockwithabort.py +0 -0
  416. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/utils/time.py +0 -0
  417. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/version.py +0 -0
  418. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/vfs/__init__.py +0 -0
  419. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/vfs/archivefile.py +0 -0
  420. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/vfs/bufferedfile.py +0 -0
  421. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/vfs/file.py +0 -0
  422. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/vfs/filelists/__init__.py +0 -0
  423. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/vfs/filelists/filelist.py +0 -0
  424. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/vfs/filelists/testing.py +0 -0
  425. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/vfs/httpfile.py +0 -0
  426. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/vfs/localfile.py +0 -0
  427. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/vfs/memfile.py +0 -0
  428. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/vfs/sftpfile.py +0 -0
  429. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/vfs/smbfile.py +0 -0
  430. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/vfs/sshfile.py +0 -0
  431. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/vfs/tempfile.py +0 -0
  432. {pyobs_core-2.0.0.dev9 → pyobs_core-2.0.0.dev10}/pyobs/vfs/vfs.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyobs-core
3
- Version: 2.0.0.dev9
3
+ Version: 2.0.0.dev10
4
4
  Summary: robotic telescope software
5
5
  Author-email: Tim-Oliver Husser <thusser@uni-goettingen.de>
6
6
  License-Expression: MIT
@@ -193,14 +193,25 @@ class Comm:
193
193
  elif obj_type is None or isinstance(proxy, obj_type):
194
194
  return proxy
195
195
  else:
196
- raise ValueError(
197
- f'Proxy obtained from given name "{name_or_object}" is not of requested type "{obj_type}".'
198
- )
196
+ message = f'Proxy obtained from given name "{name_or_object}" is not of requested type "{obj_type}".'
197
+ hint = self._diagnose_missing_interface(name_or_object, obj_type)
198
+ if hint is not None:
199
+ message += f" {hint}"
200
+ raise ValueError(message)
199
201
 
200
202
  else:
201
203
  # completely wrong...
202
204
  raise ValueError(f'Given parameter is neither a name nor an object of requested type "{obj_type}".')
203
205
 
206
+ def _diagnose_missing_interface(self, client: str, obj_type: type[Any]) -> str | None:
207
+ """Backend hook, called when a proxy exists but doesn't implement obj_type.
208
+
209
+ Backends that can tell "genuinely missing" apart from "present at an
210
+ incompatible version" using data already in hand return a hint string
211
+ to append to the ValueError; other backends just return None.
212
+ """
213
+ return None
214
+
204
215
  async def _safe_resolve_proxy(
205
216
  self, name_or_object: str | object, obj_type: type[ProxyType] | None = None
206
217
  ) -> Any | ProxyType | None:
@@ -600,53 +611,5 @@ class Comm:
600
611
  if asyncio.iscoroutine(ret):
601
612
  asyncio.create_task(ret)
602
613
 
603
- def cast_to_simple_pre(self, value: Any, annotation: Any | None = None) -> tuple[bool, Any]:
604
- """Special treatment of single parameters when converting them to be sent via Comm.
605
-
606
- Args:
607
- value: Value to be treated.
608
- annotation: Annotation for value.
609
-
610
- Returns:
611
- A tuple containing a tuple that indicates whether this value should be further processed and a new value.
612
- """
613
- return False, value
614
-
615
- def cast_to_simple_post(self, value: Any, annotation: Any | None = None) -> tuple[bool, Any]:
616
- """Special treatment of single parameters when converting them to be sent via Comm.
617
-
618
- Args:
619
- value: Value to be treated.
620
- annotation: Annotation for value.
621
-
622
- Returns:
623
- A tuple containing a tuple that indicates whether this value should be further processed and a new value.
624
- """
625
- return False, value
626
-
627
- def cast_to_real_pre(self, value: Any, annotation: Any | None = None) -> tuple[bool, Any]:
628
- """Special treatment of single parameters when converting them after being sent via Comm.
629
-
630
- Args:
631
- value: Value to be treated.
632
- annotation: Annotation for value.
633
-
634
- Returns:
635
- A tuple containing a tuple that indicates whether this value should be further processed and a new value.
636
- """
637
- return False, value
638
-
639
- def cast_to_real_post(self, value: Any, annotation: Any | None = None) -> tuple[bool, Any]:
640
- """Special treatment of single parameters when converting them after being sent via Comm.
641
-
642
- Args:
643
- value: Value to be treated.
644
- annotation: Annotation for value.
645
-
646
- Returns:
647
- A tuple containing a tuple that indicates whether this value should be further processed and a new value.
648
- """
649
- return False, value
650
-
651
614
 
652
615
  __all__ = ["Comm"]
@@ -8,7 +8,6 @@ from pyobs.comm.comm import PresenceCallback
8
8
  from pyobs.events import Event
9
9
  from pyobs.interfaces import Interface
10
10
  from pyobs.utils.enums import ModuleState
11
- from pyobs.utils.types import cast_response_to_real
12
11
 
13
12
  from .localnetwork import LocalNetwork
14
13
 
@@ -53,11 +52,7 @@ class LocalComm(Comm):
53
52
  remote_client = self._network.get_client(client)
54
53
  if remote_client.module is None:
55
54
  raise ValueError
56
- simple_results = await remote_client.module.execute(method, *args, sender=self.name)
57
- real_results = cast_response_to_real(
58
- simple_results, annotation["return"], self.cast_to_real_pre, self.cast_to_real_post
59
- )
60
- return real_results
55
+ return await remote_client.module.execute(method, *args, sender=self.name)
61
56
 
62
57
  async def send_event(self, event: Event) -> None:
63
58
  """Send an event to other clients."""
@@ -7,7 +7,6 @@ from collections.abc import Coroutine
7
7
  from typing import TYPE_CHECKING, Any, Generic, TypeVar, get_type_hints
8
8
 
9
9
  from pyobs.interfaces import Interface
10
- from pyobs.utils.types import cast_bound_arguments_to_simple
11
10
 
12
11
  if TYPE_CHECKING:
13
12
  from pyobs.comm import Comm
@@ -123,11 +122,6 @@ class Proxy:
123
122
  ba = signature.bind(*args, **kwargs)
124
123
  ba.apply_defaults()
125
124
 
126
- # cast to simple types
127
- cast_bound_arguments_to_simple(
128
- ba, type_hints, pre=self._comm.cast_to_simple_pre, post=self._comm.cast_to_simple_post
129
- )
130
-
131
125
  # do request and return future
132
126
  return await self._comm.execute(self._client, method, type_hints, *ba.args[1:])
133
127
 
@@ -159,7 +159,7 @@ class RPC:
159
159
  jid: str | slixmpp.JID = iq["id"]
160
160
  if isinstance(jid, slixmpp.JID):
161
161
  jid = jid.node
162
- future = Future(annotation=annotation, comm=self._comm)
162
+ future = Future(annotation=annotation)
163
163
  self._futures[jid] = future
164
164
 
165
165
  await iq.send()
@@ -18,6 +18,7 @@ from slixmpp.xmlstream import ET
18
18
  from slixmpp.xmlstream.handler import Callback
19
19
  from slixmpp.xmlstream.matcher import MatchXMLMask
20
20
 
21
+ import pyobs.interfaces
21
22
  from pyobs.comm import Comm
22
23
  from pyobs.events import Event, LogEvent, ModuleClosedEvent, ModuleOpenedEvent
23
24
  from pyobs.events.event import EventFactory
@@ -144,6 +145,8 @@ class XmppComm(Comm):
144
145
  self._connected = False
145
146
  self._online_clients: list[str] = []
146
147
  self._interface_cache: dict[str, asyncio.Future[list[type[Interface]]]] = {}
148
+ self._interface_features: dict[str, list[str]] = {}
149
+ self._warned_version_mismatches: set[tuple[str, str]] = set()
147
150
  self._user = user
148
151
  self._password = password
149
152
  self._domain = domain
@@ -253,7 +256,7 @@ class XmppComm(Comm):
253
256
  # add features
254
257
  if self._module is not None:
255
258
  for i in self._module.interfaces:
256
- self._xmpp["xep_0030"].add_feature(f"pyobs:interface:{i.__name__}")
259
+ self._xmpp["xep_0030"].add_feature(f"urn:pyobs:interface:{i.__name__}:{i.version}")
257
260
 
258
261
  # register custom disco#info handler to inject <capability> elements
259
262
  if self._module is not None:
@@ -381,11 +384,24 @@ class XmppComm(Comm):
381
384
  try:
382
385
  if isinstance(info, slixmpp.stanza.iq.Iq):
383
386
  info = info["disco_info"]
384
- prefix = "pyobs:interface:"
385
- interface_names = [i[len(prefix) :] for i in info["features"] if i.startswith(prefix)]
387
+ prefix = "urn:pyobs:interface:"
388
+ features = [i for i in info["features"] if i.startswith(prefix)]
386
389
  except TypeError:
387
390
  raise IndexError()
388
391
 
392
+ # cache raw features for this JID, so a later version-mismatch can be diagnosed
393
+ self._interface_features[jid] = features
394
+
395
+ # keep only names whose remote-published version matches what this client expects --
396
+ # a mismatch is treated the same as the interface not being there at all, rather than
397
+ # silently using the local (possibly incompatible) class
398
+ interface_names = []
399
+ for feature in features:
400
+ name, _, version = feature[len(prefix) :].rpartition(":")
401
+ local_cls = getattr(pyobs.interfaces, name, None)
402
+ if local_cls is not None and issubclass(local_cls, Interface) and str(local_cls.version) == version:
403
+ interface_names.append(name)
404
+
389
405
  # IModule not in list?
390
406
  if "IModule" not in interface_names:
391
407
  # try again or quit?
@@ -398,6 +414,39 @@ class XmppComm(Comm):
398
414
  # finished
399
415
  return interface_names
400
416
 
417
+ def _diagnose_missing_interface(self, client: str, obj_type: type[Any]) -> str | None:
418
+ """Checks the disco#info features already cached for client for a version of obj_type
419
+ other than the one this client expects, to tell a version mismatch apart from
420
+ obj_type genuinely not being implemented at all.
421
+ """
422
+ jid = self._get_full_client_name(client)
423
+ features = self._interface_features.get(jid, [])
424
+ prefix = f"urn:pyobs:interface:{obj_type.__name__}:"
425
+ other = [f for f in features if f.startswith(prefix)]
426
+ if not other:
427
+ return None
428
+
429
+ remote_version = other[0][len(prefix) :]
430
+ try:
431
+ remote_version_int = int(remote_version)
432
+ except ValueError:
433
+ return None
434
+ direction = "upgrade the remote module" if remote_version_int < obj_type.version else "upgrade this client"
435
+
436
+ pair = (jid, obj_type.__name__)
437
+ if pair not in self._warned_version_mismatches:
438
+ self._warned_version_mismatches.add(pair)
439
+ log.warning(
440
+ '"%s" implements %s at v%s, this client expects v%s (%s).',
441
+ client,
442
+ obj_type.__name__,
443
+ remote_version,
444
+ obj_type.version,
445
+ direction,
446
+ )
447
+
448
+ return f"Remote implements it at v{remote_version}, this client expects v{obj_type.version} ({direction})."
449
+
401
450
  async def _supports_interface(self, client: str, interface: type[Interface]) -> bool:
402
451
  """Checks, whether the given client supports the given interface.
403
452
 
@@ -557,6 +606,7 @@ class XmppComm(Comm):
557
606
  # clear interface cache
558
607
  if jid in self._interface_cache:
559
608
  del self._interface_cache[jid]
609
+ self._interface_features.pop(jid, None)
560
610
 
561
611
  # send event
562
612
  self._send_event_to_module(ModuleClosedEvent(), module_name)
@@ -730,38 +780,6 @@ class XmppComm(Comm):
730
780
  # never should reach this
731
781
  raise slixmpp.exceptions.IqTimeout(iq)
732
782
 
733
- def cast_to_simple_pre(self, value: Any, annotation: Any | None = None) -> tuple[bool, Any]:
734
- """Special treatment of single parameters when converting them to be sent via Comm.
735
-
736
- Args:
737
- value: Value to be treated.
738
- annotation: Annotation for value.
739
-
740
- Returns:
741
- A tuple containing a tuple that indicates whether this value should be further processed and a new value.
742
- """
743
-
744
- if isinstance(value, str):
745
- return True, xml.sax.saxutils.escape(value)
746
- else:
747
- return False, value
748
-
749
- def cast_to_real_post(self, value: Any, annotation: Any | None = None) -> tuple[bool, Any]:
750
- """Special treatment of single parameters when converting them after being sent via Comm.
751
-
752
- Args:
753
- value: Value to be treated.
754
- annotation: Annotation for value.
755
-
756
- Returns:
757
- A tuple containing a tuple that indicates whether this value should be further processed and a new value.
758
- """
759
-
760
- if isinstance(value, str):
761
- return True, xml.sax.saxutils.unescape(value)
762
- else:
763
- return False, value
764
-
765
783
  @staticmethod
766
784
  def _state_namespace(interface: type[Interface]) -> str:
767
785
  return f"urn:pyobs:state:{interface.__name__}:{interface.version}"
@@ -1,24 +1,46 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from abc import ABCMeta, abstractmethod
4
+ from dataclasses import dataclass, field
4
5
  from typing import Annotated, Any
5
6
 
6
7
  from ..utils.enums import Unit
8
+ from ..utils.time import Time
7
9
  from .IAbortable import IAbortable
8
10
 
9
11
 
12
+ @dataclass
13
+ class AutoFocusResult:
14
+ focus: float
15
+ focus_err: float
16
+
17
+
18
+ @dataclass
19
+ class AutoFocusPoint: # AutoFocusStatus.points element
20
+ focus: float
21
+ value: float
22
+
23
+
24
+ @dataclass
25
+ class AutoFocusState: # growing curve during autofocus run
26
+ points: list[AutoFocusPoint] = field(default_factory=list)
27
+ time: Time = field(default_factory=Time.now)
28
+
29
+
10
30
  class IAutoFocus(IAbortable, metaclass=ABCMeta):
11
- """The module can perform an auto-focus."""
31
+ """The module can perform an autofocus."""
12
32
 
13
33
  __module__ = "pyobs.interfaces"
14
34
 
35
+ state = AutoFocusState
36
+
15
37
  @abstractmethod
16
38
  async def auto_focus(
17
39
  self, count: int, step: float, exposure_time: Annotated[float, Unit.SECONDS], **kwargs: Any
18
- ) -> tuple[float, float]:
19
- """Perform an auto-focus series.
40
+ ) -> AutoFocusResult:
41
+ """Perform an autofocus series.
20
42
 
21
- This method performs an auto-focus series with "count" images on each side of the initial guess and the given
43
+ This method performs an autofocus series with "count" images on each side of the initial guess and the given
22
44
  step size. With count=3, step=1 and guess=10, this takes images at the following focus values:
23
45
  7, 8, 9, 10, 11, 12, 13
24
46
 
@@ -28,23 +50,12 @@ class IAutoFocus(IAbortable, metaclass=ABCMeta):
28
50
  exposure_time: Exposure time for images.
29
51
 
30
52
  Returns:
31
- Tuple of obtained best focus value and its uncertainty.
53
+ Result of autofocus.
32
54
 
33
55
  Raises:
34
56
  ValueError: If focus could not be obtained.
35
57
  """
36
58
  ...
37
59
 
38
- @abstractmethod
39
- async def auto_focus_status(self, **kwargs: Any) -> dict[str, Any]:
40
- """Returns current status of auto focus.
41
-
42
- Returned dictionary contains a list of focus/fwhm pairs in X and Y direction.
43
-
44
- Returns:
45
- Dictionary with current status.
46
- """
47
- ...
48
-
49
60
 
50
- __all__ = ["IAutoFocus"]
61
+ __all__ = ["IAutoFocus", "AutoFocusResult", "AutoFocusPoint", "AutoFocusState"]
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  from abc import ABCMeta, abstractmethod
4
4
  from typing import Any
5
5
 
6
+ from .IFitsHeaderBefore import FitsHeaderEntry
6
7
  from .interface import Interface
7
8
 
8
9
 
@@ -15,7 +16,7 @@ class IFitsHeaderAfter(Interface, metaclass=ABCMeta):
15
16
  @abstractmethod
16
17
  async def get_fits_header_after(
17
18
  self, namespaces: list[str] | None = None, **kwargs: Any
18
- ) -> dict[str, tuple[Any, str]]:
19
+ ) -> dict[str, FitsHeaderEntry]:
19
20
  """Returns FITS header for the current status of this module.
20
21
 
21
22
  Args:
@@ -1,11 +1,18 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from abc import ABCMeta, abstractmethod
4
+ from dataclasses import dataclass
4
5
  from typing import Any
5
6
 
6
7
  from .interface import Interface
7
8
 
8
9
 
10
+ @dataclass
11
+ class FitsHeaderEntry:
12
+ value: int | float | str | None
13
+ comment: str
14
+
15
+
9
16
  class IFitsHeaderBefore(Interface, metaclass=ABCMeta):
10
17
  """The module provides some additional header entries for FITS headers before some event (usually the start of the
11
18
  exposure)."""
@@ -15,7 +22,7 @@ class IFitsHeaderBefore(Interface, metaclass=ABCMeta):
15
22
  @abstractmethod
16
23
  async def get_fits_header_before(
17
24
  self, namespaces: list[str] | None = None, **kwargs: Any
18
- ) -> dict[str, tuple[Any, str]]:
25
+ ) -> dict[str, FitsHeaderEntry]:
19
26
  """Returns FITS header for the current status of this module.
20
27
 
21
28
  Args:
@@ -27,4 +34,4 @@ class IFitsHeaderBefore(Interface, metaclass=ABCMeta):
27
34
  ...
28
35
 
29
36
 
30
- __all__ = ["IFitsHeaderBefore"]
37
+ __all__ = ["FitsHeaderEntry", "IFitsHeaderBefore"]
@@ -1,18 +1,23 @@
1
1
  from abc import ABCMeta, abstractmethod
2
+ from dataclasses import dataclass, field
2
3
  from typing import Any
3
4
 
5
+ from ..utils.time import Time
4
6
  from .interface import Interface
5
7
 
6
8
 
9
+ @dataclass
10
+ class OptimalFocusState: # 2.0 adds focus_err alongside the existing focus value
11
+ focus: float
12
+ time: Time = field(default_factory=Time.now)
13
+
14
+
7
15
  class IFocusModel(Interface, metaclass=ABCMeta):
8
16
  """The module provides a model for the telescope focus, e.g. based on temperatures."""
9
17
 
10
18
  __module__ = "pyobs.interfaces"
11
19
 
12
- @abstractmethod
13
- async def get_optimal_focus(self, **kwargs: Any) -> float:
14
- """Returns the optimal focus."""
15
- ...
20
+ state = OptimalFocusState
16
21
 
17
22
  @abstractmethod
18
23
  async def set_optimal_focus(self, **kwargs: Any) -> None:
@@ -0,0 +1,49 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import ABCMeta, abstractmethod
4
+ from dataclasses import dataclass, field
5
+ from typing import Any
6
+
7
+ from pyobs.utils.enums import WeatherSensors
8
+
9
+ from ..utils.time import Time
10
+ from .IStartStop import IStartStop
11
+
12
+
13
+ @dataclass
14
+ class WeatherSensorReading: # WeatherState.readings element
15
+ sensor: WeatherSensors
16
+ value: float
17
+ unit: str
18
+ time: Time = field(default_factory=Time.now)
19
+
20
+
21
+ @dataclass
22
+ class WeatherState:
23
+ good: bool
24
+ readings: list[WeatherSensorReading] = field(default_factory=list)
25
+ time: Time = field(default_factory=Time.now)
26
+
27
+
28
+ class IWeather(IStartStop, metaclass=ABCMeta):
29
+ """The module acts as a weather station."""
30
+
31
+ __module__ = "pyobs.interfaces"
32
+
33
+ state = WeatherState
34
+
35
+ @abstractmethod
36
+ async def get_sensor_value(self, station: str, sensor: WeatherSensors, **kwargs: Any) -> WeatherSensorReading:
37
+ """Return value for given sensor.
38
+
39
+ Args:
40
+ station: Name of weather station to get value from.
41
+ sensor: Name of sensor to get value from.
42
+
43
+ Returns:
44
+ Current reading for the given sensor.
45
+ """
46
+ ...
47
+
48
+
49
+ __all__ = ["IWeather", "WeatherState", "WeatherSensorReading"]
@@ -13,7 +13,7 @@ __title__ = "Interfaces"
13
13
 
14
14
  from .IAbortable import IAbortable
15
15
  from .IAcquisition import IAcquisition
16
- from .IAutoFocus import IAutoFocus
16
+ from .IAutoFocus import AutoFocusPoint, AutoFocusResult, AutoFocusState, IAutoFocus
17
17
  from .IAutoGuiding import IAutoGuiding
18
18
  from .IAutonomous import IAutonomous
19
19
  from .IBinning import BinningCapabilities, BinningState, IBinning
@@ -27,10 +27,10 @@ from .IExposure import ExposureState, IExposure
27
27
  from .IExposureTime import ExposureTimeState, IExposureTime
28
28
  from .IFilters import FiltersCapabilities, FilterState, IFilters
29
29
  from .IFitsHeaderAfter import IFitsHeaderAfter
30
- from .IFitsHeaderBefore import IFitsHeaderBefore
30
+ from .IFitsHeaderBefore import FitsHeaderEntry, IFitsHeaderBefore
31
31
  from .IFlatField import IFlatField
32
32
  from .IFocuser import FocuserState, IFocuser
33
- from .IFocusModel import IFocusModel
33
+ from .IFocusModel import IFocusModel, OptimalFocusState
34
34
  from .IGain import GainState, IGain
35
35
  from .IImageFormat import IImageFormat, ImageFormatCapabilities, ImageFormatState
36
36
  from .IImageType import IImageType, ImageTypeState
@@ -58,13 +58,16 @@ from .ISyncTarget import ISyncTarget
58
58
  from .ITelescope import ITelescope
59
59
  from .ITemperatures import ITemperatures, SensorReading, TemperaturesState
60
60
  from .IVideo import IVideo, VideoCapabilities
61
- from .IWeather import IWeather
61
+ from .IWeather import IWeather, WeatherSensorReading, WeatherState
62
62
  from .IWindow import IWindow, WindowCapabilities, WindowState
63
63
 
64
64
  __all__ = [
65
65
  "IAbortable",
66
66
  "IAcquisition",
67
67
  "IAutoFocus",
68
+ "AutoFocusResult",
69
+ "AutoFocusPoint",
70
+ "AutoFocusState",
68
71
  "IAutoGuiding",
69
72
  "IAutonomous",
70
73
  "IBinning",
@@ -84,10 +87,12 @@ __all__ = [
84
87
  "IFilters",
85
88
  "FiltersCapabilities",
86
89
  "FilterState",
90
+ "FitsHeaderEntry",
87
91
  "IFitsHeaderAfter",
88
92
  "IFitsHeaderBefore",
89
93
  "IFlatField",
90
94
  "IFocusModel",
95
+ "OptimalFocusState",
91
96
  "IFocuser",
92
97
  "FocuserState",
93
98
  "IGain",
@@ -141,6 +146,8 @@ __all__ = [
141
146
  "IVideo",
142
147
  "VideoCapabilities",
143
148
  "IWeather",
149
+ "WeatherState",
150
+ "WeatherSensorReading",
144
151
  "IWindow",
145
152
  "WindowCapabilities",
146
153
  "WindowState",
@@ -111,13 +111,8 @@ class FitsHeaderMixin:
111
111
  # add them to fits file
112
112
  if headers:
113
113
  log.debug("Adding additional FITS headers from %s...", client)
114
- for key, value in headers.items():
115
- # if value is not a string, it may be a list of value and comment
116
- if isinstance(value, list) and not isinstance(value, str):
117
- # convert list to tuple
118
- image.header[key] = tuple(value)
119
- else:
120
- image.header[key] = value
114
+ for key, entry in headers.items():
115
+ image.header[key] = (entry.value, entry.comment)
121
116
 
122
117
  async def add_fits_headers(self, image: Image | fits.PrimaryHDU) -> None:
123
118
  """Add requested FITS headers to header of given image.
@@ -3,6 +3,8 @@ from __future__ import annotations
3
3
  import logging
4
4
  from typing import Any
5
5
 
6
+ from pyobs.interfaces import FitsHeaderEntry
7
+
6
8
  log = logging.getLogger(__name__)
7
9
 
8
10
 
@@ -15,8 +17,8 @@ class FitsNamespaceMixin:
15
17
  self.__namespaces = {} if fits_namespaces is None else fits_namespaces
16
18
 
17
19
  def _filter_fits_namespace(
18
- self, hdr: dict[str, tuple[Any, str]], sender: str, namespaces: list[str] | None = None
19
- ) -> dict[str, tuple[Any, str]]:
20
+ self, hdr: dict[str, FitsHeaderEntry], sender: str, namespaces: list[str] | None = None
21
+ ) -> dict[str, FitsHeaderEntry]:
20
22
  """Filter FITS header keywords by given namespaces. If no namespaces are given, let all through. Always
21
23
  let keywords with this module's name as namespace pass.
22
24
 
@@ -120,7 +120,8 @@ class WeatherAwareMixin:
120
120
  try:
121
121
  # get good status
122
122
  async with module.proxy(this.__weather, IWeather) as proxy:
123
- this.__is_weather_good = await proxy.is_weather_good()
123
+ weather_state = await proxy.wait_for_state(IWeather, timeout=5.0)
124
+ this.__is_weather_good = weather_state.good if weather_state is not None else False
124
125
 
125
126
  except Exception:
126
127
  # could either not connect or weather is not good