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}