Auto DeepSky Capturer

### REST API

### Auto DeepSky Capturer (Автоматизатор) REST API

Автоматизатор состоит из двух основных частей:

- C#.NET приложения на Windows-компьютере, к которому через ASCOM-драйвера подключено оборудование (монтировка, камеры, фокусёр и пр.);
- Web-приложения, отображаемое в любом современном браузере на любом устройстве (компьютер, планшет, телефон и т.п.), с поддержкой html5 / css / javascript.

C# программа, кроме логики работы Автоматизатора, в своих недрах содержит простой однопоточный веб-сервер, способный принимать GET/POST запросы и давать на них ответы.

Общение веб-приложения с C# частью Автоматизатора осуществляется по выбранному порту хоть с того же компьютера, хоть с любого другого в рамках доступности IP-соединения (то есть, при некоторых настройках с любого современного устройства в любой точке мира). Протокол общения - REST (если я верно его понимаю), то есть JSON поверх HTTP. Почему не pureJSON через вебсокеты? Чтобы не усложнять настройку доступа через инет пробросом ещё одного порта.

На этой странице дано описание доступных endpoint этого самого REST API Автоматизатора. Кликайте по вкладкам и изучайте. Если не понравилось написанное мною веб-приложения, вы вольны модифицировать его под свой вкус или даже написать своё с использованием этой документации.

#### GET /status

Общий (краткий) статус системы

Фильтры:

Пример ответа: {"files":{"refresh":false}}

Расшифровка ответа:

- files: Статус обработчика файлов
  - refresh: Идёт ли сейчас процедура сканирования (перечитывания) архива фитов

#### GET /status/files

Подробный статус файловой кучи

Пример ответа: {"refresh":true,"someDetails":"@todo"}

Расшифровка ответа:

- refresh: Идёт ли сейчас процедура сканирования (перечитывания) архива фитов
- @todo: @todo

#### GET /plan

План съёмки на предстоящую (или идущую сейчас) ночь

@todo

#### GET /night

Подробные сведения о времени ночи

Фильтры:

Пример ответа: {"moon":[{"begin":"2017-08-03T16:31:00","end":"2017-08-04T02:08:00"}],"notSun":{"begin":"2017-08-03T19:46:00","end":"2017-08-04T05:11:00"},"eveningFlat":{"begin":"2017-08-03T19:46:00","end":"2017-08-03T20:19:00"},"eveningTwilight":{"begin":"2017-08-03T20:19:00","end":"2017-08-03T21:49:00"},"night":{"begin":"2017-08-03T21:49:00","end":"2017-08-04T03:07:00"},"morningTwilight":{"begin":"2017-08-04T03:07:00","end":"2017-08-04T04:37:00"},"morningFlat":{"begin":"2017-08-04T04:37:00","end":"2017-08-04T05:11:00"}}

Расшифровка ответа:

- moon: Массив промежутков времени присутствия Луны на небе. Только пересекающихся с не-Солнцем!
  - begin: Время начала промежутка
  - end: Время окончания промежутка
- notSun: Промежуток между закатом и восходом Солнца
  - begin: Время начала промежутка (закат Солнца)
  - end: Время окончания промежутка (восход Солнца)
- eveningFlat: Вечерние гражданские сумерки
  - begin: Время начала промежутка
  - end: Время окончания промежутка
- eveningTwilight: Вечерние астрономические сумерки
  - begin: Время начала промежутка
  - end: Время окончания промежутка
- night: Астроночь!
  - begin: Время начала промежутка
  - end: Время окончания промежутка
- morningTwilight: Утренние астрономические сумерки
  - begin: Время начала промежутка
  - end: Время окончания промежутка
- morningFlat: Утренние гражданские сумерки
  - begin: Время начала промежутка
  - end: Время окончания промежутка

#### GET /task

Получить список задач в базе

Фильтры: нет

Пример ответа: [{"id":1,"priority":0,"how":[{"id":7,"name":"HST","filters":[{"name":"Ha","bin":1,"exposure":15,"count":1},{"name":"O3","bin":1,"exposure":15,"count":1},{"name":"S2","bin":1,"exposure":15,"count":1}]}],"obj":"m1","ra":"05 34.5","dec":"+22 01","moon":"any","moonDegree":10,"moonFrom":0,"moonTill":100,"whenDegree":10,"whenCulmHour":1,"whenCulmDirection":"","hours":0,"note":""}]

#### GET /task/<id>

Получить подробные данные о задаче <id>

Фильтры: нет

Пример ответа: {"id":1,"priority":0,"how":[{"id":7,"name":"HST","filters":[{"name":"Ha","bin":1,"exposure":15,"count":1},{"name":"O3","bin":1,"exposure":15,"count":1},{"name":"S2","bin":1,"exposure":15,"count":1}]}],"obj":"m1","ra":"05 34.5","dec":"+22 01","moon":"any","moonDegree":10,"moonFrom":0,"moonTill":100,"whenDegree":10,"whenCulmHour":1,"whenCulmDirection":"","hours":0,"note":""}

#### POST /task/create

Создание новой задачи

Вход: объект, аналогичный /task/<id>. В стратегиях съёмки (поле how) достаточно указания только поля id

Пример ответа: {"id":1,"status":200}

#### POST /task/<id>/update

Обновление данных задачи <id>

Вход: объект, аналогичный /task/<id>. В стратегиях съёмки (поле how) достаточно указания только поля id

Пример ответа: {"id":1,"status":200}

#### POST /task/<id>/remove

Удаление задачи <id>

Пример ответа: {"status":200}

#### GET /how

Получить список стратегий съёмки из базы

Фильтры: нет

Пример ответа: [{"id":2,"name":"\u0412\u043e\u0434\u043e\u0440\u043e\u0434 / \u041a\u0438\u0441\u043b\u043e\u0440\u043e\u0434","filters":[{"name":"Ha","bin":1,"exposure":15,"count":1},{"name":"O3","bin":1,"exposure":15,"count":1}]},{"id":3,"name":"L-bin1, RGB-bin2","filters":[{"name":"L","bin":1,"exposure":10,"count":1},{"name":"R","bin":2,"exposure":5,"count":1},{"name":"G","bin":2,"exposure":5,"count":1},{"name":"B","bin":2,"exposure":5,"count":1}]},{"id":4,"name":"RGB-bin1","filters":[{"name":"R","bin":1,"exposure":10,"count":1},{"name":"G","bin":1,"exposure":10,"count":1},{"name":"B","bin":1,"exposure":10,"count":1}]}]

#### GET /how/<id>

Получить подробные данные о стратегии съёмки <id>

Фильтры: нет

Пример ответа: {"id":3,"name":"L-bin1, RGB-bin2","filters":[{"name":"L","bin":1,"exposure":10,"count":1},{"name":"R","bin":2,"exposure":5,"count":1},{"name":"G","bin":2,"exposure":5,"count":1},{"name":"B","bin":2,"exposure":5,"count":1}]}

#### POST /how/create

Создание новой стратегии съёмки

Вход: объект, аналогичный /how/<id>

Пример ответа: {"id":1,"status":200}

#### POST /how/<id>/update

Обновление данных стратегии съёмки <id>

Вход: объект, аналогичный /how/<id>

Пример ответа: {"id":1,"status":200}

#### POST /how/<id>/remove

Удаление стратегии съёмки <id>

Пример ответа: {"status":200}

#### GET /catalog

Поиск координат дипскай-объекта

Фильтры:

- catalog - в каком каталоге искать. Пока что единственный выбор 'sac', поиск в offline SAC-каталоге из БД;
- object - имя объекта поиска, например: m101.

Пример запроса: GET /catalog?catalog=sac&object=m101

Пример ответа: {"ra":"14 03.2","dec":"+54 21"}

#### GET /config

Получить список всех настроек из базы

Фильтры: нет

Пример ответа: {"@fake":null}

#### GET /config/<id>

Получить значение настройки <id> (строка)

Фильтры: нет

Пример ответа: любой объект

#### POST /config/<id>/update

Обновление настройки <id> (строка)

Вход: любой объект

Пример ответа: {"status":200}

#### GET /folders

Получить список всех папок (вложенность 2) на всех дисках на компе

Пример ответа: ["C:\\$Recycle.Bin","C:\\$Recycle.Bin\\S-1-5-18","C:\\$Recycle.Bin\\S-1-5-21-2694871980-912659526-3867092587-1000","C:\\_del","C:\\AIR","C:\\ASTRO",....]

#### GET /alias

Получить список алиасов фильтров

Фильтры: при задании фильтра names, то есть запрос GET /alias?names выдаёт стандартный список имён фильтров, например: ["L","R","G","B","HA","O3","S2","RGB"]

Пример ответа: {"RGB":"RGB","Blue":"B","Green":"G","H-alpha":"HA","Red":"R","ha":"HA","OIII":"O3","o3":"O3","Light":"L","Luminance":"L","H-a":"HA","S2":"S2","s2":"S2","clean":"L","Oiii":"O3","G":"G"}

#### POST /alias

Пакетное обновление алиасов фильтров

Вход: см. выход из GET /alias

Пример ответа: {"status":200,"updated":16}