Hopefully, the indi_gpsnmea device will work with indi-allsky, but I have not tested the NMEA specific device myself.

indi-allsky will not be able to do anything with the SQM data directly, but it is still possible to read that data externally and use it as part of the image overlay.

Read More...

Aaron Morris replied to the topic 'Camera errors after last upgrade' in the forum. yesterday

You may try deleting the .xml files under your $HOME/.indi/ folder to reset them to defaults.

Read More...

The GPhoto server is the same server as the Canon, it is an alias.

One of the big reasons DSLRs will fail on captures with INDI is when the resolution and pixel sizes are not configured for the camera. These have to be manually set for DSLRs with INDI.

Read More...

If you are plugged into a USB3 port, you may consider adjusting the USB Speed setting for the camera.

Read More...

With remote viewing, I would consider disabling the compositor and enabling some of the older windowing options that do not show window contents when moving windows and resizing (only the outline will be shown during these operations) and any of the window animations.

Read More...

With INDI, just remember, you have to set all values in the property for it to properly configure, so you would have to set every value in CCD_CONTROLS, even if all of the values are not changing. The number of values in the property can actually change between INDI/driver releases and will be in different orders between vendors.

I borrowed some very nice methods that Marco Gulino he developed for indi-lite-tools where if you want to change a single value, it queries all of the existing values and sets each value to the existing value while only changing the properties you want to change. They also allow you set properties by name, instead of just by index.

You can find what I have in indi-allsky here: github.com/aaronwmorris/indi-allsky/blob...llsky/camera/indi.py

Here is some rough code

    def main(self):
        ccd_device = indiclient.getDevice("CCD NAME")

        indi_config = {
            "PROPERTIES" : {
                "CCD_CONTROLS" : {
                    "Gain" : 100,
                    "Offset" : 10
                }
            },
            "SWITCHES" : {
                "CCD_VIDEO_FORMAT" : {
                    "on"  : ["ASI_IMG_RAW16"],  # example of setting a switch
                    "off" : ["ASI_IMG_RAW8"]    # off settings are optional
                }
            }
        }

        # ccd_device needs to be connected
        configureDevice(ccd_device, indi_config)


    def configureDevice(self, device, indi_config):
        if isinstance(device, FakeIndiCcd):
            # ignore configuration
            return

        ### Configure Device Switches
        for k, v in indi_config.get('SWITCHES', {}).items():
            logger.info('Setting switch %s', k)
            self.set_switch(device, k, on_switches=v.get('on', []), off_switches=v.get('off', []))

        ### Configure Device Properties
        for k, v in indi_config.get('PROPERTIES', {}).items():
            logger.info('Setting property (number) %s', k)
            self.set_number(device, k, v)

        ### Configure Device Text
        for k, v in indi_config.get('TEXT', {}).items():
            logger.info('Setting property (text) %s', k)
            self.set_text(device, k, v)


    def set_number(self, device, name, values, sync=True, timeout=None):
        #logger.info('Name: %s, values: %s', name, str(values))
        c = self.get_control(device, name, 'number')

        if c.getPermission() == PyIndi.IP_RO:
            logger.error('Number control %s is read only', name)
            return c

        for control_name, index in self.__map_indexes(c, values.keys()).items():
            logger.info('Setting %s = %s', c[index].getLabel(), str(values[control_name]))
            c[index].setValue(values[control_name])

        self.sendNewNumber(c)

        if sync:
            self.__wait_for_ctl_statuses(c, timeout=timeout)

        return c

    def set_switch(self, device, name, on_switches=[], off_switches=[], sync=True, timeout=None):
        c = self.get_control(device, name, 'switch')

        if c.getPermission() == PyIndi.IP_RO:
            logger.error('Switch control %s is read only', name)
            return c

        is_exclusive = c.getRule() == PyIndi.ISR_ATMOST1 or c.getRule() == PyIndi.ISR_1OFMANY
        if is_exclusive :
            on_switches = on_switches[0:1]
            off_switches = [s.getName() for s in c if s.getName() not in on_switches]

        for index in range(0, len(c)):
            current_state = c[index].getState()
            new_state = current_state

            if c[index].getName() in on_switches:
                logger.info('Enabling %s (%s)', c[index].getLabel(), c[index].getName())
                new_state = PyIndi.ISS_ON
            elif is_exclusive or c[index].getName() in off_switches:
                new_state = PyIndi.ISS_OFF

            c[index].setState(new_state)

        self.sendNewSwitch(c)

        return c


    def set_text(self, device, name, values, sync=True, timeout=None):
        c = self.get_control(device, name, 'text')

        if c.getPermission() == PyIndi.IP_RO:
            logger.error('Text control %s is read only', name)
            return c

        for control_name, index in self.__map_indexes(c, values.keys()).items():
            logger.info('Setting %s = %s', c[index].getLabel(), str(values[control_name]))
            c[index].setText(values[control_name])

        self.sendNewText(c)

        if sync:
            self.__wait_for_ctl_statuses(c, timeout=timeout)

        return c


    def __map_indexes(self, ctl, values):
        result = {}
        for i, c in enumerate(ctl):
            #logger.info('Value name: %s', c.getName())  # useful to find value names
            if c.getName() in values:
                result[c.getName()] = i
        return result


   def __wait_for_ctl_statuses(self, ctl, statuses=[PyIndi.IPS_OK, PyIndi.IPS_IDLE], timeout=None):
        started = time.time()

        if timeout is None:
            timeout = 5

        while ctl.getState() not in statuses:
            if ctl.getState() == PyIndi.IPS_ALERT and 0.5 > time.time() - started:
                raise RuntimeError('Error while changing property {0}'.format(ctl.getName()))

            elapsed = time.time() - started

            if 0 < timeout < elapsed:
                raise Exception('Timeout error while changing property {0}'.format(ctl.getName()))

            time.sleep(0.15)


Read More...

Aaron Morris replied to the topic 'The state of Astroberry' in the forum. 1 week ago

I will try to stick to the facts without being too negative.


Read More...

Aaron Morris replied to the topic 'PyINDI client fails to build' in the forum. 2 weeks ago

pyindi-client should compile against 2.0.0 to 2.0.3 from the following git checkout:

pip3 install "git+https://github.com/indilib/pyindi-client.git@674706f#egg=pyindi-client"

I track the compatibility of pyindi-client pretty closely for indi-allsky.

Read More...

Aaron Morris replied to the topic 'The state of Astroberry' in the forum. 2 weeks ago


The INDI community would not be able to take ownership of Astroberry. Radek owns the astroberry.io site and any branding/trademarks. He still maintains the site--he updated the certificate just a few months back. Relying on a single developer in this case is just the way it works. I think Radek made a great product.

But this thread is not really about the merits of Astroberry or the alternatives. It is really about what is best for the community. Radek has not posted publicly in this forum in about 2 years. Astroberry can still be used, but giving Astroberry the same rank/status as AstroArch does not help new users. A sticky with information about the project state would be immensely helpful. Radek could release an update to Astroberry tomorrow and the stickied info could be deleted.

Read More...

Aaron Morris replied to the topic 'The state of Astroberry' in the forum. 2 weeks ago

Astroberry was technically two components:

* The Astroberry image including the installed software and prebuilt configs
* The Astroberry APT repo for Debian/Raspberry Pi

The APT repo, in my opinion, was the more important for the community since there is no other option to get prebuilt INDI packages on Raspberry PI official images. I am not sure it was fair to rely on Astroberry for this service. I know I miss using the Astroberry repo for indi-allsky. Now users have to spend 20 minutes to 2 hours building INDI from source.

Read More...

Aaron Morris created a new topic ' The state of Astroberry' in the forum. 2 weeks ago

I was wondering if it might be time to add a sticky post to the Astroberry forum to recommend not using Astroberry for new deployments.

I really do appreciate all of the effort Radek put into Astroberry and this is not to minimize that effort. I believe Radek was intending on releasing an updated and modernized version of Astroberry, but that has not materialized yet. This is very unfortunately, because Astroberry has considerable mindshare in the Linux astro community.

I feel like the current state of Astroberry hurts the community more than it helps at this point. There are still people trying to use Astroberry, but not much to inform them that any problems they experience are probably not going to receive attention.

Read More...

I can see how that would be annoying. I would make it easier to find support requests, I just do not know if there is enough interest in this specific topic to support a new category.

Read More...


It sounds like you only built the core INDI library. You would have had to build the 3rd-party repo to get the additional drivers. I will work on making my instructions less confusing.

Read More...

Just run "./misc/change_camera.sh" and select indi_playerone_ccd and then reboot.

Read More...