pyobs-core 2.0.0.dev31__tar.gz → 2.0.0.dev33__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 (445) hide show
  1. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/PKG-INFO +1 -1
  2. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/xmppclient.py +15 -2
  3. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/xmppcomm.py +78 -19
  4. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyproject.toml +1 -1
  5. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/.gitignore +0 -0
  6. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/LICENSE +0 -0
  7. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/__init__.py +0 -0
  8. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/application.py +0 -0
  9. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/background_task.py +0 -0
  10. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/cli/__init__.py +0 -0
  11. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/cli/_cli.py +0 -0
  12. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/cli/pyobs.py +0 -0
  13. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/cli/pyobsd.py +0 -0
  14. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/cli/pyobsw.py +0 -0
  15. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/__init__.py +0 -0
  16. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/comm.py +0 -0
  17. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/commlogging.py +0 -0
  18. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/dummy/__init__.py +0 -0
  19. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/dummy/dummycomm.py +0 -0
  20. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/local/__init__.py +0 -0
  21. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/local/localcomm.py +0 -0
  22. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/local/localnetwork.py +0 -0
  23. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/proxy.py +0 -0
  24. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/__init__.py +0 -0
  25. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/rpc.py +0 -0
  26. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/serializer.py +0 -0
  27. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/xep_0009/__init__.py +0 -0
  28. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/xep_0009/binding.py +0 -0
  29. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/xep_0009/rpc.py +0 -0
  30. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/xep_0009_timeout/__init__.py +0 -0
  31. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/xep_0009_timeout/rpc.py +0 -0
  32. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/xep_0009_timeout/stanza/RPC.py +0 -0
  33. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/xep_0009_timeout/stanza/__init__.py +0 -0
  34. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/__init__.py +0 -0
  35. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/badweather.py +0 -0
  36. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/event.py +0 -0
  37. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/exposurestatuschanged.py +0 -0
  38. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/filterchanged.py +0 -0
  39. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/focusfound.py +0 -0
  40. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/goodweather.py +0 -0
  41. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/log.py +0 -0
  42. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/modechanged.py +0 -0
  43. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/moduleclosed.py +0 -0
  44. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/moduleopened.py +0 -0
  45. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/motionstatuschanged.py +0 -0
  46. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/move.py +0 -0
  47. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/newimage.py +0 -0
  48. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/newspectrum.py +0 -0
  49. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/offsets.py +0 -0
  50. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/roofclosing.py +0 -0
  51. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/roofopened.py +0 -0
  52. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/taskfailed.py +0 -0
  53. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/taskfinished.py +0 -0
  54. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/taskstarted.py +0 -0
  55. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/testevent.py +0 -0
  56. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/__init__.py +0 -0
  57. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/image.py +0 -0
  58. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/meta/__init__.py +0 -0
  59. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/meta/altazoffsets.py +0 -0
  60. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/meta/exptime.py +0 -0
  61. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/meta/genericoffset.py +0 -0
  62. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/meta/onskydistance.py +0 -0
  63. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/meta/pixeloffsets.py +0 -0
  64. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/meta/radecoffsets.py +0 -0
  65. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/meta/skyoffsets.py +0 -0
  66. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processor.py +0 -0
  67. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/__init__.py +0 -0
  68. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/_daobackgroundremover.py +0 -0
  69. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/annotation/__init__.py +0 -0
  70. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/annotation/_pillow.py +0 -0
  71. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/annotation/circle.py +0 -0
  72. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/annotation/crosshair.py +0 -0
  73. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/annotation/text.py +0 -0
  74. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/astrometry/__init__.py +0 -0
  75. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/astrometry/_dotnet_request.py +0 -0
  76. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/astrometry/_dotnet_request_builder.py +0 -0
  77. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/astrometry/_dotnet_request_logger.py +0 -0
  78. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/astrometry/_dotnet_response_saver.py +0 -0
  79. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/astrometry/astrometry.py +0 -0
  80. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/astrometry/dotnet.py +0 -0
  81. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/calibration/__init__.py +0 -0
  82. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/calibration/_calibration_cache.py +0 -0
  83. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/calibration/_ccddata_calibrator.py +0 -0
  84. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/calibration/calibration.py +0 -0
  85. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/detection/__init__.py +0 -0
  86. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/detection/_pysep_stats_calculator.py +0 -0
  87. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/detection/_source_catalog.py +0 -0
  88. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/detection/daophot.py +0 -0
  89. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/detection/pysep.py +0 -0
  90. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/detection/simpledisk.py +0 -0
  91. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/detection/sourcedetection.py +0 -0
  92. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/exptime/__init__.py +0 -0
  93. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/exptime/exptime.py +0 -0
  94. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/exptime/star.py +0 -0
  95. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/__init__.py +0 -0
  96. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/addfitsheaders.py +0 -0
  97. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/download.py +0 -0
  98. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/flip.py +0 -0
  99. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/grayscale.py +0 -0
  100. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/httpserver.py +0 -0
  101. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/normalize.py +0 -0
  102. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/save.py +0 -0
  103. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/saveimage.py +0 -0
  104. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/smooth.py +0 -0
  105. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/softbin.py +0 -0
  106. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/misc/__init__.py +0 -0
  107. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/misc/addmask.py +0 -0
  108. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/misc/catalogcircularmask.py +0 -0
  109. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/misc/circularmask.py +0 -0
  110. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/misc/createfilename.py +0 -0
  111. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/misc/imagesourcefilter.py +0 -0
  112. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/misc/removebackground.py +0 -0
  113. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/modules/__init__.py +0 -0
  114. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/modules/getfitsheaders.py +0 -0
  115. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/__init__.py +0 -0
  116. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/astrometry.py +0 -0
  117. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/brighteststar.py +0 -0
  118. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/brighteststar_guiding.py +0 -0
  119. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/dummyoffsets.py +0 -0
  120. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/dummyskyoffsets.py +0 -0
  121. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/fitsheader.py +0 -0
  122. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/offsets.py +0 -0
  123. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/pixeloffsets.py +0 -0
  124. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/projected.py +0 -0
  125. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/spilled_light.py +0 -0
  126. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/photometry/__init__.py +0 -0
  127. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/photometry/_photometry_calculator.py +0 -0
  128. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/photometry/_photutil_aperture_photometry.py +0 -0
  129. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/photometry/_sep_aperture_photometry.py +0 -0
  130. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/photometry/aperture_photometry.py +0 -0
  131. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/photometry/photometry.py +0 -0
  132. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/photometry/photutil.py +0 -0
  133. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/photometry/pysep.py +0 -0
  134. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/wcs/__init__.py +0 -0
  135. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/wcs/solarhelioprojective.py +0 -0
  136. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IAbortable.py +0 -0
  137. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IAcquisition.py +0 -0
  138. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IAutoFocus.py +0 -0
  139. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IAutoGuiding.py +0 -0
  140. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IAutonomous.py +0 -0
  141. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IBinning.py +0 -0
  142. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/ICalibrate.py +0 -0
  143. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/ICamera.py +0 -0
  144. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IConfig.py +0 -0
  145. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/ICooling.py +0 -0
  146. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IData.py +0 -0
  147. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IDataSequence.py +0 -0
  148. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IDome.py +0 -0
  149. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IExposure.py +0 -0
  150. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IExposureTime.py +0 -0
  151. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IFilters.py +0 -0
  152. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IFitsHeaderAfter.py +0 -0
  153. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IFitsHeaderBefore.py +0 -0
  154. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IFlatField.py +0 -0
  155. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IFocusModel.py +0 -0
  156. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IFocuser.py +0 -0
  157. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IGain.py +0 -0
  158. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IImageFormat.py +0 -0
  159. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IImageType.py +0 -0
  160. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IMode.py +0 -0
  161. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IModule.py +0 -0
  162. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IMotion.py +0 -0
  163. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IMultiFiber.py +0 -0
  164. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IOffsetsAltAz.py +0 -0
  165. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IOffsetsRaDec.py +0 -0
  166. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IPointingAltAz.py +0 -0
  167. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IPointingBody.py +0 -0
  168. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IPointingHeliocentricPolar.py +0 -0
  169. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IPointingHeliographicStonyhurst.py +0 -0
  170. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IPointingHelioprojective.py +0 -0
  171. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IPointingOrbitalElements.py +0 -0
  172. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IPointingRaDec.py +0 -0
  173. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IPointingSeries.py +0 -0
  174. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IReady.py +0 -0
  175. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IRoof.py +0 -0
  176. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IRotation.py +0 -0
  177. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IRunnable.py +0 -0
  178. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IRunning.py +0 -0
  179. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IScriptRunner.py +0 -0
  180. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/ISpectrograph.py +0 -0
  181. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IStartStop.py +0 -0
  182. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IStructuredConfig.py +0 -0
  183. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/ISyncTarget.py +0 -0
  184. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/ITelescope.py +0 -0
  185. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/ITemperatures.py +0 -0
  186. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/ITrackingMode.py +0 -0
  187. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/ITrackingRate.py +0 -0
  188. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IVideo.py +0 -0
  189. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IWeather.py +0 -0
  190. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IWindow.py +0 -0
  191. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/__init__.py +0 -0
  192. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/interface.py +0 -0
  193. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/mixins/__init__.py +0 -0
  194. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/mixins/camerasettings.py +0 -0
  195. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/mixins/fitsheader.py +0 -0
  196. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/mixins/fitsnamespace.py +0 -0
  197. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/mixins/follow.py +0 -0
  198. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/mixins/motionstatus.py +0 -0
  199. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/mixins/pipeline.py +0 -0
  200. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/mixins/waitformotion.py +0 -0
  201. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/mixins/weatheraware.py +0 -0
  202. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/__init__.py +0 -0
  203. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/camera/__init__.py +0 -0
  204. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/camera/adaptive.py +0 -0
  205. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/camera/basecamera.py +0 -0
  206. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/camera/basespectrograph.py +0 -0
  207. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/camera/basevideo.py +0 -0
  208. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/camera/dummycamera.py +0 -0
  209. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/camera/dummyspectrograph.py +0 -0
  210. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/camera/dummyvideo.py +0 -0
  211. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/camera/pipelinecamera.py +0 -0
  212. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/flatfield/__init__.py +0 -0
  213. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/flatfield/flatfield.py +0 -0
  214. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/flatfield/pointing.py +0 -0
  215. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/flatfield/scheduler.py +0 -0
  216. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/focus/__init__.py +0 -0
  217. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/focus/dummyautofocus.py +0 -0
  218. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/focus/focusmodel.py +0 -0
  219. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/focus/focusseries.py +0 -0
  220. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/image/__init__.py +0 -0
  221. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/image/imagewatcher.py +0 -0
  222. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/image/imagewriter.py +0 -0
  223. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/image/pipeline.py +0 -0
  224. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/image/seeing.py +0 -0
  225. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/module.py +0 -0
  226. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/__init__.py +0 -0
  227. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/_base.py +0 -0
  228. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/_baseguiding.py +0 -0
  229. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/acquisition.py +0 -0
  230. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/autoguiding.py +0 -0
  231. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/dummyacquisition.py +0 -0
  232. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/dummyguiding.py +0 -0
  233. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/guidingstatistics/__init__.py +0 -0
  234. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/guidingstatistics/guidingstatistics.py +0 -0
  235. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/guidingstatistics/pixeloffset.py +0 -0
  236. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/guidingstatistics/skyoffsets.py +0 -0
  237. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/guidingstatistics/uptime.py +0 -0
  238. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/scienceframeguiding.py +0 -0
  239. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/robotic/__init__.py +0 -0
  240. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/robotic/mastermind.py +0 -0
  241. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/robotic/pointing.py +0 -0
  242. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/robotic/scheduler.py +0 -0
  243. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/robotic/scriptrunner.py +0 -0
  244. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/roof/__init__.py +0 -0
  245. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/roof/basedome.py +0 -0
  246. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/roof/baseroof.py +0 -0
  247. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/roof/dummyroof.py +0 -0
  248. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/telescope/__init__.py +0 -0
  249. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/telescope/_dummytelescopebase.py +0 -0
  250. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/telescope/basetelescope.py +0 -0
  251. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/telescope/dummyaltaztelescope.py +0 -0
  252. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/telescope/dummyradectelescope.py +0 -0
  253. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/telescope/dummysolartelescope.py +0 -0
  254. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/test/__init__.py +0 -0
  255. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/test/standalone.py +0 -0
  256. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/utils/__init__.py +0 -0
  257. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/utils/dummymode.py +0 -0
  258. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/utils/fluentlogger.py +0 -0
  259. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/utils/httpfilecache.py +0 -0
  260. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/utils/kiosk.py +0 -0
  261. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/utils/matrix.py +0 -0
  262. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/utils/stellarium.py +0 -0
  263. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/utils/telegram.py +0 -0
  264. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/utils/trigger.py +0 -0
  265. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/weather/__init__.py +0 -0
  266. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/weather/mockweather.py +0 -0
  267. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/weather/weather.py +0 -0
  268. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/weather/weather_api.py +0 -0
  269. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/weather/weather_state.py +0 -0
  270. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/object.py +0 -0
  271. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/py.typed +0 -0
  272. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/__init__.py +0 -0
  273. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/observation.py +0 -0
  274. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/__init__.py +0 -0
  275. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/astroplanscheduler.py +0 -0
  276. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/constraints/__init__.py +0 -0
  277. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/constraints/airmassconstraint.py +0 -0
  278. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/constraints/constraint.py +0 -0
  279. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/constraints/moonilluminationconstraint.py +0 -0
  280. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/constraints/moonseparationconstraint.py +0 -0
  281. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/constraints/solarelevationconstraint.py +0 -0
  282. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/constraints/timeconstraint.py +0 -0
  283. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/dataprovider.py +0 -0
  284. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/merits/__init__.py +0 -0
  285. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/merits/aftertime.py +0 -0
  286. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/merits/beforetime.py +0 -0
  287. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/merits/constant.py +0 -0
  288. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/merits/follow.py +0 -0
  289. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/merits/interval.py +0 -0
  290. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/merits/merit.py +0 -0
  291. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/merits/pernight.py +0 -0
  292. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/merits/random.py +0 -0
  293. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/merits/timewindow.py +0 -0
  294. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/merits/transit.py +0 -0
  295. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/observationarchiveevolution.py +0 -0
  296. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/ondemandscheduler.py +0 -0
  297. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/targets/__init__.py +0 -0
  298. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/targets/dynamictarget.py +0 -0
  299. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/targets/heliocentricpolartarget.py +0 -0
  300. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/targets/helioprojectivetarget.py +0 -0
  301. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/targets/picker/__init__.py +0 -0
  302. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/targets/picker/csvpicker.py +0 -0
  303. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/targets/picker/picker.py +0 -0
  304. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/targets/siderealtarget.py +0 -0
  305. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/targets/target.py +0 -0
  306. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/taskscheduler.py +0 -0
  307. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/__init__.py +0 -0
  308. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/calibration/__init__.py +0 -0
  309. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/calibration/darkbias.py +0 -0
  310. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/calibration/pointing.py +0 -0
  311. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/calibration/skyflats.py +0 -0
  312. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/control/__init__.py +0 -0
  313. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/control/cases.py +0 -0
  314. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/control/conditional.py +0 -0
  315. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/control/parallel.py +0 -0
  316. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/control/selector.py +0 -0
  317. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/control/sequential.py +0 -0
  318. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/exceptions.py +0 -0
  319. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/imaging/__init__.py +0 -0
  320. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/imaging/autofocus.py +0 -0
  321. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/imaging/imaging.py +0 -0
  322. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/imaging/transitimaging.py +0 -0
  323. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/script.py +0 -0
  324. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/utils/__init__.py +0 -0
  325. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/utils/callmodule.py +0 -0
  326. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/utils/debugtrigger.py +0 -0
  327. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/utils/log.py +0 -0
  328. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/__init__.py +0 -0
  329. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/backend/__init__.py +0 -0
  330. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/backend/observationarchive.py +0 -0
  331. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/backend/taskarchive.py +0 -0
  332. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/filesystem/__init__.py +0 -0
  333. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/filesystem/observationarchive.py +0 -0
  334. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/filesystem/taskarchive.py +0 -0
  335. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/__init__.py +0 -0
  336. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/_portal.py +0 -0
  337. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/_schedulereader.py +0 -0
  338. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/_schedulewriter.py +0 -0
  339. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/configdb.py +0 -0
  340. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/mockobservationarchive.py +0 -0
  341. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/observationarchive.py +0 -0
  342. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/scripts/__init__.py +0 -0
  343. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/scripts/autofocus.py +0 -0
  344. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/scripts/default.py +0 -0
  345. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/scripts/script.py +0 -0
  346. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/task.py +0 -0
  347. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/taskarchive.py +0 -0
  348. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/taskrunner.py +0 -0
  349. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/memory/__init__.py +0 -0
  350. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/memory/observationarchive.py +0 -0
  351. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/memory/taskarchive.py +0 -0
  352. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/observationarchive.py +0 -0
  353. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/taskarchive.py +0 -0
  354. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/task.py +0 -0
  355. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/taskrunner.py +0 -0
  356. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/__init__.py +0 -0
  357. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/archive/__init__.py +0 -0
  358. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/archive/archive.py +0 -0
  359. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/archive/local_archive.py +0 -0
  360. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/archive/pyobs_archive.py +0 -0
  361. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/exptime/__init__.py +0 -0
  362. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/exptime/exptime.py +0 -0
  363. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/exptime/stellarexptime.py +0 -0
  364. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/skyflats/__init__.py +0 -0
  365. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/skyflats/exptimeeval.py +0 -0
  366. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/skyflats/flatfielder.py +0 -0
  367. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/skyflats/pointing/__init__.py +0 -0
  368. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/skyflats/pointing/base.py +0 -0
  369. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/skyflats/pointing/static.py +0 -0
  370. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/skyflats/priorities/__init__.py +0 -0
  371. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/skyflats/priorities/archive.py +0 -0
  372. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/skyflats/priorities/base.py +0 -0
  373. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/skyflats/priorities/const.py +0 -0
  374. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/skyflats/scheduler.py +0 -0
  375. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/__init__.py +0 -0
  376. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/average.py +0 -0
  377. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/cache.py +0 -0
  378. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/config.py +0 -0
  379. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/config_schema.py +0 -0
  380. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/coordinates.py +0 -0
  381. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/curvefit.py +0 -0
  382. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/enums.py +0 -0
  383. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/exceptions.py +0 -0
  384. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/fits.py +0 -0
  385. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/focusseries/__init__.py +0 -0
  386. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/focusseries/base.py +0 -0
  387. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/focusseries/photometry.py +0 -0
  388. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/focusseries/projection.py +0 -0
  389. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/grids/__init__.py +0 -0
  390. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/grids/filters.py +0 -0
  391. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/grids/grid.py +0 -0
  392. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/grids/gridnode.py +0 -0
  393. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/grids/pipeline.py +0 -0
  394. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/gui/__init__.py +0 -0
  395. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/gui/camera/__init__.py +0 -0
  396. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/gui/camera/binningwidget.py +0 -0
  397. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/gui/camera/datadisplaywidget.py +0 -0
  398. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/gui/camera/exposewidget.py +0 -0
  399. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/gui/camera/exposuretimewidget.py +0 -0
  400. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/gui/camera/imageformatwidget.py +0 -0
  401. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/gui/camera/listpickerdialog.py +0 -0
  402. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/gui/camera/windowingwidget.py +0 -0
  403. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/http.py +0 -0
  404. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/influxdb.py +0 -0
  405. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/logger.py +0 -0
  406. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/logging/__init__.py +0 -0
  407. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/logging/context.py +0 -0
  408. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/logging/resolvableerror.py +0 -0
  409. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/modulegui.py +0 -0
  410. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/offsets/__init__.py +0 -0
  411. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/offsets/applyaltazoffsets.py +0 -0
  412. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/offsets/applyoffsets.py +0 -0
  413. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/offsets/applyradecoffsets.py +0 -0
  414. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/parallel.py +0 -0
  415. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/pipeline/__init__.py +0 -0
  416. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/pipeline/night.py +0 -0
  417. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/pipeline/pipeline.py +0 -0
  418. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/publisher/__init__.py +0 -0
  419. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/publisher/csv.py +0 -0
  420. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/publisher/http.py +0 -0
  421. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/publisher/log.py +0 -0
  422. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/publisher/multi.py +0 -0
  423. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/publisher/publisher.py +0 -0
  424. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/serialization.py +0 -0
  425. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/shellcommand.py +0 -0
  426. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/threads/__init__.py +0 -0
  427. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/threads/lockwithabort.py +0 -0
  428. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/time.py +0 -0
  429. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/units.py +0 -0
  430. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/version.py +0 -0
  431. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/__init__.py +0 -0
  432. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/archivefile.py +0 -0
  433. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/bufferedfile.py +0 -0
  434. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/file.py +0 -0
  435. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/filelists/__init__.py +0 -0
  436. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/filelists/filelist.py +0 -0
  437. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/filelists/testing.py +0 -0
  438. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/httpfile.py +0 -0
  439. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/localfile.py +0 -0
  440. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/memfile.py +0 -0
  441. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/sftpfile.py +0 -0
  442. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/smbfile.py +0 -0
  443. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/sshfile.py +0 -0
  444. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/tempfile.py +0 -0
  445. {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/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.dev31
3
+ Version: 2.0.0.dev33
4
4
  Summary: robotic telescope software
5
5
  Author-email: Tim-Oliver Husser <thusser@uni-goettingen.de>
6
6
  License-Expression: MIT
@@ -15,7 +15,14 @@ log = logging.getLogger(__name__)
15
15
  class XmppClient(slixmpp.ClientXMPP):
16
16
  """XMPP client for pyobs."""
17
17
 
18
- def __init__(self, jid: str, password: str, **kwargs: Any):
18
+ def __init__(
19
+ self,
20
+ jid: str,
21
+ password: str,
22
+ ping_interval: float = 300.0,
23
+ ping_timeout: float = 30.0,
24
+ **kwargs: Any,
25
+ ):
19
26
  """Create a new XMPP client.
20
27
 
21
28
  An XmppClient handles the actual XMPP communication for the XmppComm module.
@@ -23,6 +30,12 @@ class XmppClient(slixmpp.ClientXMPP):
23
30
  Args:
24
31
  jid: Connect to the XMPP server with the given JID.
25
32
  password: Password to use for connection.
33
+ ping_interval: Seconds between XEP-0199 keepalive pings.
34
+ ping_timeout: Seconds to wait for a ping reply before treating the connection as
35
+ dead and reconnecting. If the server-side shaper can delay an IQ reply by more
36
+ than this, keepalive pings misfire as false disconnects -- raise this to be more
37
+ tolerant of a throttled/slow server instead of only tolerating a genuinely dead
38
+ connection.
26
39
  """
27
40
 
28
41
  slixmpp.ClientXMPP.__init__(self, jid, password, **kwargs)
@@ -51,7 +64,7 @@ class XmppClient(slixmpp.ClientXMPP):
51
64
  self.register_plugin("xep_0199") # XMPP Ping
52
65
 
53
66
  # enable keep alive pings
54
- self.plugin["xep_0199"].enable_keepalive()
67
+ self.plugin["xep_0199"].enable_keepalive(interval=ping_interval, timeout=ping_timeout)
55
68
 
56
69
  # handle session_start and message events
57
70
  self.add_event_handler("session_start", self.session_start)
@@ -4,6 +4,7 @@ import asyncio
4
4
  import functools
5
5
  import json
6
6
  import logging
7
+ import random
7
8
  import re
8
9
  import ssl
9
10
  import time
@@ -36,6 +37,17 @@ if TYPE_CHECKING:
36
37
  log = logging.getLogger(__name__)
37
38
 
38
39
 
40
+ def _retry_delay(attempt: int, cap: float = 30.0, base: float = 1.0) -> float:
41
+ """Capped exponential backoff with full jitter.
42
+
43
+ Used for retry loops that can end up running on every module in the fleet at once (e.g.
44
+ every module reconnecting to ejabberd simultaneously after a mass restart). Fixed-interval
45
+ retries stay in lockstep across all of them, repeatedly hammering the server at the same
46
+ instants; jitter decorrelates that so retries spread out over time instead.
47
+ """
48
+ return random.uniform(0, min(cap, base * (2**attempt)))
49
+
50
+
39
51
  class EventStanza(ElementBase):
40
52
  name = "event"
41
53
  namespace = "pyobs:event"
@@ -95,6 +107,16 @@ class XmppComm(Comm):
95
107
  Finally, always make sure that ``use_tls`` is set according to the server's settings, i.e. if it uses TLS, this
96
108
  parameter must be True, and False otherwise. Cryptic error messages will follow, if one does not set this properly.
97
109
 
110
+ ``ping_interval``/``ping_timeout`` control the XEP-0199 keepalive ping that detects a dead connection.
111
+ ``ping_timeout`` in particular may need raising above its 30s default on a server whose shaper can delay an IQ
112
+ reply that long under load -- otherwise a merely-slow reply is indistinguishable from a dead connection and
113
+ triggers a reconnect that didn't need to happen::
114
+
115
+ comm:
116
+ class: pyobs.comm.xmpp.XmppComm
117
+ jid: someuser@example.com/pyobs
118
+ ping_timeout: 60
119
+
98
120
  """
99
121
 
100
122
  __module__ = "pyobs.comm.xmpp"
@@ -109,6 +131,8 @@ class XmppComm(Comm):
109
131
  server: str | None = None,
110
132
  use_tls: bool = False,
111
133
  ignore_cert_errors: bool = False,
134
+ ping_interval: float = 300.0,
135
+ ping_timeout: float = 30.0,
112
136
  *args: Any,
113
137
  **kwargs: Any,
114
138
  ):
@@ -124,6 +148,8 @@ class XmppComm(Comm):
124
148
  password: Password for given JID.
125
149
  server: Server to connect to. If not given, domain from JID is used.
126
150
  use_tls: Whether to use TLS.
151
+ ping_interval: Seconds between XEP-0199 keepalive pings.
152
+ ping_timeout: Seconds to wait for a ping reply before reconnecting.
127
153
  """
128
154
  Comm.__init__(self, *args, **kwargs)
129
155
 
@@ -140,6 +166,8 @@ class XmppComm(Comm):
140
166
  self._server = server
141
167
  self._use_tls = use_tls
142
168
  self._ignore_cert_errors = ignore_cert_errors
169
+ self._ping_interval = ping_interval
170
+ self._ping_timeout = ping_timeout
143
171
  self._loop = asyncio.get_event_loop()
144
172
  self._safe_send_attempts = 5
145
173
  self._safe_send_wait = 1
@@ -217,7 +245,9 @@ class XmppComm(Comm):
217
245
  self._xmpp.abort()
218
246
 
219
247
  # create client
220
- self._xmpp = XmppClient(self._jid, self._password)
248
+ self._xmpp = XmppClient(
249
+ self._jid, self._password, ping_interval=self._ping_interval, ping_timeout=self._ping_timeout
250
+ )
221
251
 
222
252
  # presence gating (see mark_ready()) only applies to a comm with an actual Module
223
253
  # attached that hasn't finished starting yet -- a module-less XmppComm (a GUI, an
@@ -929,8 +959,12 @@ class XmppComm(Comm):
929
959
  async def _get_capabilities(self, module: str, interface: type[Interface]) -> Any | None:
930
960
  """Fetch and deserialize capabilities for a remote module's interface.
931
961
 
932
- Retries a few times, since this may run right as the peer is still starting up and hasn't
933
- published its capabilities yet.
962
+ Retries indefinitely (capped exponential backoff with jitter) instead of giving up after
963
+ a fixed budget -- a peer that's merely slow to respond (e.g. every module in the fleet
964
+ reconnecting to ejabberd at once) must still eventually get its capabilities fetched
965
+ without requiring a full disconnect/reconnect of that peer to retrigger discovery. Only
966
+ stops if the peer itself goes offline in the meantime, since a fresh fetch is triggered
967
+ from scratch the next time it comes back online (see _got_online).
934
968
  """
935
969
  if interface.capabilities is None:
936
970
  return None
@@ -938,24 +972,36 @@ class XmppComm(Comm):
938
972
 
939
973
  result = None
940
974
  last_error: BaseException | None = None
941
- for attempt in range(3):
975
+ attempt = 0
976
+ while True:
942
977
  # Use full JID (with resource) if we know it — bare JID may not route correctly
943
- full_jid = next(
944
- (jid for jid in self._online_clients if jid.startswith(f"{module}@")),
945
- f"{module}@{self._domain}",
946
- )
978
+ full_jid = next((jid for jid in self._online_clients if jid.startswith(f"{module}@")), None)
979
+ if full_jid is None and attempt > 0:
980
+ log.debug(
981
+ "Giving up fetching capabilities for %s from %s: peer went offline",
982
+ interface.__name__,
983
+ module,
984
+ )
985
+ return None
947
986
  try:
948
987
  result = await asyncio.wait_for(
949
- self.client.plugin["xep_0030"].get_info(jid=JID(full_jid)), timeout=10.0
988
+ self.client.plugin["xep_0030"].get_info(jid=JID(full_jid or f"{module}@{self._domain}")),
989
+ timeout=10.0,
950
990
  )
951
991
  break
952
- except (TimeoutError, Exception) as e:
992
+ except Exception as e:
953
993
  last_error = e
954
- if attempt < 2:
955
- await asyncio.sleep(2)
956
- else:
957
- log.warning("Failed to get capabilities for %s from %s: %s", interface.__name__, module, last_error)
958
- return None
994
+ attempt += 1
995
+ if attempt == 3:
996
+ log.warning(
997
+ "Still failing to get capabilities for %s from %s after %d attempts (%s), "
998
+ "will keep retrying",
999
+ interface.__name__,
1000
+ module,
1001
+ attempt,
1002
+ last_error,
1003
+ )
1004
+ await asyncio.sleep(_retry_delay(attempt))
959
1005
  log.debug("get_capabilities disco result XML: %s", ET.tostring(result.xml).decode()[:500])
960
1006
  # result.xml is the <iq> — the <query> is its child, capabilities are grandchildren
961
1007
  for child in result.xml:
@@ -1012,17 +1058,30 @@ class XmppComm(Comm):
1012
1058
  async def _subscribe_with_retry(self, node: str, interface: type[Interface]) -> None:
1013
1059
  """Subscribe to a pubsub node, retrying until the node exists.
1014
1060
 
1015
- Runs as a background task so _subscribe_state returns immediately.
1061
+ Runs as a background task so _subscribe_state returns immediately. Retries indefinitely
1062
+ (capped exponential backoff with jitter) instead of giving up after a fixed budget -- a
1063
+ node that's merely slow to appear (e.g. every module in the fleet reconnecting to
1064
+ ejabberd at once, or the publisher hasn't started up yet) must still eventually get
1065
+ subscribed without manual intervention. Stops only if _unsubscribe_state removes the
1066
+ last callback for this node in the meantime -- the while condition then goes False,
1067
+ which exits the loop into the else clause (not the break path) and returns.
1016
1068
  Once subscribed, fetches the current value and dispatches it.
1017
1069
  """
1018
- for _attempt in range(30):
1070
+ attempt = 0
1071
+ while node in self._state_node_handlers:
1019
1072
  try:
1020
1073
  await self._safe_send(self.client.plugin["xep_0060"].subscribe, self._pubsub_service, node)
1021
1074
  break
1022
1075
  except (slixmpp.exceptions.IqError, slixmpp.exceptions.IqTimeout):
1023
- await asyncio.sleep(1)
1076
+ attempt += 1
1077
+ if attempt == 30:
1078
+ log.warning(
1079
+ "Still failing to subscribe to state node %s after %d attempts, will keep retrying",
1080
+ node,
1081
+ attempt,
1082
+ )
1083
+ await asyncio.sleep(_retry_delay(attempt))
1024
1084
  else:
1025
- log.warning("Could not subscribe to state node %s after 30 attempts", node)
1026
1085
  return
1027
1086
 
1028
1087
  # Fetch current value immediately after subscribing
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pyobs-core"
3
- version = "2.0.0.dev31"
3
+ version = "2.0.0.dev33"
4
4
  description = "robotic telescope software"
5
5
  authors = [{ name = "Tim-Oliver Husser", email = "thusser@uni-goettingen.de" }]
6
6
  requires-python = ">=3.11"