Contents[Hide]

This tutorial shows how to install and use the Python pyindi-client on a Rapberry Pi 2 or 3 running an Ubuntu distribution. It has been made using the Ubuntu Classic image for Raspberry Pi and also the Ubuntu MATE for Raspberry Pi. Both are fresh installs and you will find my installation notes at the end of the tutorial (for Ubuntu Classic and for Ubuntu MATE). It supposes you have a configured network. It also supposes you already perform the first boot on the Raspberry Pi (first boot on ubuntu, and on ubuntu mate). Finally there are two versions of python, Python 2 and Python 3. The pyindi-client wrapper works with both versions, and both versions may coexist if you have the two versions of Python installed. As for any Python module, the pyindi-client should be installed for each version of Python you want to use. I will be using Python 3 in this tutorial as this is the default version in Ubuntu 16.04. You may download the tutorial scripts from the repository.

1. Prerequisites

1.1. Ubuntu Mate 16.04

These are the steps I use on the Ubuntu Mate 16.04 distribution for the Raspberry PI.

  1. install indi library from the Jasem Mutlaq repository (recommended for Ubuntu);
    $ sudo apt-add-repository ppa:mutlaqja/ppa
    $ sudo apt-get update	  
    $ sudo apt-get install indi-full
    
    details
    $ sudo apt-get install indi-full
    Lecture des listes de paquets... Fait
    Construction de l'arbre des dépendances       
    Lecture des informations d'état... Fait
    Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires :
      apt-clone archdetect-deb dpkg-repack gir1.2-json-1.0 gir1.2-timezonemap-1.0 gir1.2-xkl-1.0 libdebian-installer4
      libparted-fs-resize0 libtimezonemap-data libtimezonemap1 os-prober python3-icu python3-pam rdate
    Veuillez utiliser « sudo apt autoremove » pour les supprimer.
    The following additional packages will be installed:
      dcraw dkms fakeroot fliusb-dkms fxload indi-aagcloudwatcher indi-apogee indi-asi indi-bin indi-dsi indi-duino indi-eqmod
      indi-ffmv indi-fishcamp indi-fli indi-gphoto indi-gpsd indi-maxdomeii indi-mi indi-qhy indi-qsi indi-sbig indi-sx libapogee3
      libboost-regex1.58.0 libcfitsio2 libfakeroot libfishcamp libfli1 libftdi1 libgps22 libgsl2 libindi-data libindi-dev libindi1
      libnova-0.14-0 libqhy libqsi7 libsbigudrv2 libusb-1.0-0-dev libusb-1.0-doc
    Paquets suggérés :
      gphoto2 gpsd gsl-ref-psdoc | gsl-doc-pdf | gsl-doc-info | gsl-ref-html
    Les NOUVEAUX paquets suivants seront installés :
      dcraw dkms fakeroot fliusb-dkms fxload indi-aagcloudwatcher indi-apogee indi-asi indi-bin indi-dsi indi-duino indi-eqmod
      indi-ffmv indi-fishcamp indi-fli indi-full indi-gphoto indi-gpsd indi-maxdomeii indi-mi indi-qhy indi-qsi indi-sbig indi-sx
      libapogee3 libboost-regex1.58.0 libcfitsio2 libfakeroot libfishcamp libfli1 libftdi1 libgps22 libgsl2 libindi-data libindi-dev
      libindi1 libnova-0.14-0 libqhy libqsi7 libsbigudrv2 libusb-1.0-0-dev libusb-1.0-doc
    0 mis à jour, 42 nouvellement installés, 0 à enlever et 381 non mis à jour.
    Il est nécessaire de prendre 5 470 ko dans les archives.
    Après cette opération, 29,8 Mo d'espace disque supplémentaires seront utilisés.
    Souhaitez-vous continuer ? [O/n] O
    Réception de:1 http://ports.ubuntu.com xenial/universe armhf libnova-0.14-0 armhf 0.14.0-2.1 [817 kB]
    Réception de:2 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf libindi-data all 1.2.0+r2648~201610112004~ubuntu16.04.1 [8 520 B]
    Réception de:3 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf libindi1 armhf 1.2.0+r2648~201610112004~ubuntu16.04.1 [205 kB]
    Réception de:4 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf indi-bin armhf 1.2.0+r2648~201610112004~ubuntu16.04.1 [537 kB]
    Réception de:5 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf libindi-dev armhf 1.2.0+r2648~201610112004~ubuntu16.04.1 [276 kB]
    Réception de:6 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf indi-eqmod armhf 0.3+r2648~201610112004~ubuntu16.04.1 [81,0 kB]
    Réception de:7 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf indi-sx armhf 1.4+r2648~201610112004~ubuntu16.04.1 [29,8 kB]
    Réception de:8 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf libsbigudrv2 armhf 2.1.1+r2648~201610112004~ubuntu16.04.1 [96,7 kB]
    Réception de:9 http://ports.ubuntu.com xenial-updates/main armhf dkms all 2.2.0.3-2ubuntu11.2 [66,2 kB]
    Réception de:10 http://ports.ubuntu.com xenial/main armhf libfakeroot armhf 1.20.2-1ubuntu1 [21,7 kB]
    Réception de:11 http://ports.ubuntu.com xenial/main armhf fakeroot armhf 1.20.2-1ubuntu1 [61,1 kB]
    Réception de:12 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf indi-sbig armhf 1.7+r2648~201610112004~ubuntu16.04.1 [30,9 kB]
    Réception de:13 http://ports.ubuntu.com xenial/universe armhf fxload armhf 0.0.20081013-1ubuntu1 [16,0 kB]
    Réception de:14 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf libapogee3 armhf 3.0.3234+r2648~201610112003~ubuntu16.04.1 [339 kB]
    Réception de:15 http://ports.ubuntu.com xenial/universe armhf libcfitsio2 armhf 3.370-5 [404 kB]
    Réception de:16 http://ports.ubuntu.com xenial/main armhf libgsl2 armhf 2.1+dfsg-2 [687 kB]
    Réception de:17 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf indi-apogee armhf 1.5+r2648~201610112004~ubuntu16.04.1 [22,6 kB]
    Réception de:18 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf indi-gphoto armhf 1.4+r2648~201610112002~ubuntu16.04.1 [35,5 kB]
    Réception de:19 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf libqsi7 armhf 7.2.0+r2648~201610112004~ubuntu16.04.1 [178 kB]
    Réception de:20 http://ports.ubuntu.com xenial/main armhf libusb-1.0-0-dev armhf 2:1.0.20-1 [53,9 kB]
    Réception de:21 http://ports.ubuntu.com xenial-updates/main armhf libboost-regex1.58.0 armhf 1.58.0+dfsg-5ubuntu3.1 [211 kB]
    Réception de:22 http://ports.ubuntu.com xenial/universe armhf dcraw armhf 9.21-0.2 [132 kB]
    Réception de:23 http://ports.ubuntu.com xenial/universe armhf libftdi1 armhf 0.20-4build1 [13,4 kB]
    Réception de:24 http://ports.ubuntu.com xenial/universe armhf libgps22 armhf 3.15-2build1 [49,6 kB]
    Réception de:25 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf indi-qsi armhf 0.5.0+r2648~201610112004~ubuntu16.04.1 [21,8 kB]
    Réception de:26 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf libfishcamp armhf 1.0+r2648~201610112004~ubuntu16.04.1 [42,1 kB]
    Réception de:27 http://ports.ubuntu.com xenial/main armhf libusb-1.0-doc all 2:1.0.20-1 [160 kB]
    Réception de:28 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf indi-fishcamp armhf 1.0+r2648~201610112004~ubuntu16.04.1 [12,9 kB]
    Réception de:29 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf indi-maxdomeii armhf 1.1+r2648~201610112003~ubuntu16.04.1 [13,5 kB]
    Réception de:30 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf indi-asi armhf 0.5+r2648~201610112004~ubuntu16.04.1 [162 kB]
    Réception de:31 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf indi-aagcloudwatcher armhf 1.3+r2648~201610112004~ubuntu16.04.1 [20,4 kB]
    Réception de:32 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf indi-ffmv armhf 0.1+r2648~201610112005~ubuntu16.04.1 [10,5 kB]
    Réception de:33 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf indi-dsi armhf 0.1+r2648~201610112003~ubuntu16.04.1 [47,7 kB]
    Réception de:34 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf libqhy armhf 0.1.8+r2648~201610110828~ubuntu16.04.1 [443 kB]
    Réception de:35 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf indi-qhy armhf 1.6+r2648~201610112004~ubuntu16.04.1 [19,4 kB]
    Réception de:36 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf indi-gpsd armhf 0.3+r2648~201610112004~ubuntu16.04.1 [7 604 B]
    Réception de:37 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf indi-mi armhf 1.1+r2648~201610112004~ubuntu16.04.1 [46,3 kB]
    Réception de:38 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf indi-duino armhf 0.2+r2648~201610112002~ubuntu16.04.1 [20,1 kB]
    Réception de:39 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf fliusb-dkms armhf 1.3+r2648~201610112003~ubuntu16.04.1 [9 292 B]
    Réception de:40 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf libfli1 armhf 1.8.ubuntu5+r2648~201610112003~ubuntu16.04.1 [32,7 kB]
    Réception de:41 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf indi-fli armhf 1.0.0ubuntu3+r2648~201610112004~ubuntu16.04.1 [24,8 kB]
    Réception de:42 http://ppa.launchpad.net/mutlaqja/ppa/ubuntu xenial/main armhf indi-full armhf 1.2~201610112005~ubuntu16.04.1 [2 020 B]
    5 470 ko réceptionnés en 5s (1 063 ko/s)
    Extraction des modèles depuis les paquets : 100%
    Sélection du paquet libnova-0.14-0:armhf précédemment désélectionné.
    (Lecture de la base de données... 169462 fichiers et répertoires déjà installés.)
    Préparation du dépaquetage de .../libnova-0.14-0_0.14.0-2.1_armhf.deb ...
    Dépaquetage de libnova-0.14-0:armhf (0.14.0-2.1) ...
    Sélection du paquet dkms précédemment désélectionné.
    Préparation du dépaquetage de .../dkms_2.2.0.3-2ubuntu11.2_all.deb ...
    Dépaquetage de dkms (2.2.0.3-2ubuntu11.2) ...
    Sélection du paquet libfakeroot:armhf précédemment désélectionné.
    Préparation du dépaquetage de .../libfakeroot_1.20.2-1ubuntu1_armhf.deb ...
    Dépaquetage de libfakeroot:armhf (1.20.2-1ubuntu1) ...
    Sélection du paquet fakeroot précédemment désélectionné.
    Préparation du dépaquetage de .../fakeroot_1.20.2-1ubuntu1_armhf.deb ...
    Dépaquetage de fakeroot (1.20.2-1ubuntu1) ...
    Sélection du paquet fxload précédemment désélectionné.
    Préparation du dépaquetage de .../fxload_0.0.20081013-1ubuntu1_armhf.deb ...
    Dépaquetage de fxload (0.0.20081013-1ubuntu1) ...
    Sélection du paquet libcfitsio2:armhf précédemment désélectionné.
    Préparation du dépaquetage de .../libcfitsio2_3.370-5_armhf.deb ...
    Dépaquetage de libcfitsio2:armhf (3.370-5) ...
    Sélection du paquet libgsl2:armhf précédemment désélectionné.
    Préparation du dépaquetage de .../libgsl2_2.1+dfsg-2_armhf.deb ...
    Dépaquetage de libgsl2:armhf (2.1+dfsg-2) ...
    Sélection du paquet libindi-data précédemment désélectionné.
    Préparation du dépaquetage de .../libindi-data_1.2.0+r2648~201610112004~ubuntu16.04.1_all.deb ...
    Dépaquetage de libindi-data (1.2.0+r2648~201610112004~ubuntu16.04.1) ...
    Sélection du paquet libindi1:armhf précédemment désélectionné.
    Préparation du dépaquetage de .../libindi1_1.2.0+r2648~201610112004~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de libindi1:armhf (1.2.0+r2648~201610112004~ubuntu16.04.1) ...
    Sélection du paquet indi-bin précédemment désélectionné.
    Préparation du dépaquetage de .../indi-bin_1.2.0+r2648~201610112004~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de indi-bin (1.2.0+r2648~201610112004~ubuntu16.04.1) ...
    Sélection du paquet libusb-1.0-0-dev:armhf précédemment désélectionné.
    Préparation du dépaquetage de .../libusb-1.0-0-dev_2%3a1.0.20-1_armhf.deb ...
    Dépaquetage de libusb-1.0-0-dev:armhf (2:1.0.20-1) ...
    Sélection du paquet libindi-dev précédemment désélectionné.
    Préparation du dépaquetage de .../libindi-dev_1.2.0+r2648~201610112004~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de libindi-dev (1.2.0+r2648~201610112004~ubuntu16.04.1) ...
    Sélection du paquet indi-eqmod précédemment désélectionné.
    Préparation du dépaquetage de .../indi-eqmod_0.3+r2648~201610112004~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de indi-eqmod (0.3+r2648~201610112004~ubuntu16.04.1) ...
    Sélection du paquet indi-sx précédemment désélectionné.
    Préparation du dépaquetage de .../indi-sx_1.4+r2648~201610112004~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de indi-sx (1.4+r2648~201610112004~ubuntu16.04.1) ...
    Sélection du paquet libsbigudrv2 précédemment désélectionné.
    Préparation du dépaquetage de .../libsbigudrv2_2.1.1+r2648~201610112004~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de libsbigudrv2 (2.1.1+r2648~201610112004~ubuntu16.04.1) ...
    Sélection du paquet indi-sbig précédemment désélectionné.
    Préparation du dépaquetage de .../indi-sbig_1.7+r2648~201610112004~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de indi-sbig (1.7+r2648~201610112004~ubuntu16.04.1) ...
    Sélection du paquet libboost-regex1.58.0:armhf précédemment désélectionné.
    Préparation du dépaquetage de .../libboost-regex1.58.0_1.58.0+dfsg-5ubuntu3.1_armhf.deb ...
    Dépaquetage de libboost-regex1.58.0:armhf (1.58.0+dfsg-5ubuntu3.1) ...
    Sélection du paquet libapogee3 précédemment désélectionné.
    Préparation du dépaquetage de .../libapogee3_3.0.3234+r2648~201610112003~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de libapogee3 (3.0.3234+r2648~201610112003~ubuntu16.04.1) ...
    Sélection du paquet indi-apogee précédemment désélectionné.
    Préparation du dépaquetage de .../indi-apogee_1.5+r2648~201610112004~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de indi-apogee (1.5+r2648~201610112004~ubuntu16.04.1) ...
    Sélection du paquet dcraw précédemment désélectionné.
    Préparation du dépaquetage de .../dcraw_9.21-0.2_armhf.deb ...
    Dépaquetage de dcraw (9.21-0.2) ...
    Sélection du paquet indi-gphoto précédemment désélectionné.
    Préparation du dépaquetage de .../indi-gphoto_1.4+r2648~201610112002~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de indi-gphoto (1.4+r2648~201610112002~ubuntu16.04.1) ...
    Sélection du paquet libftdi1:armhf précédemment désélectionné.
    Préparation du dépaquetage de .../libftdi1_0.20-4build1_armhf.deb ...
    Dépaquetage de libftdi1:armhf (0.20-4build1) ...
    Sélection du paquet libqsi7 précédemment désélectionné.
    Préparation du dépaquetage de .../libqsi7_7.2.0+r2648~201610112004~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de libqsi7 (7.2.0+r2648~201610112004~ubuntu16.04.1) ...
    Sélection du paquet indi-qsi précédemment désélectionné.
    Préparation du dépaquetage de .../indi-qsi_0.5.0+r2648~201610112004~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de indi-qsi (0.5.0+r2648~201610112004~ubuntu16.04.1) ...
    Sélection du paquet libfishcamp précédemment désélectionné.
    Préparation du dépaquetage de .../libfishcamp_1.0+r2648~201610112004~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de libfishcamp (1.0+r2648~201610112004~ubuntu16.04.1) ...
    Sélection du paquet indi-fishcamp précédemment désélectionné.
    Préparation du dépaquetage de .../indi-fishcamp_1.0+r2648~201610112004~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de indi-fishcamp (1.0+r2648~201610112004~ubuntu16.04.1) ...
    Sélection du paquet indi-maxdomeii précédemment désélectionné.
    Préparation du dépaquetage de .../indi-maxdomeii_1.1+r2648~201610112003~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de indi-maxdomeii (1.1+r2648~201610112003~ubuntu16.04.1) ...
    Sélection du paquet indi-asi précédemment désélectionné.
    Préparation du dépaquetage de .../indi-asi_0.5+r2648~201610112004~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de indi-asi (0.5+r2648~201610112004~ubuntu16.04.1) ...
    Sélection du paquet indi-aagcloudwatcher précédemment désélectionné.
    Préparation du dépaquetage de .../indi-aagcloudwatcher_1.3+r2648~201610112004~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de indi-aagcloudwatcher (1.3+r2648~201610112004~ubuntu16.04.1) ...
    Sélection du paquet indi-ffmv précédemment désélectionné.
    Préparation du dépaquetage de .../indi-ffmv_0.1+r2648~201610112005~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de indi-ffmv (0.1+r2648~201610112005~ubuntu16.04.1) ...
    Sélection du paquet indi-dsi précédemment désélectionné.
    Préparation du dépaquetage de .../indi-dsi_0.1+r2648~201610112003~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de indi-dsi (0.1+r2648~201610112003~ubuntu16.04.1) ...
    Sélection du paquet libqhy précédemment désélectionné.
    Préparation du dépaquetage de .../libqhy_0.1.8+r2648~201610110828~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de libqhy (0.1.8+r2648~201610110828~ubuntu16.04.1) ...
    Sélection du paquet indi-qhy précédemment désélectionné.
    Préparation du dépaquetage de .../indi-qhy_1.6+r2648~201610112004~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de indi-qhy (1.6+r2648~201610112004~ubuntu16.04.1) ...
    Sélection du paquet libgps22:armhf précédemment désélectionné.
    Préparation du dépaquetage de .../libgps22_3.15-2build1_armhf.deb ...
    Dépaquetage de libgps22:armhf (3.15-2build1) ...
    Sélection du paquet indi-gpsd précédemment désélectionné.
    Préparation du dépaquetage de .../indi-gpsd_0.3+r2648~201610112004~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de indi-gpsd (0.3+r2648~201610112004~ubuntu16.04.1) ...
    Sélection du paquet indi-mi précédemment désélectionné.
    Préparation du dépaquetage de .../indi-mi_1.1+r2648~201610112004~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de indi-mi (1.1+r2648~201610112004~ubuntu16.04.1) ...
    Sélection du paquet indi-duino précédemment désélectionné.
    Préparation du dépaquetage de .../indi-duino_0.2+r2648~201610112002~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de indi-duino (0.2+r2648~201610112002~ubuntu16.04.1) ...
    Sélection du paquet fliusb-dkms précédemment désélectionné.
    Préparation du dépaquetage de .../fliusb-dkms_1.3+r2648~201610112003~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de fliusb-dkms (1.3+r2648~201610112003~ubuntu16.04.1) ...
    Sélection du paquet libfli1 précédemment désélectionné.
    Préparation du dépaquetage de .../libfli1_1.8.ubuntu5+r2648~201610112003~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de libfli1 (1.8.ubuntu5+r2648~201610112003~ubuntu16.04.1) ...
    Sélection du paquet indi-fli précédemment désélectionné.
    Préparation du dépaquetage de .../indi-fli_1.0.0ubuntu3+r2648~201610112004~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de indi-fli (1.0.0ubuntu3+r2648~201610112004~ubuntu16.04.1) ...
    Sélection du paquet indi-full précédemment désélectionné.
    Préparation du dépaquetage de .../indi-full_1.2~201610112005~ubuntu16.04.1_armhf.deb ...
    Dépaquetage de indi-full (1.2~201610112005~ubuntu16.04.1) ...
    Sélection du paquet libusb-1.0-doc précédemment désélectionné.
    Préparation du dépaquetage de .../libusb-1.0-doc_2%3a1.0.20-1_all.deb ...
    Dépaquetage de libusb-1.0-doc (2:1.0.20-1) ...
    Traitement des actions différées (« triggers ») pour man-db (2.7.5-1) ...
    Traitement des actions différées (« triggers ») pour libc-bin (2.23-0ubuntu3) ...
    Paramétrage de libnova-0.14-0:armhf (0.14.0-2.1) ...
    Paramétrage de dkms (2.2.0.3-2ubuntu11.2) ...
    Paramétrage de libfakeroot:armhf (1.20.2-1ubuntu1) ...
    Paramétrage de fakeroot (1.20.2-1ubuntu1) ...
    update-alternatives: utilisation de « /usr/bin/fakeroot-sysv » pour fournir « /usr/bin/fakeroot » (fakeroot) en mode automatique
    Paramétrage de fxload (0.0.20081013-1ubuntu1) ...
    Paramétrage de libcfitsio2:armhf (3.370-5) ...
    Paramétrage de libgsl2:armhf (2.1+dfsg-2) ...
    Paramétrage de libindi-data (1.2.0+r2648~201610112004~ubuntu16.04.1) ...
    Paramétrage de libusb-1.0-0-dev:armhf (2:1.0.20-1) ...
    Paramétrage de libsbigudrv2 (2.1.1+r2648~201610112004~ubuntu16.04.1) ...
    Paramétrage de libboost-regex1.58.0:armhf (1.58.0+dfsg-5ubuntu3.1) ...
    Paramétrage de libapogee3 (3.0.3234+r2648~201610112003~ubuntu16.04.1) ...
    Paramétrage de dcraw (9.21-0.2) ...
    Paramétrage de libftdi1:armhf (0.20-4build1) ...
    Paramétrage de libqsi7 (7.2.0+r2648~201610112004~ubuntu16.04.1) ...
    Paramétrage de libfishcamp (1.0+r2648~201610112004~ubuntu16.04.1) ...
    Paramétrage de libqhy (0.1.8+r2648~201610110828~ubuntu16.04.1) ...
    Paramétrage de libgps22:armhf (3.15-2build1) ...
    Paramétrage de fliusb-dkms (1.3+r2648~201610112003~ubuntu16.04.1) ...
    Loading new fliusb-1.3+r2648~201610112003~ubuntu16.04.1 DKMS files...
    First Installation: checking all kernels...
    dpkg : avertissement : mauvaise syntaxe de la version « *-* »: le numéro de version ne commence pas par un chiffre
    It is likely that 4.1.19-v7+ belongs to a chroot's host
    Module build for the currently running kernel was skipped since the
    kernel source for this kernel does not seem to be installed.
    Paramétrage de libfli1 (1.8.ubuntu5+r2648~201610112003~ubuntu16.04.1) ...
    Paramétrage de libusb-1.0-doc (2:1.0.20-1) ...
    Paramétrage de indi-bin (1.2.0+r2648~201610112004~ubuntu16.04.1) ...
    Paramétrage de libindi1:armhf (1.2.0+r2648~201610112004~ubuntu16.04.1) ...
    Adding user `ubuntu' to group `dialout' ...
    Adding user ubuntu to group dialout
    Done.
    Paramétrage de libindi-dev (1.2.0+r2648~201610112004~ubuntu16.04.1) ...
    Paramétrage de indi-eqmod (0.3+r2648~201610112004~ubuntu16.04.1) ...
    Paramétrage de indi-sx (1.4+r2648~201610112004~ubuntu16.04.1) ...
    Paramétrage de indi-sbig (1.7+r2648~201610112004~ubuntu16.04.1) ...
    Paramétrage de indi-apogee (1.5+r2648~201610112004~ubuntu16.04.1) ...
    Paramétrage de indi-gphoto (1.4+r2648~201610112002~ubuntu16.04.1) ...
    Paramétrage de indi-qsi (0.5.0+r2648~201610112004~ubuntu16.04.1) ...
    Paramétrage de indi-fishcamp (1.0+r2648~201610112004~ubuntu16.04.1) ...
    Paramétrage de indi-maxdomeii (1.1+r2648~201610112003~ubuntu16.04.1) ...
    Paramétrage de indi-asi (0.5+r2648~201610112004~ubuntu16.04.1) ...
    Paramétrage de indi-aagcloudwatcher (1.3+r2648~201610112004~ubuntu16.04.1) ...
    Paramétrage de indi-ffmv (0.1+r2648~201610112005~ubuntu16.04.1) ...
    Paramétrage de indi-dsi (0.1+r2648~201610112003~ubuntu16.04.1) ...
    Paramétrage de indi-qhy (1.6+r2648~201610112004~ubuntu16.04.1) ...
    Paramétrage de indi-gpsd (0.3+r2648~201610112004~ubuntu16.04.1) ...
    Paramétrage de indi-mi (1.1+r2648~201610112004~ubuntu16.04.1) ...
    Paramétrage de indi-duino (0.2+r2648~201610112002~ubuntu16.04.1) ...
    Paramétrage de indi-fli (1.0.0ubuntu3+r2648~201610112004~ubuntu16.04.1) ...
    Paramétrage de indi-full (1.2~201610112005~ubuntu16.04.1) ...
    Traitement des actions différées (« triggers ») pour libc-bin (2.23-0ubuntu3) ...
    	
  2. install swig.
    $ sudo apt-get install swig
    	
    details
    $ sudo apt-get install swig
    Lecture des listes de paquets... Fait
    Construction de l'arbre des dépendances       
    Lecture des informations d'état... Fait
    Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires :
      apt-clone archdetect-deb dpkg-repack gir1.2-json-1.0 gir1.2-timezonemap-1.0 gir1.2-xkl-1.0 libdebian-installer4
      libparted-fs-resize0 libtimezonemap-data libtimezonemap1 os-prober python3-icu python3-pam rdate
    Veuillez utiliser « sudo apt autoremove » pour les supprimer.
    The following additional packages will be installed:
      swig3.0
    Paquets suggérés :
      swig-doc swig-examples swig3.0-examples swig3.0-doc
    Les NOUVEAUX paquets suivants seront installés :
      swig swig3.0
    0 mis à jour, 2 nouvellement installés, 0 à enlever et 381 non mis à jour.
    Il est nécessaire de prendre 919 ko dans les archives.
    Après cette opération, 4 992 ko d'espace disque supplémentaires seront utilisés.
    Souhaitez-vous continuer ? [O/n] O
    Réception de:1 http://ports.ubuntu.com xenial/universe armhf swig3.0 armhf 3.0.8-0ubuntu3 [913 kB]
    Réception de:2 http://ports.ubuntu.com xenial/universe armhf swig armhf 3.0.8-0ubuntu3 [6 246 B]
    919 ko réceptionnés en 0s (1 721 ko/s)
    Sélection du paquet swig3.0 précédemment désélectionné.
    (Lecture de la base de données... 170520 fichiers et répertoires déjà installés.)
    Préparation du dépaquetage de .../swig3.0_3.0.8-0ubuntu3_armhf.deb ...
    Dépaquetage de swig3.0 (3.0.8-0ubuntu3) ...
    Sélection du paquet swig précédemment désélectionné.
    Préparation du dépaquetage de .../swig_3.0.8-0ubuntu3_armhf.deb ...
    Dépaquetage de swig (3.0.8-0ubuntu3) ...
    Traitement des actions différées (« triggers ») pour man-db (2.7.5-1) ...
    Paramétrage de swig3.0 (3.0.8-0ubuntu3) ...
    Paramétrage de swig (3.0.8-0ubuntu3) ...
    	

1.2. Ubuntu Classic 16.04

These are the steps I use on the Ubuntu 16.04 distribution for the raspberry pi.

  1. install compilers and development tools;
    $ sudo apt-get install build-essential	
          
    details
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    The following additional packages will be installed:
      binutils cpp cpp-5 dpkg-dev fakeroot g++ g++-5 gcc gcc-5 libalgorithm-diff-perl libalgorithm-diff-xs-perl
      libalgorithm-merge-perl libasan2 libatomic1 libc-dev-bin libc6-dev libcc1-0 libdpkg-perl libfakeroot libfile-fcntllock-perl
      libgcc-5-dev libgomp1 libisl15 libmpc3 libstdc++-5-dev libubsan0 linux-libc-dev make manpages-dev
    Suggested packages:
      binutils-doc cpp-doc gcc-5-locales debian-keyring g++-multilib g++-5-multilib gcc-5-doc libstdc++6-5-dbg gcc-multilib autoconf
      automake libtool flex bison gdb gcc-doc gcc-5-multilib libgcc1-dbg libgomp1-dbg libitm1-dbg libatomic1-dbg libasan2-dbg
      liblsan0-dbg libtsan0-dbg libubsan0-dbg libcilkrts5-dbg libmpx0-dbg libquadmath0-dbg glibc-doc libstdc++-5-doc make-doc
    The following NEW packages will be installed:
      binutils build-essential cpp cpp-5 dpkg-dev fakeroot g++ g++-5 gcc gcc-5 libalgorithm-diff-perl libalgorithm-diff-xs-perl
      libalgorithm-merge-perl libasan2 libatomic1 libc-dev-bin libc6-dev libcc1-0 libdpkg-perl libfakeroot libfile-fcntllock-perl
      libgcc-5-dev libgomp1 libisl15 libmpc3 libstdc++-5-dev libubsan0 linux-libc-dev make manpages-dev
    0 upgraded, 30 newly installed, 0 to remove and 5 not upgraded.
    Need to get 26.2 MB of archives.
    After this operation, 90.8 MB of additional disk space will be used.
    Do you want to continue? [Y/n] Y
    
  2. install indi library from the Jasem Mutlaq repository (recommended for Ubuntu);
    $ sudo apt-add-repository ppa:mutlaqja/ppa
    $ sudo apt-get update	  
    $ sudo apt-get install indi-full
    
    details
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    The following additional packages will be installed:
      dcraw dkms fliusb-dkms fontconfig-config fonts-dejavu-core fxload indi-aagcloudwatcher indi-apogee indi-asi indi-bin indi-dsi
      indi-duino indi-eqmod indi-ffmv indi-fishcamp indi-fli indi-gphoto indi-gpsd indi-maxdomeii indi-mi indi-qhy indi-qsi indi-sbig
      indi-sx libapogee3 libboost-regex1.58.0 libcfitsio2 libdc1394-22 libexif12 libfishcamp libfli1 libfontconfig1 libfreetype6
      libftdi1 libgd3 libgphoto2-6 libgphoto2-l10n libgphoto2-port12 libgps22 libgsl2 libindi-data libindi1 libjasper1 libjbig0
      libjpeg-turbo8 libjpeg8 liblcms2-2 libltdl7 libnova-0.14-0 libqhy libqsi7 libraw1394-11 libsbigudrv2 libtiff5 libvpx3 libxpm4
    Suggested packages:
      gphoto2 netpbm libgd-tools gpsd gsl-ref-psdoc | gsl-doc-pdf | gsl-doc-info | gsl-ref-html libjasper-runtime liblcms2-utils
      libraw1394-doc
    The following NEW packages will be installed:
      dcraw dkms fliusb-dkms fontconfig-config fonts-dejavu-core fxload indi-aagcloudwatcher indi-apogee indi-asi indi-bin indi-dsi
      indi-duino indi-eqmod indi-ffmv indi-fishcamp indi-fli indi-full indi-gphoto indi-gpsd indi-maxdomeii indi-mi indi-qhy indi-qsi
      indi-sbig indi-sx libapogee3 libboost-regex1.58.0 libcfitsio2 libdc1394-22 libexif12 libfishcamp libfli1 libfontconfig1
      libfreetype6 libftdi1 libgd3 libgphoto2-6 libgphoto2-l10n libgphoto2-port12 libgps22 libgsl2 libindi-data libindi1 libjasper1
      libjbig0 libjpeg-turbo8 libjpeg8 liblcms2-2 libltdl7 libnova-0.14-0 libqhy libqsi7 libraw1394-11 libsbigudrv2 libtiff5 libvpx3
      libxpm4
    0 upgraded, 57 newly installed, 0 to remove and 5 not upgraded.
    Need to get 8,896 kB of archives.
    After this operation, 39.1 MB of additional disk space will be used.
    Do you want to continue? [Y/n] Y
    	
  3. install Python setup tools, Python development files, pip and swig.
    $ sudo apt-get install python3-setuptools python3-dev python3-pip swig
    	
    details
    	
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    The following additional packages will be installed:
      libexpat1-dev libpython3-dev libpython3.5 libpython3.5-dev python3.5-dev swig3.0
    Suggested packages:
      python-setuptools-doc swig-doc swig-examples swig3.0-examples swig3.0-doc
    The following NEW packages will be installed:
      libexpat1-dev libpython3-dev libpython3.5 libpython3.5-dev python3-dev python3-setuptools python3.5-dev swig swig3.0
    0 upgraded, 9 newly installed, 0 to remove and 5 not upgraded.
    Need to get 39.3 MB of archives.
    After this operation, 56.0 MB of additional disk space will be used.
    Do you want to continue? [Y/n]
    	

1.3. Install pyindi-client

pyindi-client is now distributed through the Python Package Index. The pip default scheme in Ubuntu is to use a per-user installation for Python modules. Then the module will only be available to the ubuntu user (which is the only one on the Ubuntu raspberry pi anyway). This is the recommended method. Run the command as the normal user (not root nor sudo).

$ pip3 install --user --install-option="--prefix=" pyindi-client 

details on Ubuntu Mate 16.04
$ pip3 install --user --install-option="--prefix=" pyindi-client
/usr/lib/python3/dist-packages/pip/commands/install.py:198: UserWarning: Disabling all use of wheels due to the use of --build-options / --global-options / --install-options.
  cmdoptions.check_install_build_global(options)
Collecting pyindi-client
  Downloading pyindi-client-0.1.0a1.tar.gz
Skipping bdist_wheel for pyindi-client, due to binaries being disabled for it.
Installing collected packages: pyindi-client
  Running setup.py install for pyindi-client ... done
  Could not find .egg-info directory in install record for pyindi-client from https://pypi.python.org/packages/05/8c/1ea44ed1870a94845369ab2c06ff27618e0f49b24c2c38bee2fe2e1f6c60/pyindi-client-0.1.0a1.tar.gz#md5=f0fa41e3d42431ad45acab22234a495f
Successfully installed pyindi-client
You are using pip version 8.1.1, however version 8.1.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
details on Ubuntu 16.04 

 

To install the module system-wide, you may use

$ sudo -H pip3 install --system pyindi-client

Use pip2 and install swig2 for a Python 2.7 installation.

I still have to refine the setup.py file in the pip distribution.

2. Programming with PyINDI

INDI philosophy is to manage a collection of devices through properties: a property is a (set of) typed value and is aimed to reflect a particular aspect of a device. Properties may be texts, numbers, switchs, lights and blobs (Binary Large Objects). They are tightly coupled to a device, and managed by the device driver. Here are the standard properties used in Astronomy. An indi server talks to a set of devices and centralizes their properties for use by clients (or other snooping drivers). In this scheme, a client may only have two actions with regard to a property:

  1. receives the property values as they change along time
  2. asks the driver to change the property value (with no insurance the change will be effective)

As the property values are managed by device drivers, their changes occur asynchronously from the client point of view. Hence the first aspect when programming an INDI client is to define its behavior upon receiving new property values: the libindi framework encapsulates this aspect with the definition of new* virtual functions (newText, newNumber, ...). These functions are automatically called by a listening thread connected to the indi server. Being virtual, you must define these functions in every INDI clients, hence in a pyindi-client.

The second aspect, i.e. changing properties values, is handled by the libindi framework through the use of sendNew* functions (sendNewText, sendNewNumber, ...). They may be called anywhere in the client code.

2.1. A minimal script

Hence the minimal pyndi-client code will look like the code below. Note that before executing this program you should launch an indiserver instance on your localhost.

$ indiserver indi_simulator_ccd indi_simulator_telescope
import PyIndi

class IndiClient(PyIndi.BaseClient):
    def __init__(self):
        super(IndiClient, self).__init__()
    def newDevice(self, d):
        pass
    def newProperty(self, p):
        pass
    def removeProperty(self, p):
        pass
    def newBLOB(self, bp):
        pass
    def newSwitch(self, svp):
        pass
    def newNumber(self, nvp):
        pass
    def newText(self, tvp):
        pass
    def newLight(self, lvp):
        pass
    def newMessage(self, d, m):
        pass
    def serverConnected(self):
        pass
    def serverDisconnected(self, code):
        pass

indiclient=IndiClient()
indiclient.setServer("localhost",7624)

indiclient.connectServer()
while (1):
    pass
    

This program defines an IndiClient class which inherits from PyIndi.BaseClient. This class should implement all virtual functions defined in its parent (all new* functions, plus serverConnected and serverDisconnected). In our case all these functions do nothing. In the main program, we instantiate an indiclient object of that class, define the indi server host and port for that client, and connects to the indi server. The program then loops forever. At that point your python program is connected to the server, receiving every indi messages in a separate thread. This thread executes the new* methods defined in the class above (which do nothing). At the same time the Python main thread (your main program) loops indefinitely. As it is, this minimal program won't display anything but eat your cpu time for nothing. Hit ctrl-C to kill it.

2.2. How to get and set properties

Firstly, we want to display the property values of a given device as they change along time. The simplest way to achieve this is to put print statements in every new* functions. This is made possible as the swig Python wrapper encapsulates our new* functions with a lock/release of the Python Global Interpreter Lock. Have in mind that these functions are called from a C function running in a C created thread (that the Python interpreter does not know of). The testindiclient.py example acts in this way. We also use this method for new devices and new properties in the code below. The main drawback of this method is that all the machinery of your application will live in the C receiving thread, which may slow down the reception of messages from the indi server. Another way is to use global Python variables for the new* functions signal the Python main thread that a new value has arrived. In this case, the machinery of your application will stay in the Python main thread. The drawback here is that it requires an active polling of those global variables in the Python main thread, leading to a 100% CPU process, whatever you do (but you may sleep between polling). We use that method in the code below for Number properties. The last method is to use some signalling/event framework: Python offers an Event class in the threading module. We will use this method in the next example to catch blobs. If you are using PyQt, it would be better to use the Qt signalling mechanism.

Secondly we want to set the value of a property. INDI Properties are grouped into vectors (even if there is only one value), which are implemented as arrays in the C libindi libraries. The pyindi-client wrapper maps those arrays into Python iterables: it defines a __getitem__ function and a __len__ function for the Property vector types. Hence you may index a property vector p (p[0].value=3.0), get its length (len(p)) or iterate over it (for item in p: print(item.name)). We use the index notation with the CONNECTION property vector to connect the device in the code below.

import PyIndi
import time

class IndiClient(PyIndi.BaseClient):
    def __init__(self):
        super(IndiClient, self).__init__()
    def newDevice(self, d):
        global dmonitor
        # We catch the monitored device
        dmonitor=d
        print("New device ", d.getDeviceName())
    def newProperty(self, p):
        global monitored
        global cmonitor
        # we catch the "CONNECTION" property of the monitored device
        if (p.getDeviceName()==monitored and p.getName() == "CONNECTION"):
            cmonitor=p.getSwitch()
        print("New property ", p.getName(), " for device ", p.getDeviceName())
    def removeProperty(self, p):
        pass
    def newBLOB(self, bp):
        pass
    def newSwitch(self, svp):
        pass
    def newNumber(self, nvp):
        global newval
        global prop
        # We only monitor Number properties of the monitored device
        prop=nvp
        newval=True
    def newText(self, tvp):
        pass
    def newLight(self, lvp):
        pass
    def newMessage(self, d, m):
        pass
    def serverConnected(self):
        pass
    def serverDisconnected(self, code):
        pass

monitored="Telescope Simulator"
dmonitor=None
cmonitor=None

indiclient=IndiClient()
indiclient.setServer("localhost",7624)

# we are only interested in the telescope device properties
indiclient.watchDevice(monitored)
indiclient.connectServer()

# wait CONNECTION property be defined
while not(cmonitor):
    time.sleep(0.05)

# if the monitored device is not connected, we do connect it
if not(dmonitor.isConnected()):
    # Property vectors are mapped to iterable Python objects
    # Hence we can access each element of the vector using Python indexing
    # each element of the "CONNECTION" vector is a ISwitch
    cmonitor[0].s=PyIndi.ISS_ON  # the "CONNECT" switch
    cmonitor[1].s=PyIndi.ISS_OFF # the "DISCONNECT" switch
    indiclient.sendNewSwitch(cmonitor) # send this new value to the device

newval=False
prop=None
nrecv=0
while (nrecv<10):
    # we poll the newval global variable 
    if (newval):
        print("newval for property", prop.name, " of device ",prop.device)
        # prop is a property vector, mapped to an iterable Python object
        for n in prop:
            # n is a INumber as we only monitor number vectors
            print(n.name, " = ", n.value)
        nrecv+=1
        newval=False
      
    

This program will display all the currently defined properties of the "Telescope Simulator" device, and then the first ten changes occuring in any Number property of that device. Actually if the scope is not tracking (as it should be the case if you don't do anything with it), only the "EQUATORIAL_EOD_COORD" property wil evolve during time. Thus the program will simply display these RA/DEC coordinates.

Note how we connect the telescope with the sendNewSwitch function using the "CONNECTION" property. This property has 2 ISwitch, "CONNECT" and "DISCONNECT", in that order (see the standard properties), which we address using the Python index notation. Each ISwitch corresponds to a C structure, where s is the switch state. We use the classical dot notation in Python to address this structure member, yielding the expression cmonitor[0].s. Generally speaking, every member of a INDI structure, every member or method of a INDI class is accessed using the Python dot notation. INDI constants are accessed by the way of the PyIndi module using the same dot notation (PyInsi.ISS_ON in the example above).

I usually edit Python programs with the idle3 editor distributed alongside Python 3. It offers completion for the expression you're typing which could be a great value when you're lost. You may also use Python help. After importing the PyIndi module (import PyIndi), you may use help(PyIndi) to get further information about the module. For a specific class, use the class name (help(PyIndi.ISwitch) for instance). I plan to integrate the doxygen documentation on the Python side as this is made possible by swig.

2.3. Goto Vega and take some pictures

This is a more complex example of a Python script which performs a goto to a star and then takes a series of images. It uses the Python Event mechanism, and shows how it could be possible to perform some computations during these exposures. I put some comments in the script so it should be self-explainatory.

You should start the indi server with the telescope and the CCD simulator.

$ indiserver indi_simulator_telescope indi_simulator_ccd
      

Beware that for the indi_simulator_ccd to produce a realistic image (not just noise), you need to have installed gsc, the Guide Star Catalogue. If you use the Jasem ppa repository, just install it.

$ sudo apt-get install gsc
    

Finally you may run kstars from your desktop to visualize the progress of the script and display the fits images. Just connect to the indi server from kstars and have a look.

import PyIndi
import time
import sys
import threading
    
class IndiClient(PyIndi.BaseClient):
    def __init__(self):
        super(IndiClient, self).__init__()
    def newDevice(self, d):
        pass
    def newProperty(self, p):
        pass
    def removeProperty(self, p):
        pass
    def newBLOB(self, bp):
        global blobEvent
        print("new BLOB ", bp.name)
        blobEvent.set()
        pass
    def newSwitch(self, svp):
        pass
    def newNumber(self, nvp):
        pass
    def newText(self, tvp):
        pass
    def newLight(self, lvp):
        pass
    def newMessage(self, d, m):
        pass
    def serverConnected(self):
        pass
    def serverDisconnected(self, code):
        pass

# connect the server
indiclient=IndiClient()
indiclient.setServer("localhost",7624)

if (not(indiclient.connectServer())):
     print("No indiserver running on "+indiclient.getHost()+":"+str(indiclient.getPort())+" - Try to run")
     print("  indiserver indi_simulator_telescope indi_simulator_ccd")
     sys.exit(1)

# connect the scope
telescope="Telescope Simulator"
device_telescope=None
telescope_connect=None

# get the telescope device
device_telescope=indiclient.getDevice(telescope)
while not(device_telescope):
    time.sleep(0.5)
    device_telescope=indiclient.getDevice(telescope)
    
# wait CONNECTION property be defined for telescope
telescope_connect=device_telescope.getSwitch("CONNECTION")
while not(telescope_connect):
    time.sleep(0.5)
    telescope_connect=device_telescope.getSwitch("CONNECTION")

# if the telescope device is not connected, we do connect it
if not(device_telescope.isConnected()):
    # Property vectors are mapped to iterable Python objects
    # Hence we can access each element of the vector using Python indexing
    # each element of the "CONNECTION" vector is a ISwitch
    telescope_connect[0].s=PyIndi.ISS_ON  # the "CONNECT" switch
    telescope_connect[1].s=PyIndi.ISS_OFF # the "DISCONNECT" switch
    indiclient.sendNewSwitch(telescope_connect) # send this new value to the device
     
# Now let's make a goto to vega
# Beware that ra/dec are in decimal hours/degrees
vega={'ra': (279.23473479 * 24.0)/360.0, 'dec': +38.78368896 }

# We want to set the ON_COORD_SET switch to engage tracking after goto
# device.getSwitch is a helper to retrieve a property vector
telescope_on_coord_set=device_telescope.getSwitch("ON_COORD_SET")
while not(telescope_on_coord_set):
    time.sleep(0.5)
    telescope_on_coord_set=device_telescope.getSwitch("ON_COORD_SET")
# the order below is defined in the property vector, look at the standard Properties page
# or enumerate them in the Python shell when you're developing your program
telescope_on_coord_set[0].s=PyIndi.ISS_ON  # TRACK
telescope_on_coord_set[1].s=PyIndi.ISS_OFF # SLEW
telescope_on_coord_set[2].s=PyIndi.ISS_OFF # SYNC
indiclient.sendNewSwitch(telescope_on_coord_set)
# We set the desired coordinates
telescope_radec=device_telescope.getNumber("EQUATORIAL_EOD_COORD")
while not(telescope_radec):
    time.sleep(0.5)
    telescope_radec=device_telescope.getNumber("EQUATORIAL_EOD_COORD")
telescope_radec[0].value=vega['ra']
telescope_radec[1].value=vega['dec']
indiclient.sendNewNumber(telescope_radec)
# and wait for the scope has finished moving
while (telescope_radec.s==PyIndi.IPS_BUSY):
    print("Scope Moving ", telescope_radec[0].value, telescope_radec[1].value)
    time.sleep(2)

# Let's take some pictures
ccd="CCD Simulator"
device_ccd=indiclient.getDevice(ccd)
while not(device_ccd):
    time.sleep(0.5)
    device_ccd=indiclient.getDevice(ccd)    

ccd_connect=device_ccd.getSwitch("CONNECTION")
while not(ccd_connect):
    time.sleep(0.5)
    ccd_connect=device_ccd.getSwitch("CONNECTION")
if not(device_ccd.isConnected()):
    ccd_connect[0].s=PyIndi.ISS_ON  # the "CONNECT" switch
    ccd_connect[1].s=PyIndi.ISS_OFF # the "DISCONNECT" switch
    indiclient.sendNewSwitch(ccd_connect)

ccd_exposure=device_ccd.getNumber("CCD_EXPOSURE")
while not(ccd_exposure):
    time.sleep(0.5)
    ccd_exposure=device_ccd.getNumber("CCD_EXPOSURE")

# Ensure the CCD simulator snoops the telescope simulator
# otherwise you may not have a picture of vega
ccd_active_devices=device_ccd.getText("ACTIVE_DEVICES")
while not(ccd_active_devices):
    time.sleep(0.5)
    ccd_active_devices=device_ccd.getText("ACTIVE_DEVICES")
ccd_active_devices[0].text="Telescope Simulator"
indiclient.sendNewText(ccd_active_devices)

# we should inform the indi server that we want to receive the
# "CCD1" blob from this device
indiclient.setBLOBMode(PyIndi.B_ALSO, ccd, "CCD1")

ccd_ccd1=device_ccd.getBLOB("CCD1")
while not(ccd_ccd1):
    time.sleep(0.5)
    ccd_ccd1=device_ccd.getBLOB("CCD1")

# a list of our exposure times
exposures=[1.0, 5.0]

# we use here the threading.Event facility of Python
# we define an event for newBlob event
blobEvent=threading.Event()
blobEvent.clear()
i=0
ccd_exposure[0].value=exposures[i]
indiclient.sendNewNumber(ccd_exposure)
while (i < len(exposures)):
    # wait for the ith exposure
    blobEvent.wait()
    # we can start immediately the next one
    if (i + 1 < len(exposures)):
        ccd_exposure[0].value=exposures[i+1]
        blobEvent.clear()
        indiclient.sendNewNumber(ccd_exposure)
    # and meanwhile process the received one
    for blob in ccd_ccd1:
        print("name: ", blob.name," size: ", blob.size," format: ", blob.format)
        # pyindi-client adds a getblobdata() method to IBLOB item
        # for accessing the contents of the blob, which is a bytearray in Python
        fits=blob.getblobdata()
        print("fits data type: ", type(fits))
        # here you may use astropy.io.fits to access the fits data
	# and perform some computations while the ccd is exposing
	# but this is outside the scope of this tutorial
    i+=1
        

3. Other examples

You will find other examples in the pyindi-client repository.

  • pyindi-stellarium: a server for the Stellarium planetarium program, implementing its Telescope Control protocol. It displays the position of your scope and performs gotos.

4. Installation notes

I used a linux desktop (either ubuntu 16.04 or fedora 24) to perform these installation steps. Commands prefixed with a $ were run as normal user, those prefixed with a # were run as root. 

 

Install Ubuntu Mate for Raspberry Pi 2
  • Download the ubuntu mate 16.04.1 image for Raspberry Pi 2
  • !-
  • Download the 16.04.1 image (Don't use that one)
  • -->
  • Uncompress the image and check the overall size and the partition sizes.
    $ unxz ubuntu-mate-16.04-desktop-armhf-raspberry-pi.img.xz
    $ fdisk -l ubuntu-mate-16.04-desktop-armhf-raspberry-pi.img
    Disk ubuntu-mate-16.04-desktop-armhf-raspberry-pi.img: 7.5 GiB, 8053063680 bytes, 15728640 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: dos
    Disk identifier: 0x580a66ff
    
    Device                                            Boot  Start      End  Sectors  Size Id Type
    ubuntu-mate-16.04-desktop-armhf-raspberry-pi.img1 *      2048   133119   131072   64M  c W95 FAT32 (LBA)
    ubuntu-mate-16.04-desktop-armhf-raspberry-pi.img2      133120 15728639 15595520  7.4G 83 Linux
    
    # fdisk -l /dev/sdc
    Disk /dev/sdc: 7.4 GiB, 7948206080 bytes, 15523840 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: dos
    Disk identifier: 0x00000000
    
    Device     Boot Start      End  Sectors  Size Id Type
    /dev/sdc1        8192 15523839 15515648  7.4G  b W95 FAT32
    	  
    	
    We have to resize the second partition of the ubuntu mate image file as the SD card has only 15523840 secteurs whereas the image file uses 15728640 secteurs. See below for some explanations of the following commands.
  • Resize eventually the second partition in the image file. In this case, it should be 15523840 - 133120 = 15390720 sectors, yielding to (15390720 * 512) / (4 * 1024) = 1923840,000 4K blocks. No rouding here so the total number of sectors of the second partiton will be 15390720 sectors.
    # losetup --offset $((133120 * 512)) /dev/loop0 /localhome/localuser/rpi2/ubuntu-mate-16.04-desktop-armhf-raspberry-pi.img
    
    # e2fsck -f /dev/loop0
    e2fsck 1.42.13 (17-May-2015)
    Pass 1: Checking inodes, blocks, and sizes
    Pass 2: Checking directory structure
    Pass 3: Checking directory connectivity
    Pass 4: Checking reference counts
    Pass 5: Checking group summary information
    PI_ROOT: 187666/487680 files (0.1% non-contiguous), 968374/1949440 blocks
    
    # resize2fs /dev/loop0 15390720s
    resize2fs 1.42.13 (17-May-2015)
    Resizing the filesystem on /dev/loop0 to 1923840 (4k) blocks.
    The filesystem on /dev/loop0 is now 1923840 (4k) blocks long.
    
    # e2fsck -f /dev/loop0
    e2fsck 1.42.13 (17-May-2015)
    Pass 1: Checking inodes, blocks, and sizes
    Pass 2: Checking directory structure
    Pass 3: Checking directory connectivity
    Pass 4: Checking reference counts
    Pass 5: Checking group summary information
    PI_ROOT: 187666/479552 files (0.1% non-contiguous), 967864/1923840 blocks
    
    # losetup -d /dev/loop0
    
    # losetup /dev/loop0 /localhome/localuser/rpi2/ubuntu-mate-16.04-desktop-armhf-raspberry-pi.img
    
    # fdisk /dev/loop0
    
    Welcome to fdisk (util-linux 2.27.1).
    Changes will remain in memory only, until you decide to write them.
    Be careful before using the write command.
    
    
    Command (m for help): p
    Disk /dev/loop0: 7.5 GiB, 8053063680 bytes, 15728640 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: dos
    Disk identifier: 0x580a66ff
    
    Device       Boot  Start      End  Sectors  Size Id Type
    /dev/loop0p1 *      2048   133119   131072   64M  c W95 FAT32 (LBA)
    /dev/loop0p2      133120 15728639 15595520  7.4G 83 Linux
    
    Command (m for help): d
    Partition number (1,2, default 2): 2
    
    Partition 2 has been deleted.
    
    Command (m for help): n
    Partition type
       p   primary (1 primary, 0 extended, 3 free)
       e   extended (container for logical partitions)
    Select (default p): p
    Partition number (2-4, default 2): 2
    First sector (133120-15728639, default 133120): 133120
    Last sector, +sectors or +size{K,M,G,T,P} (133120-15728639, default 15728639): 15523839
    
    Created a new partition 2 of type 'Linux' and of size 7.3 GiB.
    
    Command (m for help): p
    Disk /dev/loop0: 7.5 GiB, 8053063680 bytes, 15728640 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: dos
    Disk identifier: 0x580a66ff
    
    Device       Boot  Start      End  Sectors  Size Id Type
    /dev/loop0p1 *      2048   133119   131072   64M  c W95 FAT32 (LBA)
    /dev/loop0p2      133120 15523839 15390720  7.3G 83 Linux
    
    Command (m for help): w
    The partition table has been altered.
    Calling ioctl() to re-read partition table.
    Re-reading the partition table failed.: Invalid argument
    
    The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).
    
    # losetup -d /dev/loop0
    
    	  
  • Write the ubuntu mate image file to the SD card using dd. This takes ~30 min here, be patient.
    # dd if=/localhome/localuser/rpi2/ubuntu-mate-16.04-desktop-armhf-raspberry-pi.img of=/dev/sdc bs=32M
    dd: error writing '/dev/sdc': No space left on device
    237+0 records in
    236+0 records out
    7948206080 bytes (7.9 GB, 7.4 GiB) copied, 1767.36 s, 4.5 MB/s
    	
    Don't worry about the error message, this concerns the last blocks that we have put outside the file system. You can put the SD card in your Rapsberry 2.
First boot with Ubuntu Mate 16.04 For the first boot I connect a keyboard, a mouse and a monitor to the rpi2 and an ethernet cable linked to the second interface of my desktop. I start the dnsmasq server on the desktop after configuring its interface (see below). After the Ubuntu Mate graphics screen appears, you're told to configure system language, timezone, keyboard layout, give new user information, and set host name. It then runs its first-boot script and removes the configuration packages and user. You then get the usual login screen. Openssh is running and you may ssh with user authentication (without using key pairs). So I did not make any special configuration here.
Install Ubuntu Classic image for Raspberry Pi 2
  • Download the 16.04 image
  • Download the 16.04.1 image (Don't use that one)
  • Uncompress the image and check the overall size and the partition sizes.
    # unxz ubuntu-16.04-preinstalled-server-armhf+raspi2.img.xz
    # fdisk -l ubuntu-16.04-preinstalled-server-armhf+raspi2.img
    Disk ubuntu-16.04.1-preinstalled-server-armhf+raspi2.img: 3.7 GiB, 4000000000 bytes, 7812500 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: dos
    Disk identifier: 0x72ddab32
    
    Device                                               Boot  Start     End Sectors  Size Id Type
    ubuntu-16.04-preinstalled-server-armhf+raspi2.img1 *      8192  270335  262144  128M  c W95 FAT32 (LBA)
    ubuntu-16.04-preinstalled-server-armhf+raspi2.img2      270336 7811071 7540736  3.6G 83 Linux
    	
    When I first try to put the image on my '4G' SD card, I got a no space left on device error. So I look at the number of sectors of my SD card1.
    # fdisk -l /dev/sdX
    Disk /dev/sdb: 3.7 GiB, 3965190144 bytes, 7744512 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: dos
    Disk identifier: 0x72ddab32
    
    Device     Boot  Start     End Sectors  Size Id Type
    /dev/sdb1  *      8192  270335  262144  128M  c W95 FAT32 (LBA)
    /dev/sdb2       270336 7811071 7540736  3.6G 83 Linux
    	
    The 7812500 sectors of the ubuntu image file can not fit in the 7744512 sectors on my SD card.
  • Eventually resize the ubuntu image file. There are 2 steps in this procedure: resize filesystems on partitons, and then resize the partitions themselves. I have to make the image file fit into 7744512 sectors rather than its original 7812500 sectors. I left as is the first boot partiton so have to resize the second one from 7540736 sectors to 7744512 - 270336 = 7474176 (the number of sectors in my SD card less the ending sector of the first partition plus one). I round this new size to a 4KiB limit (the usual filesystem block size) knowing a sector is 512 bytes: (7474176*512) / (4*1024) = 934272,000 blocks, rounded it gives 934272 * (4*1024/512) = 7474176 sectors. I assign the second partition to a loop device (/dev/loop0 here) with the losetup command: the second partition in the image file starts at sector 270335 + 1 = 270336, so its offset is 270336 * 512. I then resize the filesystem on /dev/loop0 to the desired number of 512 bytes sectors. I check the filesystem before and after this operation. Finally I detach the /dev/loop0 device.
    # losetup --offset $((270336 * 512)) /dev/loop0 /localhome/localuser/rpi2/ubuntu-16.04-preinstalled-server-armhf+raspi2.img
    # e2fsck -f /dev/loop0
    e2fsck 1.42.13 (17-May-2015)
    Pass 1: Checking inodes, blocks, and sizes
    Pass 2: Checking directory structure
    Pass 3: Checking directory connectivity
    Pass 4: Checking reference counts
    Pass 5: Checking group summary information
    cloudimg-rootfs: 56269/471424 files (0.0% non-contiguous), 276129/942592 blocks
    
    # resize2fs /dev/loop0 7474176s
    resize2fs 1.42.13 (17-May-2015)
    Resizing the filesystem on /dev/loop0 to 934272 (4k) blocks.
    The filesystem on /dev/loop0 is now 934272 (4k) blocks long.
    
    # e2fsck -f /dev/loop0
    e2fsck 1.42.13 (17-May-2015)
    Pass 1: Checking inodes, blocks, and sizes
    Pass 2: Checking directory structure
    Pass 3: Checking directory connectivity
    Pass 4: Checking reference counts
    Pass 5: Checking group summary information
    cloudimg-rootfs: 56269/471424 files (0.0% non-contiguous), 276129/934272 blocks
    
    # losetup -d /dev/loop0
    	
    I now resize this second partition with fdisk, which consists in first deleting it, and then recreate the partition. You have to carefully note its start sector and type Id.
    # losetup /dev/loop0 /localhome/localuser/rpi2/ubuntu-16.04-preinstalled-server-armhf+raspi2.img	  
    # fdisk /dev/loop0
    
    Welcome to fdisk (util-linux 2.27.1).
    Changes will remain in memory only, until you decide to write them.
    Be careful before using the write command.
    
    
    Command (m for help): p
    Disk /dev/sdb: 3.7 GiB, 3965190144 bytes, 7744512 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: dos
    Disk identifier: 0x72ddab32
    
    Device     Boot  Start     End Sectors  Size Id Type
    /dev/sdb1  *      8192  270335  262144  128M  c W95 FAT32 (LBA)
    /dev/sdb2       270336 7811071 7540736  3.6G 83 Linux
    
    Command (m for help): d
    Partition number (1,2, default 2): 2
    
    Partition 2 has been deleted.
    
    Command (m for help): n
    Partition type
       p   primary (1 primary, 0 extended, 3 free)
       e   extended (container for logical partitions)
    Select (default p): p
    Partition number (2-4, default 2): 2
    First sector (2048-7744511, default 2048): 270336
    Last sector, +sectors or +size{K,M,G,T,P} (270336-7744511, default 7744511): 7744511
    
    Created a new partition 2 of type 'Linux' and of size 3.6 GiB.
    
    Command (m for help): p
    Disk /dev/sdb: 3.7 GiB, 3965190144 bytes, 7744512 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: dos
    Disk identifier: 0x72ddab32
    
    Device     Boot  Start     End Sectors  Size Id Type
    /dev/sdb1  *      8192  270335  262144  128M  c W95 FAT32 (LBA)
    /dev/sdb2       270336 7744511 7474176  3.6G 83 Linux
    
    Command (m for help): w
    The partition table has been altered.
    Calling ioctl() to re-read partition table.
    Syncing disks.
    # losetup -d /dev/loop0
    	
    The ubuntu img file is now ready to be written on the SD card.
  • Write the ubuntu image file to the SD card using dd.
    # dd if=/localhome/localuser/rpi2/ubuntu-16.04-preinstalled-server-armhf+raspi2.img of=/dev/sdX bs=32M
    dd: error writing '/dev/sdb': No space left on device
    119+0 records in
    118+0 records out
    3965190144 bytes (4.0 GB, 3.7 GiB) copied, 969.139 s, 4.1 MB/s
    # sync
    	
    Note that the "No space left on device error" is no more an issue as the partition and filesystem sizes both fit to our SD card. dd has simply been unable to write the full img file. You may check everything is ok by unplugging and plugging again your SD card: Nautilus will mount both partitions system-boot and cloudimg-rootfs. You may now umount these partitions and plug your SD card into your rpi2.
  1. I put /dev/sdX here but it should be /dev/sd plus an uncapitalized letter, don't use a letter plus a number, this would be a partition
First boot with Ubuntu 16.04 For the first boot I connect a keyboard and a monitor to the rpi2 and an ethernet cable linked to the second interface of my desktop. I start the dnsmasq server on the desktop after configuring its interface (see above). I get the login prompt on the rpi2. I login with ubuntu/ubuntu user/password pair and am asked to immediately change the password. After logging, I immediately change the password for user ubuntu (after loading the correct keyboard layout) and then let the system perform the usual updates. Meanwhile I permit user authentication in ssh without key pairs.
# for the new keyboard layout
$ sudo loadkeys fr
$ sudo dpkg-reconfigure keyboard-configuration # did not work on next reboot
$ passwd

# some automatic updates  run in background

# Permit users to ssh with passwords
$ vi /etc/ssh/sshd_config
# Change to no to disable tunnelled clear text passwords
PasswordAuthentication yes

# Due to updates I get a ***System restart required*** so I reboot the rpi2
$ shutdown -r now

# After logging again, I get the message 90 packages can be updated.
# So I perform the upgrade manually
$ sudo apt-get upgrade
      
After 30 minutes, it gets that I now have a
Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-1023-raspi2 armv7l)
      
Using dnsmasq on a 2nd network interface for your Raspberry Pi 2 This shows how I connect my raspberry pi 2 to a second dedicated network interface on my desktop. This scheme may also be used if you use a laptop connected via wifi and which also has an ethernet connector.
  • Plug the network cable into both desktop an rpi2, and configure the 2nd network interface on the desktop.
    # ip link
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    2: enp5s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
        link/ether 84:c9:b2:37:93:64 brd ff:ff:ff:ff:ff:ff
    3: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    		  link/ether 2c:41:38:b4:ef:4a brd ff:ff:ff:ff:ff:ff
    	  
    This ip link command gives the name of the 2nd interface, enp5s0, the one which is in DOWN state. I first indicate to the Network manager to not manage this interface. This can be made by defining a configuration file in /etc/network/interfaces.d and restarting the manager.
    # echo iface enp5s0 inet manual > /etc/network/interfaces.d/enp5s0
    # systemctl restart network-manager	    
    	    
    I can then assign the second interface a fixed address on the desktop.
    # ip addr add 10.9.0.254/24 dev enp5s0
    # ip link set enp5s0 up	    
    	    
  • Launch dnsmasq to act as a DHCP server and DNS proxy.
    # dnsmasq --no-daemon --bind-interfaces --interface=enp5s0 --dhcp-range=10.9.0.1,10.9.0.100
    dnsmasq: started, version 2.75 cachesize 150
    dnsmasq: compile time options: IPv6 GNU-getopt DBus i18n IDN DHCP DHCPv6 no-Lua TFTP conntrack ipset auth DNSSEC loop-detect inotify
    dnsmasq-dhcp: DHCP, IP range 10.9.0.1 -- 10.9.0.100, lease time 1h
    dnsmasq-dhcp: DHCP, sockets bound exclusively to interface enp5s0
    dnsmasq: reading /etc/resolv.conf
    dnsmasq: using nameserver 127.0.1.1#53
    dnsmasq: read /etc/hosts - 4 addresses
    dnsmasq-dhcp: DHCPDISCOVER(enp5s0) b8:27:eb:f4:82:74 
    dnsmasq-dhcp: DHCPOFFER(enp5s0) 10.9.0.13 b8:27:eb:f4:82:74 
    dnsmasq-dhcp: DHCPREQUEST(enp5s0) 10.9.0.13 b8:27:eb:f4:82:74 
    dnsmasq-dhcp: DHCPACK(enp5s0) 10.9.0.13 b8:27:eb:f4:82:74 rpi2
    	  
    Launching dnsmasq in foreground allows to capture the MAC address of the rpi2. We could then assign it a fixed address in a small script for subsequent use.
  • Configure the desktop as a router. At this point you may ping/ssh to your rpi2 and the rpi2 is able to resolve DNS names. However the rpi2 still can not access the internet as the desktop has to act as a router, i.e. allow packet forwarding and perform Network Address Translation with iptables. The method shown here is temporary and will not survive after a reboot.
    # sysctl net.ipv4.ip_forward=1
    # iptables -t nat -A POSTROUTING -s 10.9.0.0/24 ! -d 10.9.0.0/24 -j MASQUERADE
    	  
  • Put all this stuff in a script that you could run the next time you'll bring up your rpi2 next to your desktop.
    #!/bin/bash
    ip addr add 10.9.0.254/24 dev enp5s0
    ip link set enp5s0 up
    # Use this the first time to get the MAC address of your raspberry pi 2
    # dnsmasq --no-daemon --bind-interfaces --interface=enp5s0 --dhcp-range=10.9.0.1,10.9.0.100
    # Then you can allocate a fix IP to your rpi2 and run in background
    dnsmasq --bind-interfaces --interface=enp5s0 --dhcp-range=10.9.0.1,10.9.0.100 --dhcp-host=b8:27:eb:f4:82:74,10.9.0.1,rpi2
    sysctl net.ipv4.ip_forward=1
    iptables -t nat -A POSTROUTING -s 10.9.0.0/24 ! -d 10.9.0.0/24 -j MASQUERADE
    	    

 

 

 

Login

3rd Party

Choose from the numerous 3rd party INDI drivers to suit your needs!

Got Problem?

Check out the FAQ, the forum, and the bug tracking system to resolve any issues you might have!
You can also subscribe to INDI newsletter and development mailing lists to get the latest updates on INDI!