# indi_pylibcamera
This project implements a Raspberry Pi camera driver for INDI (https://indilib.org/).
Raspberry Pi cameras allow the amateur astronomer to make astonishing pictures with small budget. Especially the
Raspberry Pi HQ camera can compete with expensive astro cameras.
The driver is based on the new camera framework "libcamera" (https://github.com/raspberrypi/libcamera) which is
already part of many Raspberry Pi operating systems. It is made and optimized to run on a Raspberry Pi Zero with
HQ camera connected. Of course, it will also run on a more capable Raspberry Pi.
The "indi_pylibcamera" may support all cameras supported by "libcamera". But not all cameras will provide image data
in the required formats (raw Bayer or at least RGB). So it is not guaranteed that the driver will work with all
cameras you can connect to a Raspberry Pi.
The 'indi_pylibcamera' is one layer in a stack of software:
```
INDI client (for instance KStars, PHD2, CCDciel, ...)
--> INDI server
--> indi_pylibcamera
--> picamera2
--> libcamera library
--> kernel driver
```
It can not work when the versions of `libcamera` and `picamera2` are too old (both are in a dynamic development).
And it can not work when the libcamera-tools (like `libcamera-hello` and `libcamera-still`) have issues with your
camera.
## Requirements and installation
Some packages need to be installed with `apt`:
- `libcamera` and `libcamera-apps` (if not already installed). You can test libcamera and the support
for your camera with:
```commandline
libcamera-hello --list-cameras
```
You must be able to make RAW pictures in all modes. For instance `libcamera-hello` shows for the HQ camera:
```
0 : imx477 [4056x3040] (/base/soc/i2c0mux/i2c@1/imx477@1a)
Modes: 'SRGGB10_CSI2P' : 1332x990 [120.05 fps - (696, 528)/2664x1980 crop]
'SRGGB12_CSI2P' : 2028x1080 [50.03 fps - (0, 440)/4056x2160 crop]
2028x1520 [40.01 fps - (0, 0)/4056x3040 crop]
4056x3040 [10.00 fps - (0, 0)/4056x3040 crop]
```
and you must be able to run these commands without errors:
```commandline
libcamera-still -r --mode 1332:990 --shutter 100000 --gain 1 --awbgains 1,1 --immediate -o test.jpg
libcamera-still -r --mode 2028:1080 --shutter 100000 --gain 1 --awbgains 1,1 --immediate -o test.jpg
libcamera-still -r --mode 2028:1520 --shutter 100000 --gain 1 --awbgains 1,1 --immediate -o test.jpg
libcamera-still -r --mode 4056:3040 --shutter 100000 --gain 1 --awbgains 1,1 --immediate -o test.jpg
```
Something with your libcamera or kernel driver installation will be wrong if this does not work.
- Install INDI core library. If there is no pre-compiled package for your hardware you will need to compile it
by yourself. Instructions can be found here: https://github.com/indilib/indi.
The scripts on https://gitea.nouspiro.space/nou/astro-soft-build automate compilation and installation.
A Raspberry Pi Zero does not have enough RAM to compile with 4 threads in parallel: you need to do `make -j1` instead of `make -j4`.
Finally, after installation, you need to have a working INDI server: `indiserver -v indi_simulator_telescope`
- Some Python packages require matching versions of system libraries. They must be installed with `apt`:
```commandline
sudo apt install python3-pip libcamera-apps python3-picamera2 python3-lxml python3-astropy python3-numpy python3-venv
```
The Raspberry Pi OS "Bullseye" still allowed to install system wide with `sudo pip install indi_pylibcamera`.
Since "Bookworm" a virtual environment is required to install non-system Python packages. Trying to install
`indi_pylibcamera` without a virtual environment will fail with `error: externally-managed-environment`.
Run the following on a command line to install `indi_pylibcamera`in a virtual environment called `venv_indi_pylibcamera`
(you can name the virtual environment as you want):
```commandline
python3 -m venv --system-site-packages ~/venv_indi_pylibcamera
source ~/venv_indi_pylibcamera/bin/activate
pip install --upgrade pip
pip install indi_pylibcamera
```
## Some hints when you get trouble
The Python packages `picamera2`, `numpy`, and ` astropy` MUST be installed with `sudo apt install`.
You MUST NOT update them with `pip`. When you get errors related to these packages you can:
1. Check directory `~/.local/lib/python3.9/site-packages` if it contains one of these packages. If yes delete them!
2. Check if `pip list` shows different version numbers than `apt list` for these packages:
```commandline
pip list | grep numpy
apt list | grep numpy
pip list | grep astropy
apt list | grep astropy
pip list | grep picamera2
apt list | grep picamera2
```
If you see different versions for a package remove it with `pip uninstall` and reinstall it with
`sudo apt reinstall`.
3. Remove and recreate the virtual environment.
## Uninstall
For uninstalling the driver do:
```commandline
sudo rm -f /usr/share/indi/indi_pylibcamera.xml
rm -rf ~/venv_indi_pylibcamera
```
## Running
At the moment there is no support to start the driver from the EKOS profile editor.
The driver and the indi server must be started in shell with activated virtual environment:
```commandline
source ~/venv_indi_pylibcamera/bin/activate
```
In the same shell you can start the INDI server with `indiserver -v indi_pylibcamera`. When the server is running
you can connect to the server from another computer with an INDI client (for instance KStars/EKOS). The camera name
is the one you configure in `indi_pylibcamera.ini`.
I recommend you to make a wrapper script to activate the environment and start the driver.
## Global Configuration
The driver uses a hierarchy of configuration files to set global parameter. These configuration files are loaded in the
following order:
- `indi_pylibcamera.ini` in the program installation directory (typically in `/usr/lib/python*/site_packages`)
- `$INDI_PYLIBCAMERA_CONFIG_PATH/indi_pylibcamera.ini`
- `$HOME/.indi_pylibcamera/indi_pylibcamera.ini`
- `./.indi_pylibcamera/indi_pylibcamera.ini`
The configuration file must have the section `[driver]`. The most important keys are:
- `DeviceName` (string): INDI name of the device. This allows to distinguish indi_pylibcamera devices in your setup.
For instance you can have one Raspberry Pi with HQ camera as main camera for taking photos and a second Raspberry Pi with
a V1 camera for auto guiding.
- `SendTimeStamps` (`yes`, `no`, `on`, `off`, `true`, `false`, `1`, `0`): Add a timestamp to the messages send from
the device to the client. Such timestamps are needed in very seldom cases only, and usually it is okay to set this
to `no`. If you really need timestamps make sure that the system clock is correct.
- `force_UnitCellSize_X`, `force_UnitCellSize_Y` and `force_Rotation`: Some cameras are not fully supported by
libcamera and do not provide all needed information. The configuration file allows to force pixel size and Bayer
pattern rotation for such cameras.
- `LoggingLevel`: The driver has buttons to set the logging level. But sometimes you need a higher logging level right
at the beginning of the driver initialization. This can be done here in the INI file.
- `DoSnooping`: The INDI protocol allows a driver to ask other drivers for information. This is called "snooping". The
indi_pylibcamera driver uses this feature to get observer location, telescope information and telescope direction
from the mount driver. It writes these information as metadata in the FITS images. This function got newly implemented
and may make trouble in some setups. With the `DoSnooping` you can disable this function.
- `force_Restart` (`yes`, `no`, `auto`): Some cameras crash after the first exposure. Restarting the camera before
every frame exposure can solve this issue. Valid values of this switch are:
* `no`: Do not restart if not needed to reconfigure camera.
* `yes`: Always restart. Can lead to longer time between frames.
* `auto`: Automatically choose based on list of known critical cameras.
Default (if not otherwise set in INI file) is `auto`.
- `enable_IERS_autoupdate` (`yes`, `no`): Allows the `astropy` library to update the IERS-A table from internet.
By default this is disabled to avoid errors when the camera is not connected to internet.
- `extended_Metadata` (`yes`, `no`, `on`, `off`, `true`, `false`, `1`, `0`, default: `false`): Adds more metadata to the FITS image. For
instance it stores `SCALE` (angle of sky projected to pixel) and `XPIXSZ`/`YPIXSZ` (binned pixel size). When disabled
the pixel sizes `PIXSIZE1`/`PIXSIZE2` get adjusted to the binning. That makes the images look like from a camera
without binning and avoids many issues with plate solvers.
There are more settings, mostly to support debugging.
An example for a configuration file can be found in this repository.
## Saving a Configuration
The driver allows you to save up to 6 different configurations. The "Options" tab has 3 controls for that:
- You to select which of the 6 configurations you want to save, load or delete with control "Configs".
- "Config Name" allows you to give the configuration a name. This is optional. It only helps you to remember
what this configuration is made for.
- The buttons in "Configuration" trigger the actions:
- "Load" loads and applies the configuration.
- "Save" stores the configuration.
- "Default" restores the driver defaults. It does not overwrite the stored configuration.
- "Purge" removes the stored configuration.
When you try to load a non-existing configuration no settings will be changed.
Many clients load "Config #1" automatically. If you do not want this you must purge "Config #1".
Not all driver settings will be stored. For instance all settings which trigger an action (like "Connect",
"Expose" and "Abort") will not be stored and load. Also, "Scope Location" (your place on earth), "Eq. Coordinates"
(the scope pointing coordinates) and "Pier Side" will not be stored and loaded because these will typically set
by snooping the mount driver. Telescope focal length and aperture are stored but get overwritten immediately by
client (EKOS) when snooping. Generally all settings coming from client (EKOS) will overwrite settings you loaded
previously from a configuration file.
To save and load configurations you must be connected to a camera. The configuration will only be valid
for this particular camera. It is not recommended to load a configuration which was saved for a different type
of camera.
Configurations get stored in `~/.indi_pylibcamera/CONFIG*.json`.
## Error when restarting indiserver
When killing the indiserver sometimes the driver process continues to run. You can see this with:
`ps ax | grep indi`
If you get a line containing `python3` and `indi_pylibcamera` in the output the driver process is still running. In that case you must
kill the driver process manually before you restart the indiserver. Otherwise, you will get a libcamera error
when connecting to the camera.
## Frametypes
The driver can (when supported by the camera hardware) provide these image frame types:
- `Raw` is the raw signal coming from the pixel converted to digital. Most cameras have an analog amplifier
(configurable with `Gain`) between the pixel and the A/D converter. There is no software processing of the data.
Typically, these pixel data have higher resolution but suffer from offset and gain errors. Furthermore, the pixel of
color cameras have own color filter (called Bayer pattern) and do not RGB data directly. Such raw images need
post-processing. Astro-photographs like raw images because they allow much better image optimizations. The frame size
of raw images is determined by the modes implemented in the camera hardware.
- `RGB` are images post-processed by the Image Signal Processor (ISP). The ISP corrects for offset and gain,
calculates the colors and can adjust exposure time and wide balance automatically. Drawback is the lower dynamic
(lower bit width) and additional systematic "noise" due to rounding errors. Frame size can be chosen freely because
the image scaling is done by software in the ISP.
- `Mono` is a special case of the `RGB` images, exposed with saturation=0 and transmitted with only one channel per
pixel.
## Special handling for some cameras
The driver is made as generic as possible by using the camera information provided by libcamera. For instance the raw
modes and frame sizes selectable in the driver are coming from libcamera. Unfortunately some important information
is not provided by libcamera:
* Some cameras have columns or rows filled with 0 or "garbage". These can disturb postprocessing of frames.
For instance an automated color/brightness adjustment can get confused by these 0s.
* Libcamera creates some raw modes by cropping, and others by binning (or subsampling, this is not sure) of frames.
Binning (and subsampling) influences the viewing angle of the pixel. An INDI CCD driver must provide the used binning
to allow client software to calculate the image viewing angle.
To work around this the driver makes a special handling for the cameras listed below. Due to the removing of
zero-filled columns/rows the image frame size will be smaller than stated on the raw mode name.
### IMX477 (Raspberry Pi HQ camera)
Libcamera provides 4 raw modes for this camera, some made by binning (or subsampling) and all with 0-filled columns:
* **4056x3040 BGGR 12bit:** provided frame size 4064x3040, no binning, has 8 zero-filled columns on its right,
final image size is 4056x3040
* **2028x1520 BGGR 12bit:** provided frame size 2032x1520, 2x2 binning, has 6 zero-filled columns on its right
(8 get removed to avoid 1/2 Bayer pattern), final image size is 2024x1520
* **2028x1080 BGGR 12bit:** provided frame size 2032x1080, 2x2 binning, has 6 zero-filled columns on its right
(8 get removed to avoid 1/2 Bayer pattern), final image size is 2024x1080
* **1332x990 BGGR 10bit:** provided frame size 1344x990, 2x2 binning, has 12 zero-filled columns on its right,
final image size is 1332x990
Maximum exposure time is > 5 minutes.
### OV5647 (Raspberry Pi V1 camera)
This camera does not add zero-filled columns. But libcamera uses 3 binning modes. Maximum exposure time is 1 sec.
* **2592x1944 GBRG 10bit:** provided frame size 2592x1944, no binning, no garbage columns, final image size is 2592x1944
* **1920x1080 GBRG 10bit:** provided frame size 1920x1080, no binning, no garbage columns, final image size is 1920x1080
* **1296x972 GBRG 10bit:** provided frame size 1296x972, 2x2 binning, no garbage columns, final image size is 1296x972
* **640x480 GBRG 10bit:** provided frame size 640x480, 4x4 binning, no garbage columns, final image size is 640x480
### IMX708 (Raspberry Pi Module 3 camera)
This camera has auto-focus capabilities which are not supported by this driver. Maximum exposure time is 1.7 sec.
* **4608x2592 BGGR 10bit:** provided frame size 4608x2592, no binning, no garbage columns, final image size is 4608x2592
* **2304x1296 BGGR 10bit:** provided frame size 2304x1296, 2x2 binning, no garbage columns, final image size is 2304x1296
* **1536x864 BGGR 10bit:** provided frame size 1536x864, 2x2 binning, no garbage columns, final image size is 1536x864
## When you need support for a different camera
There are many cameras you can connect to a Raspberry Pi. We can not test the driver with all of them. But we can try
to support. For that we will need more information about your camera. Please run:
```commandline
libcamera-hello --list-cameras
indi_pylibcamera_print_camera_information > MyCam.txt
```
and send the generated "MyCam.txt" file.
Furthermore, send one raw image for each available raw mode. Make pictures of a terrestrial object with red, green and
blue areas. Do not change camera position between taking these pictures. It must be possible to measure and compare
object dimensions.
## When you see strange behavior or errors
In case you have trouble or you see unexpected behavior it will help debugging when you give more information about
your system and camera. Please run:
```commandline
cat /etc/os-release
uname -a
apt list --installed | grep numpy
apt list --installed | grep astropy
apt list --installed | grep libcamera
apt list --installed | grep picamera
libcamera-hello --list-cameras
indi_pylibcamera_print_camera_information
```
and send the outputs in your issue report.
Please also try to get raw images with `libcamera-still`:
```commandline
libcamera-still -r -o test.jpg --shutter 1000000 --gain 1 --awbgains 1,1 --immediate
```
## Snooping
The `indi_pylibcamera` driver uses snooping to get information from the mount driver. This information is used to add
more metadata to the FITS images, similar to this:
```
FOCALLEN= 2.000E+03 / Focal Length (mm)
APTDIA = 2.000E+02 / Telescope diameter (mm)
SCALE = 1.598825E-01 / arcsecs per pixel
SITELAT = 5.105000E+01 / Latitude of the imaging site in degrees
SITELONG= 1.375000E+01 / Longitude of the imaging site in degrees
AIRMASS = 1.643007E+00 / Airmass
OBJCTAZ = 1.121091E+02 / Azimuth of center of image in Degrees
OBJCTALT= 3.744145E+01 / Altitude of center of image in Degrees
OBJCTRA = ' 4 36 07.37' / Object J2000 RA in Hours
OBJCTDEC= '16 30 26.02' / Object J2000 DEC in Degrees
RA = 6.903072E+01 / Object J2000 RA in Degrees
DEC = 1.650723E+01 / Object J2000 DEC in Degrees
PIERSIDE= 'WEST ' / West, looking East
EQUINOX = 2000 / Equinox
DATE-OBS= '2023-04-05T11:27:53.655' / UTC start date of observation
```
Snooping is configured on the "Snooping" tab of the driver. Here you can set the mount driver (ECOS should do this for
you automatically). Furthermore you can set which lenses your camera uses (main or guide scope). When snooping is
enabled the telescope location, sky coordinates and pier side should update automatically. With the buttons
"Do snooping" you can stop the updates. If you get trouble you can disable snooping in the INI file right from the
driver start.
A correct system time on you Raspberry Pi is absolutely needed for the calculation of the metadata. The Raspberry Pi
does not have a battery powered realtime clock. It adjusts its system time from a time-server in the internet. If your
Pi does not have internet access you will need to take care for setting the date and time. For instance, you can
install a realtime clock or a GPS hardware. You can also copy date and time from one Linux computer (or Raspberry Pi)
to another with:
```commandline
ssh -t YourUserName@YourPiName sudo date --set=`date -Iseconds`
```
The driver uses "astropy" (https://www.astropy.org/) for coordinate transformations. When processing of the first image
you make the "astropy" library needs a few seconds for initialization. This will not happen anymore for the next images.
## Camera controls
The driver tab "Camera controls" allows you to change low level camera settings. For instance you can enable the
automatic exposure control (AeEnable) and the automatic white balance (AwbEnable) to get processed pictures in good
light conditions.
A detailed description of the camera controls can be found in appendix C of the `picamera2` manual
(https://datasheets.raspberrypi.com/camera/picamera2-manual.pdf).
Please be aware that most of the camera controls affect processed (RGB) pictures only. Do not use automatic exposure
control or AWB when you plan to stack images.
## Client Software
### KStars/EKOS
The driver is developed and tested with KStars/EKOS.
### CCDciel
Since version 2.3.0 the driver works with CCDciel. But you need to stop the preview loop before you start image
captures, otherwise CCDciel will tell you that it can not start exposures. The same happens when using
indi_simulator_ccd as camera driver.
## Known Limitations
- The maximum exposure time of the V1 camera is about 1 second. This limitation is caused by libcamera and the kernel
driver. The indi_pylibcamera can not work around this.
- Libcamera reports a maximum exposure time for HQ camera of 694.4 seconds. But when trying an exposure of 690 seconds
the capture function already returns after 40 seconds. Likely this maximum exposure time is wrong. A test with 600 seconds
exposure time was successful.
- Libcamera reports a higher maximum value for analogue gain than expected. The analogue gain is implemented by hardware
and has therefore well-defined restrictions. It is not clear if the reported higher maximum analogue gain is correct.
## Credits
Many thanks to all who helped to improve this software. Contributions came from:
- Simon Ε ander
- Aaron W Morris
- Caden Gobat
- anjok
I hope I did not forget someone. If so please do not be angry and tell me.
2.7.0
- implemented Mono frame
- scaled RGB and Mono frames have now binning-factor in FITS header
- minor code cleanup and optimization
- minimized FITS metadata to avoid trouble with plate solver
- moved folders CamerInfos and testpattern out of Python library
2.6.5
- running old driver gets killed when started with `python3` and `python`
- fixed typo in label "Disconnect"
2.6.4
- fixed maximum exposure time for cameras reporting max < min (for instance for IMX296)
2.6.3
- fixed installation issues
2.6.2
- fixed ROWORDER attribute in FITS files (KStars/EKOS ignores this but some postprocessing tools need this fix to
have the Bayer pattern in the correct order)
- more details in install_requires of the wheel
- adapted install instructions in README.md to meet newer OS versions (installation in virtual environment)
- removed indi_pylibcamera_postinstall from installation: does not work from virtual environment
2.6.0
- support for monochrome cameras
- support for new raw and RGB frame formats (including monochrome)
- disable astropy to download the latest IERS-A table from internet to avoid errors during observation session
- better stability of exposure loop
2.5.0
- fixed changed data alignment in Pi 5 raw images
2.4.0
- added INI switch "force_Restart" and implemented camera restart (solves crashes for IMX290 and IMX519)
- forwarding log messages to client
2.3.0
- update FITS header formatting and timestamps
- use lxml for construction of indi_pylibcamera.xml
- renamed SwitchVector FRAME_TYPE(FRAMETYPE_RAW, FRAMETYPE_PROC) to CCD_CAPTURE_FORMAT(INDI_RAW, INDI_RGB)
to better support AstroDMX
- removed "setSitchVector CCD_ABORT_EXPOSURE" after each exposure start (that did not allow CCDciel to run
exposures in loop)
- reworked handling of CCD_ABORT_EXPOSURE
- fixed Fast Exposure
2.2.0
- fixed Bayer pattern order for HQ camera (pycamera2 or libcamera have change they way they report Bayer pattern order),
BAYERPAT in FITS does not depend on "Rotation" property anymore (force_Rotation has no effect anymore),
but Bayer pattern can now be forced with force_BayerOrder
- sorting raw modes by size and bit depth to make the mode with most pixel and most bits/pixel the default
- saving and loading configurations
- bug fix: after aborting an exposure the camera stayed busy and EKOS field solver could not start a new exposure
2.1.0
- fixed division by 0 when focal length equals 0
- improved driver exit when indiserver is closed (to avoid driver continue to run)
- more transparent implementation of snooping; snooped values are now also available as driver parameter
(in tab "Snooping")
- removed empty line and XML declaration from driver XML
- added driver vectors for camera controls (allows to enable automatic exposure control and AWB)
- added uninstall instructions in README.md
- minor improvements
2.0.0
- packaged for pip installation
MIT License
Copyright (c) 2022, 2023 scriptorron
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Raw data
{
"_id": null,
"home_page": "https://github.com/scriptorron/indi_pylibcamera",
"name": "indi-pylibcamera",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": null,
"author": "Ronald Schreiber",
"author_email": "ronald.schreiber01@gmx.de",
"download_url": "https://files.pythonhosted.org/packages/8e/b3/6fc93c8154cfbef5b6d172d11bf196fbc5d819d754931c7861cf13f70214/indi_pylibcamera-2.7.0.tar.gz",
"platform": null,
"description": "# indi_pylibcamera\nThis project implements a Raspberry Pi camera driver for INDI (https://indilib.org/). \n\nRaspberry Pi cameras allow the amateur astronomer to make astonishing pictures with small budget. Especially the\nRaspberry Pi HQ camera can compete with expensive astro cameras.\n\nThe driver is based on the new camera framework \"libcamera\" (https://github.com/raspberrypi/libcamera) which is\nalready part of many Raspberry Pi operating systems. It is made and optimized to run on a Raspberry Pi Zero with\nHQ camera connected. Of course, it will also run on a more capable Raspberry Pi.\n\nThe \"indi_pylibcamera\" may support all cameras supported by \"libcamera\". But not all cameras will provide image data\nin the required formats (raw Bayer or at least RGB). So it is not guaranteed that the driver will work with all\ncameras you can connect to a Raspberry Pi.\n\nThe 'indi_pylibcamera' is one layer in a stack of software:\n```\n INDI client (for instance KStars, PHD2, CCDciel, ...)\n --> INDI server\n --> indi_pylibcamera\n --> picamera2\n --> libcamera library\n --> kernel driver\n```\nIt can not work when the versions of `libcamera` and `picamera2` are too old (both are in a dynamic development).\nAnd it can not work when the libcamera-tools (like `libcamera-hello` and `libcamera-still`) have issues with your\ncamera.\n\n## Requirements and installation\nSome packages need to be installed with `apt`:\n- `libcamera` and `libcamera-apps` (if not already installed). You can test libcamera and the support\nfor your camera with: \n ```commandline\n libcamera-hello --list-cameras\n ```\n You must be able to make RAW pictures in all modes. For instance `libcamera-hello` shows for the HQ camera:\n ```\n 0 : imx477 [4056x3040] (/base/soc/i2c0mux/i2c@1/imx477@1a)\n Modes: 'SRGGB10_CSI2P' : 1332x990 [120.05 fps - (696, 528)/2664x1980 crop]\n 'SRGGB12_CSI2P' : 2028x1080 [50.03 fps - (0, 440)/4056x2160 crop]\n 2028x1520 [40.01 fps - (0, 0)/4056x3040 crop]\n 4056x3040 [10.00 fps - (0, 0)/4056x3040 crop]\n ```\n and you must be able to run these commands without errors:\n ```commandline\n libcamera-still -r --mode 1332:990 --shutter 100000 --gain 1 --awbgains 1,1 --immediate -o test.jpg\n libcamera-still -r --mode 2028:1080 --shutter 100000 --gain 1 --awbgains 1,1 --immediate -o test.jpg\n libcamera-still -r --mode 2028:1520 --shutter 100000 --gain 1 --awbgains 1,1 --immediate -o test.jpg\n libcamera-still -r --mode 4056:3040 --shutter 100000 --gain 1 --awbgains 1,1 --immediate -o test.jpg\n ```\n Something with your libcamera or kernel driver installation will be wrong if this does not work.\n- Install INDI core library. If there is no pre-compiled package for your hardware you will need to compile it\nby yourself. Instructions can be found here: https://github.com/indilib/indi. \nThe scripts on https://gitea.nouspiro.space/nou/astro-soft-build automate compilation and installation.\n A Raspberry Pi Zero does not have enough RAM to compile with 4 threads in parallel: you need to do `make -j1` instead of `make -j4`. \nFinally, after installation, you need to have a working INDI server: `indiserver -v indi_simulator_telescope`\n- Some Python packages require matching versions of system libraries. They must be installed with `apt`:\n```commandline\nsudo apt install python3-pip libcamera-apps python3-picamera2 python3-lxml python3-astropy python3-numpy python3-venv\n```\n\nThe Raspberry Pi OS \"Bullseye\" still allowed to install system wide with `sudo pip install indi_pylibcamera`. \nSince \"Bookworm\" a virtual environment is required to install non-system Python packages. Trying to install\n`indi_pylibcamera` without a virtual environment will fail with `error: externally-managed-environment`. \n\nRun the following on a command line to install `indi_pylibcamera`in a virtual environment called `venv_indi_pylibcamera`\n(you can name the virtual environment as you want):\n```commandline\npython3 -m venv --system-site-packages ~/venv_indi_pylibcamera\nsource ~/venv_indi_pylibcamera/bin/activate\npip install --upgrade pip\npip install indi_pylibcamera\n```\n\n## Some hints when you get trouble\nThe Python packages `picamera2`, `numpy`, and ` astropy` MUST be installed with `sudo apt install`.\nYou MUST NOT update them with `pip`. When you get errors related to these packages you can:\n 1. Check directory `~/.local/lib/python3.9/site-packages` if it contains one of these packages. If yes delete them!\n 2. Check if `pip list` shows different version numbers than `apt list` for these packages:\n ```commandline\n pip list | grep numpy\n apt list | grep numpy\n \n pip list | grep astropy\n apt list | grep astropy\n \n pip list | grep picamera2\n apt list | grep picamera2\n ```\n If you see different versions for a package remove it with `pip uninstall` and reinstall it with \n `sudo apt reinstall`.\n 3. Remove and recreate the virtual environment.\n\n## Uninstall\nFor uninstalling the driver do:\n```commandline\nsudo rm -f /usr/share/indi/indi_pylibcamera.xml\nrm -rf ~/venv_indi_pylibcamera\n```\n\n## Running\nAt the moment there is no support to start the driver from the EKOS profile editor. \nThe driver and the indi server must be started in shell with activated virtual environment:\n```commandline\nsource ~/venv_indi_pylibcamera/bin/activate\n```\n\nIn the same shell you can start the INDI server with `indiserver -v indi_pylibcamera`. When the server is running\nyou can connect to the server from another computer with an INDI client (for instance KStars/EKOS). The camera name\nis the one you configure in `indi_pylibcamera.ini`.\n\nI recommend you to make a wrapper script to activate the environment and start the driver.\n\n## Global Configuration\nThe driver uses a hierarchy of configuration files to set global parameter. These configuration files are loaded in the\nfollowing order:\n- `indi_pylibcamera.ini` in the program installation directory (typically in `/usr/lib/python*/site_packages`)\n- `$INDI_PYLIBCAMERA_CONFIG_PATH/indi_pylibcamera.ini`\n- `$HOME/.indi_pylibcamera/indi_pylibcamera.ini`\n- `./.indi_pylibcamera/indi_pylibcamera.ini`\n\nThe configuration file must have the section `[driver]`. The most important keys are:\n- `DeviceName` (string): INDI name of the device. This allows to distinguish indi_pylibcamera devices in your setup.\nFor instance you can have one Raspberry Pi with HQ camera as main camera for taking photos and a second Raspberry Pi with\na V1 camera for auto guiding.\n- `SendTimeStamps` (`yes`, `no`, `on`, `off`, `true`, `false`, `1`, `0`): Add a timestamp to the messages send from\nthe device to the client. Such timestamps are needed in very seldom cases only, and usually it is okay to set this \nto `no`. If you really need timestamps make sure that the system clock is correct. \n- `force_UnitCellSize_X`, `force_UnitCellSize_Y` and `force_Rotation`: Some cameras are not fully supported by\nlibcamera and do not provide all needed information. The configuration file allows to force pixel size and Bayer\npattern rotation for such cameras.\n- `LoggingLevel`: The driver has buttons to set the logging level. But sometimes you need a higher logging level right\nat the beginning of the driver initialization. This can be done here in the INI file.\n- `DoSnooping`: The INDI protocol allows a driver to ask other drivers for information. This is called \"snooping\". The\nindi_pylibcamera driver uses this feature to get observer location, telescope information and telescope direction\nfrom the mount driver. It writes these information as metadata in the FITS images. This function got newly implemented\nand may make trouble in some setups. With the `DoSnooping` you can disable this function.\n- `force_Restart` (`yes`, `no`, `auto`): Some cameras crash after the first exposure. Restarting the camera before\nevery frame exposure can solve this issue. Valid values of this switch are:\n * `no`: Do not restart if not needed to reconfigure camera.\n * `yes`: Always restart. Can lead to longer time between frames.\n * `auto`: Automatically choose based on list of known critical cameras. \n\n Default (if not otherwise set in INI file) is `auto`.\n- `enable_IERS_autoupdate` (`yes`, `no`): Allows the `astropy` library to update the IERS-A table from internet.\nBy default this is disabled to avoid errors when the camera is not connected to internet.\n- `extended_Metadata` (`yes`, `no`, `on`, `off`, `true`, `false`, `1`, `0`, default: `false`): Adds more metadata to the FITS image. For\ninstance it stores `SCALE` (angle of sky projected to pixel) and `XPIXSZ`/`YPIXSZ` (binned pixel size). When disabled\nthe pixel sizes `PIXSIZE1`/`PIXSIZE2` get adjusted to the binning. That makes the images look like from a camera\nwithout binning and avoids many issues with plate solvers.\n\nThere are more settings, mostly to support debugging.\n\nAn example for a configuration file can be found in this repository.\n\n## Saving a Configuration\nThe driver allows you to save up to 6 different configurations. The \"Options\" tab has 3 controls for that:\n- You to select which of the 6 configurations you want to save, load or delete with control \"Configs\".\n- \"Config Name\" allows you to give the configuration a name. This is optional. It only helps you to remember\nwhat this configuration is made for.\n- The buttons in \"Configuration\" trigger the actions:\n - \"Load\" loads and applies the configuration.\n - \"Save\" stores the configuration.\n - \"Default\" restores the driver defaults. It does not overwrite the stored configuration.\n - \"Purge\" removes the stored configuration.\n\nWhen you try to load a non-existing configuration no settings will be changed.\n\nMany clients load \"Config #1\" automatically. If you do not want this you must purge \"Config #1\".\n\nNot all driver settings will be stored. For instance all settings which trigger an action (like \"Connect\", \n\"Expose\" and \"Abort\") will not be stored and load. Also, \"Scope Location\" (your place on earth), \"Eq. Coordinates\"\n(the scope pointing coordinates) and \"Pier Side\" will not be stored and loaded because these will typically set \nby snooping the mount driver. Telescope focal length and aperture are stored but get overwritten immediately by \nclient (EKOS) when snooping. Generally all settings coming from client (EKOS) will overwrite settings you loaded\npreviously from a configuration file.\n\nTo save and load configurations you must be connected to a camera. The configuration will only be valid\nfor this particular camera. It is not recommended to load a configuration which was saved for a different type\nof camera.\n\nConfigurations get stored in `~/.indi_pylibcamera/CONFIG*.json`.\n\n## Error when restarting indiserver\nWhen killing the indiserver sometimes the driver process continues to run. You can see this with:\n\n`ps ax | grep indi`\n\n\nIf you get a line containing `python3` and `indi_pylibcamera` in the output the driver process is still running. In that case you must\nkill the driver process manually before you restart the indiserver. Otherwise, you will get a libcamera error \nwhen connecting to the camera.\n\n## Frametypes\nThe driver can (when supported by the camera hardware) provide these image frame types:\n- `Raw` is the raw signal coming from the pixel converted to digital. Most cameras have an analog amplifier\n(configurable with `Gain`) between the pixel and the A/D converter. There is no software processing of the data.\nTypically, these pixel data have higher resolution but suffer from offset and gain errors. Furthermore, the pixel of\ncolor cameras have own color filter (called Bayer pattern) and do not RGB data directly. Such raw images need\npost-processing. Astro-photographs like raw images because they allow much better image optimizations. The frame size\nof raw images is determined by the modes implemented in the camera hardware.\n- `RGB` are images post-processed by the Image Signal Processor (ISP). The ISP corrects for offset and gain,\ncalculates the colors and can adjust exposure time and wide balance automatically. Drawback is the lower dynamic\n(lower bit width) and additional systematic \"noise\" due to rounding errors. Frame size can be chosen freely because\nthe image scaling is done by software in the ISP.\n- `Mono` is a special case of the `RGB` images, exposed with saturation=0 and transmitted with only one channel per\npixel.\n\n## Special handling for some cameras\nThe driver is made as generic as possible by using the camera information provided by libcamera. For instance the raw\nmodes and frame sizes selectable in the driver are coming from libcamera. Unfortunately some important information\nis not provided by libcamera:\n* Some cameras have columns or rows filled with 0 or \"garbage\". These can disturb postprocessing of frames. \nFor instance an automated color/brightness adjustment can get confused by these 0s.\n* Libcamera creates some raw modes by cropping, and others by binning (or subsampling, this is not sure) of frames.\nBinning (and subsampling) influences the viewing angle of the pixel. An INDI CCD driver must provide the used binning\nto allow client software to calculate the image viewing angle.\n\nTo work around this the driver makes a special handling for the cameras listed below. Due to the removing of \nzero-filled columns/rows the image frame size will be smaller than stated on the raw mode name.\n\n### IMX477 (Raspberry Pi HQ camera)\nLibcamera provides 4 raw modes for this camera, some made by binning (or subsampling) and all with 0-filled columns:\n* **4056x3040 BGGR 12bit:** provided frame size 4064x3040, no binning, has 8 zero-filled columns on its right, \nfinal image size is 4056x3040\n* **2028x1520 BGGR 12bit:** provided frame size 2032x1520, 2x2 binning, has 6 zero-filled columns on its right \n(8 get removed to avoid 1/2 Bayer pattern), final image size is 2024x1520\n* **2028x1080 BGGR 12bit:** provided frame size 2032x1080, 2x2 binning, has 6 zero-filled columns on its right \n(8 get removed to avoid 1/2 Bayer pattern), final image size is 2024x1080\n* **1332x990 BGGR 10bit:** provided frame size 1344x990, 2x2 binning, has 12 zero-filled columns on its right,\nfinal image size is 1332x990\n\nMaximum exposure time is > 5 minutes.\n\n### OV5647 (Raspberry Pi V1 camera)\nThis camera does not add zero-filled columns. But libcamera uses 3 binning modes. Maximum exposure time is 1 sec.\n* **2592x1944 GBRG 10bit:** provided frame size 2592x1944, no binning, no garbage columns, final image size is 2592x1944\n* **1920x1080 GBRG 10bit:** provided frame size 1920x1080, no binning, no garbage columns, final image size is 1920x1080\n* **1296x972 GBRG 10bit:** provided frame size 1296x972, 2x2 binning, no garbage columns, final image size is 1296x972\n* **640x480 GBRG 10bit:** provided frame size 640x480, 4x4 binning, no garbage columns, final image size is 640x480\n\n### IMX708 (Raspberry Pi Module 3 camera)\nThis camera has auto-focus capabilities which are not supported by this driver. Maximum exposure time is 1.7 sec.\n* **4608x2592 BGGR 10bit:** provided frame size 4608x2592, no binning, no garbage columns, final image size is 4608x2592\n* **2304x1296 BGGR 10bit:** provided frame size 2304x1296, 2x2 binning, no garbage columns, final image size is 2304x1296\n* **1536x864 BGGR 10bit:** provided frame size 1536x864, 2x2 binning, no garbage columns, final image size is 1536x864\n\n## When you need support for a different camera\nThere are many cameras you can connect to a Raspberry Pi. We can not test the driver with all of them. But we can try \nto support. For that we will need more information about your camera. Please run:\n\n```commandline\nlibcamera-hello --list-cameras\n\nindi_pylibcamera_print_camera_information > MyCam.txt\n```\n\nand send the generated \"MyCam.txt\" file.\n\nFurthermore, send one raw image for each available raw mode. Make pictures of a terrestrial object with red, green and\nblue areas. Do not change camera position between taking these pictures. It must be possible to measure and compare\nobject dimensions.\n\n## When you see strange behavior or errors\nIn case you have trouble or you see unexpected behavior it will help debugging when you give more information about\nyour system and camera. Please run:\n```commandline\ncat /etc/os-release\n\nuname -a\n\napt list --installed | grep numpy\n\napt list --installed | grep astropy\n\napt list --installed | grep libcamera\n\napt list --installed | grep picamera\n\nlibcamera-hello --list-cameras\n\nindi_pylibcamera_print_camera_information\n```\n\nand send the outputs in your issue report.\n\nPlease also try to get raw images with `libcamera-still`:\n```commandline\nlibcamera-still -r -o test.jpg --shutter 1000000 --gain 1 --awbgains 1,1 --immediate\n```\n\n## Snooping\nThe `indi_pylibcamera` driver uses snooping to get information from the mount driver. This information is used to add\nmore metadata to the FITS images, similar to this:\n```\nFOCALLEN= 2.000E+03 / Focal Length (mm)\nAPTDIA = 2.000E+02 / Telescope diameter (mm)\nSCALE = 1.598825E-01 / arcsecs per pixel\nSITELAT = 5.105000E+01 / Latitude of the imaging site in degrees\nSITELONG= 1.375000E+01 / Longitude of the imaging site in degrees\nAIRMASS = 1.643007E+00 / Airmass\nOBJCTAZ = 1.121091E+02 / Azimuth of center of image in Degrees\nOBJCTALT= 3.744145E+01 / Altitude of center of image in Degrees\nOBJCTRA = ' 4 36 07.37' / Object J2000 RA in Hours\nOBJCTDEC= '16 30 26.02' / Object J2000 DEC in Degrees\nRA = 6.903072E+01 / Object J2000 RA in Degrees\nDEC = 1.650723E+01 / Object J2000 DEC in Degrees\nPIERSIDE= 'WEST ' / West, looking East\nEQUINOX = 2000 / Equinox\nDATE-OBS= '2023-04-05T11:27:53.655' / UTC start date of observation\n```\nSnooping is configured on the \"Snooping\" tab of the driver. Here you can set the mount driver (ECOS should do this for\nyou automatically). Furthermore you can set which lenses your camera uses (main or guide scope). When snooping is\nenabled the telescope location, sky coordinates and pier side should update automatically. With the buttons \n\"Do snooping\" you can stop the updates. If you get trouble you can disable snooping in the INI file right from the\ndriver start.\n\nA correct system time on you Raspberry Pi is absolutely needed for the calculation of the metadata. The Raspberry Pi\ndoes not have a battery powered realtime clock. It adjusts its system time from a time-server in the internet. If your\nPi does not have internet access you will need to take care for setting the date and time. For instance, you can \ninstall a realtime clock or a GPS hardware. You can also copy date and time from one Linux computer (or Raspberry Pi)\nto another with:\n```commandline\nssh -t YourUserName@YourPiName sudo date --set=`date -Iseconds`\n```\nThe driver uses \"astropy\" (https://www.astropy.org/) for coordinate transformations. When processing of the first image\nyou make the \"astropy\" library needs a few seconds for initialization. This will not happen anymore for the next images.\n\n## Camera controls\nThe driver tab \"Camera controls\" allows you to change low level camera settings. For instance you can enable the\nautomatic exposure control (AeEnable) and the automatic white balance (AwbEnable) to get processed pictures in good\nlight conditions.\nA detailed description of the camera controls can be found in appendix C of the `picamera2` manual\n(https://datasheets.raspberrypi.com/camera/picamera2-manual.pdf).\n\nPlease be aware that most of the camera controls affect processed (RGB) pictures only. Do not use automatic exposure\ncontrol or AWB when you plan to stack images.\n\n## Client Software\n\n### KStars/EKOS\nThe driver is developed and tested with KStars/EKOS.\n\n### CCDciel\nSince version 2.3.0 the driver works with CCDciel. But you need to stop the preview loop before you start image\ncaptures, otherwise CCDciel will tell you that it can not start exposures. The same happens when using\nindi_simulator_ccd as camera driver. \n\n## Known Limitations\n- The maximum exposure time of the V1 camera is about 1 second. This limitation is caused by libcamera and the kernel\ndriver. The indi_pylibcamera can not work around this.\n- Libcamera reports a maximum exposure time for HQ camera of 694.4 seconds. But when trying an exposure of 690 seconds\nthe capture function already returns after 40 seconds. Likely this maximum exposure time is wrong. A test with 600 seconds\nexposure time was successful.\n- Libcamera reports a higher maximum value for analogue gain than expected. The analogue gain is implemented by hardware\nand has therefore well-defined restrictions. It is not clear if the reported higher maximum analogue gain is correct.\n\n## Credits\nMany thanks to all who helped to improve this software. Contributions came from:\n- Simon \u0160ander\n- Aaron W Morris\n- Caden Gobat\n- anjok\n\nI hope I did not forget someone. If so please do not be angry and tell me.\n\n2.7.0\n- implemented Mono frame\n- scaled RGB and Mono frames have now binning-factor in FITS header\n- minor code cleanup and optimization\n- minimized FITS metadata to avoid trouble with plate solver\n- moved folders CamerInfos and testpattern out of Python library\n\n2.6.5\n- running old driver gets killed when started with `python3` and `python`\n- fixed typo in label \"Disconnect\"\n\n2.6.4\n- fixed maximum exposure time for cameras reporting max < min (for instance for IMX296)\n\n2.6.3\n- fixed installation issues\n\n2.6.2\n- fixed ROWORDER attribute in FITS files (KStars/EKOS ignores this but some postprocessing tools need this fix to\n have the Bayer pattern in the correct order)\n- more details in install_requires of the wheel\n- adapted install instructions in README.md to meet newer OS versions (installation in virtual environment)\n- removed indi_pylibcamera_postinstall from installation: does not work from virtual environment\n\n2.6.0\n- support for monochrome cameras\n- support for new raw and RGB frame formats (including monochrome)\n- disable astropy to download the latest IERS-A table from internet to avoid errors during observation session\n- better stability of exposure loop\n\n2.5.0\n- fixed changed data alignment in Pi 5 raw images\n\n2.4.0\n- added INI switch \"force_Restart\" and implemented camera restart (solves crashes for IMX290 and IMX519)\n- forwarding log messages to client\n\n2.3.0\n- update FITS header formatting and timestamps\n- use lxml for construction of indi_pylibcamera.xml\n- renamed SwitchVector FRAME_TYPE(FRAMETYPE_RAW, FRAMETYPE_PROC) to CCD_CAPTURE_FORMAT(INDI_RAW, INDI_RGB)\n to better support AstroDMX\n- removed \"setSitchVector CCD_ABORT_EXPOSURE\" after each exposure start (that did not allow CCDciel to run\n exposures in loop)\n- reworked handling of CCD_ABORT_EXPOSURE\n- fixed Fast Exposure\n\n2.2.0\n- fixed Bayer pattern order for HQ camera (pycamera2 or libcamera have change they way they report Bayer pattern order),\n BAYERPAT in FITS does not depend on \"Rotation\" property anymore (force_Rotation has no effect anymore),\n but Bayer pattern can now be forced with force_BayerOrder\n- sorting raw modes by size and bit depth to make the mode with most pixel and most bits/pixel the default\n- saving and loading configurations\n- bug fix: after aborting an exposure the camera stayed busy and EKOS field solver could not start a new exposure\n\n2.1.0\n- fixed division by 0 when focal length equals 0\n- improved driver exit when indiserver is closed (to avoid driver continue to run)\n- more transparent implementation of snooping; snooped values are now also available as driver parameter\n (in tab \"Snooping\")\n- removed empty line and XML declaration from driver XML\n- added driver vectors for camera controls (allows to enable automatic exposure control and AWB)\n- added uninstall instructions in README.md\n- minor improvements\n\n2.0.0\n- packaged for pip installation\n\nMIT License\n\nCopyright (c) 2022, 2023 scriptorron\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n",
"bugtrack_url": null,
"license": null,
"summary": "An INDI driver for Raspberry Pi cameras supported by libcamera",
"version": "2.7.0",
"project_urls": {
"Homepage": "https://github.com/scriptorron/indi_pylibcamera"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "1516f023d85dedea51f6225a7a8d45aba9babb862c0e0a6bacfe099550f884e8",
"md5": "a13b2337deffe105223ceabc2f61334a",
"sha256": "cef09ce622f98c25044cfaba00cafe959ad18bb9abd5796e56be4038582e93b3"
},
"downloads": -1,
"filename": "indi_pylibcamera-2.7.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "a13b2337deffe105223ceabc2f61334a",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 46067,
"upload_time": "2024-11-30T19:29:52",
"upload_time_iso_8601": "2024-11-30T19:29:52.377917Z",
"url": "https://files.pythonhosted.org/packages/15/16/f023d85dedea51f6225a7a8d45aba9babb862c0e0a6bacfe099550f884e8/indi_pylibcamera-2.7.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8eb36fc93c8154cfbef5b6d172d11bf196fbc5d819d754931c7861cf13f70214",
"md5": "cd1a5d2e6fb2b9baac8293760187fcc0",
"sha256": "69fd8f18b04c9db24bb8e662fc309a17484d8bfb3d9a19bc5e138bcee38c0d55"
},
"downloads": -1,
"filename": "indi_pylibcamera-2.7.0.tar.gz",
"has_sig": false,
"md5_digest": "cd1a5d2e6fb2b9baac8293760187fcc0",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 52136,
"upload_time": "2024-11-30T19:30:10",
"upload_time_iso_8601": "2024-11-30T19:30:10.745125Z",
"url": "https://files.pythonhosted.org/packages/8e/b3/6fc93c8154cfbef5b6d172d11bf196fbc5d819d754931c7861cf13f70214/indi_pylibcamera-2.7.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-11-30 19:30:10",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "scriptorron",
"github_project": "indi_pylibcamera",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "indi-pylibcamera"
}