Инструкции

Подробные руководства по PRO-функциям: синхронизация, партнёры и Home Assistant.

☁️

Облачная синхронизация

Настройки Синхронизация Аккаунт

Зарегистрируйтесь один раз — и ваш график автоматически сохраняется в облаке. Установите приложение на второй телефон или планшет, войдите в тот же аккаунт и скачайте данные. Всё синхронизировано.

Аккаунт — тёмная тема Аккаунт — светлая тема
  1. Откройте Настройки → Синхронизация → Аккаунт.
  2. Нажмите Войти и введите email и пароль. Если аккаунта нет — нажмите Зарегистрироваться.
  3. После входа ваши данные загрузятся в облако автоматически. Дата последней синхронизации отображается под email.
  4. На втором устройстве войдите в тот же аккаунт и нажмите Скачать из облака — данные появятся мгновенно.
  5. Используйте Синхронизировать сейчас, чтобы вручную загрузить свежие данные с устройства в облако.
Совет: Если на двух устройствах разные данные — нажмите Скачать из облака на том, которое нужно обновить. Это заменит локальные данные облачными.

👥

Партнёры

Настройки Синхронизация Партнёры

Добавьте коллегу или члена семьи как партнёра — и видите его выходные прямо на своём календаре. Дни, когда вы оба отдыхаете, выделяются цветным маркером снизу.

Партнёры — тёмная тема Партнёры — светлая тема
  1. Оба пользователя должны иметь PRO и быть авторизованы в приложении.
  2. Первый пользователь открывает экран Партнёров и нажимает Скопировать под своим кодом — код попадает в буфер обмена. Отправьте этот код партнёру любым удобным способом: мессенджер, SMS и т.д.
  3. Второй пользователь вставляет код в поле Код партнёра, при желании вводит никнейм и нажимает Добавить.
  4. Партнёр появится в списке. Чекбокс слева включает и выключает отображение его расписания на вашем календаре.
  5. На календаре дни, когда все активные партнёры тоже отдыхают, получают жёлтый маркер снизу — сразу видно, когда у всех выходной.
Совет: Добавьте партнёра с никнеймом — например «Катя» или «Напарник». Никнейм отображается в строках расписания рядом с каждым его выходным.

🌙

Смены день/ночь

Настройки Расписание Тип смен день/ночь

Если в вашем цикле чередуются дневные и ночные смены, используйте редактор день/ночь. Каждому слоту цикла можно задать тип: Дневная, Ночная или Выходной. В списке дней ночные смены отображаются со значком 🌙.

  1. Откройте Настройки → Расписание и настройте базовый цикл (якорная дата, количество рабочих и выходных дней).
  2. Нажмите кнопку Тип смен день/ночь — откроется редактор слотов цикла.
  3. Каждый слот представлен кнопкой с номером. Нажмите на слот, чтобы переключить его тип: День → Ночь → Выходной → День…
  4. Настройте время начала дневной и ночной смены: поля Начало дневной и Начало ночной внизу экрана (формат ЧЧ:ММ).
  5. Нажмите Применить — цикл сохранится, календарь пересчитается.
Пример для графика 2/2 с чередованием: слот 1 — День, слот 2 — Ночь, слот 3 — Выходной, слот 4 — Выходной. Каждая четвёртая смена ночная автоматически.

Будильники бета

Настройки Расписание Будильники

Приложение расставляет системные будильники на ближайшие рабочие дни — за указанное количество минут до начала смены. Будильники обновляются автоматически при изменении статуса дня.

  1. Откройте Настройки → Расписание → Будильники.
  2. Нажмите Будильники: выкл., чтобы включить их. Кнопка станет активной.
  3. Настройте Заранее (минуты) — за сколько минут до смены сработает будильник. Нажмите на значение в центре, чтобы ввести число вручную, или используйте кнопки и + (удерживайте для быстрого изменения).
  4. Выберите горизонт: 7, 14 или 30 дней вперёд — на сколько дней расставлять будильники.
  5. Нажмите Установить будильники. В списке дней рядом с рабочими сменами появится значок 🔔.
Важно: На Android 12 и выше приложение запросит разрешение на точные будильники (Батарея → Будильники и напоминания). Без этого разрешения будильники не сработают вовремя.

Своя мелодия: откройте Настройки телефона → Приложения → ShiftSchedule → Уведомления. Там вы увидите два отдельных канала — Будильники смен и Напоминания. Для каждого можно выбрать свою мелодию, вибрацию и громкость.

Функция в тестировании. Если будильник не сработал, отработал не в то время или вы нашли другую проблему — напишите нам на mirorstar@yandex.ru или в канал MAX. Ваш отзыв поможет сделать будильники надёжнее.

🏠

Home Assistant

Настройки Синхронизация Home Assistant

Передавайте статус текущего дня в Home Assistant как сенсор. Используйте его в автоматизациях: включайте будильник в рабочие дни, меняйте освещение в выходные, отправляйте уведомления.

Home Assistant — тёмная тема Home Assistant — светлая тема
  1. В Home Assistant откройте Профиль → Долгосрочные токены доступа и создайте новый токен. Скопируйте его — он отображается один раз.
  2. В приложении откройте Настройки → Синхронизация → Home Assistant.
  3. Введите URL вебхука в формате:
    http://192.168.1.100:8123/api/webhook/shift_schedule
    или для внешнего доступа:
    https://myhome.duckdns.org/api/webhook/shift_schedule
    Где shift_schedule — это webhook_id из пакета.
  4. Вставьте скопированный токен доступа в соответствующее поле.
  5. Задайте имя сенсора (например, shift_schedule). В HA он появится как sensor.shift_schedule.
  6. Нажмите Сохранить. Состояние сенсора будет обновляться при каждом открытии приложения и при смене даты.
Пример автоматизации: триггер — sensor.shift_schedule меняет состояние на work, действие — включить умный будильник. Или наоборот: при day_off — выключить.

Готовый пакет для Home Assistant

Ниже — справочный пакет с нужными сущностями, автоматизацией и сенсорами. Скопируйте его себе и настройте под свои нужды.

Шаг 1 — разрешите пакеты в configuration.yaml

# configuration.yaml
homeassistant:
  packages: !include_dir_named packages

Шаг 2 — сохраните файл как packages/shift_schedule.yaml

# packages/shift_schedule.yaml
# Справочный пакет ShiftSchedule для Home Assistant.
# Создаёт сущности, принимает данные через вебхук и формирует русскоязычные сенсоры.

shift_schedule:
  input_text:
    shift_today_status:
      name: Shift Today Status
      max: 50
      icon: mdi:calendar-today
    shift_tomorrow_status:
      name: Shift Tomorrow Status
      max: 50
      icon: mdi:calendar-arrow-right
    shift_next_work_date:
      name: Shift Next Work Date
      max: 50
      icon: mdi:calendar-check
    shift_next_work_status:
      name: Shift Next Work Status
      max: 50
      icon: mdi:briefcase-clock
    shift_last_update:
      name: Shift Last Update
      max: 80
      icon: mdi:clock-check

  input_boolean:
    shift_work_today:
      name: Shift Work Today
      icon: mdi:briefcase
    shift_work_tomorrow:
      name: Shift Work Tomorrow
      icon: mdi:briefcase-clock

  automation:
    - alias: Shift Schedule Webhook
      id: shift_schedule_webhook
      mode: restart
      trigger:
        - platform: webhook
          webhook_id: shift_schedule  # можно заменить на любое уникальное название
          allowed_methods:
            - POST
      action:
        - service: input_text.set_value
          target:
            entity_id: input_text.shift_today_status
          data:
            value: "{{ trigger.json.today_status | default('unknown') }}"
        - service: input_text.set_value
          target:
            entity_id: input_text.shift_tomorrow_status
          data:
            value: "{{ trigger.json.tomorrow_status | default('unknown') }}"
        - service: input_text.set_value
          target:
            entity_id: input_text.shift_next_work_date
          data:
            value: "{{ trigger.json.next_work_date | default('') }}"
        - service: input_text.set_value
          target:
            entity_id: input_text.shift_next_work_status
          data:
            value: "{{ trigger.json.next_work_status | default('') }}"
        - service: input_text.set_value
          target:
            entity_id: input_text.shift_last_update
          data:
            value: "{{ trigger.json.updated_at | default('') }}"
        - choose:
            - conditions: "{{ trigger.json.is_work_today | default(false) }}"
              sequence:
                - service: input_boolean.turn_on
                  target:
                    entity_id: input_boolean.shift_work_today
          default:
            - service: input_boolean.turn_off
              target:
                entity_id: input_boolean.shift_work_today
        - choose:
            - conditions: "{{ trigger.json.is_work_tomorrow | default(false) }}"
              sequence:
                - service: input_boolean.turn_on
                  target:
                    entity_id: input_boolean.shift_work_tomorrow
          default:
            - service: input_boolean.turn_off
              target:
                entity_id: input_boolean.shift_work_tomorrow

  template:
    - sensor:
        - name: Shift Today Status RU
          unique_id: shift_today_status_ru
          state: >
            {% set map = {'Work':'Работа','Rest':'Выходной','Extra':'Подработка','Vacation':'Отпуск','Sick':'Больничный'} %}
            {{ map.get(states('input_text.shift_today_status'), states('input_text.shift_today_status')) | trim }}
          icon: >
            {% set s = states('input_text.shift_today_status') %}
            {% if s == 'Work' %}mdi:briefcase
            {% elif s == 'Extra' %}mdi:briefcase-plus
            {% elif s == 'Vacation' %}mdi:beach
            {% elif s == 'Sick' %}mdi:medical-bag
            {% else %}mdi:sofa{% endif %}

        - name: Shift Tomorrow Status RU
          unique_id: shift_tomorrow_status_ru
          state: >
            {% set map = {'Work':'Работа','Rest':'Выходной','Extra':'Подработка','Vacation':'Отпуск','Sick':'Больничный'} %}
            {{ map.get(states('input_text.shift_tomorrow_status'), states('input_text.shift_tomorrow_status')) | trim }}
          icon: >
            {% set s = states('input_text.shift_tomorrow_status') %}
            {% if s == 'Work' %}mdi:briefcase
            {% elif s == 'Extra' %}mdi:briefcase-plus
            {% elif s == 'Vacation' %}mdi:beach
            {% elif s == 'Sick' %}mdi:medical-bag
            {% else %}mdi:sofa{% endif %}

        - name: Shift Next Work Status RU
          unique_id: shift_next_work_status_ru
          state: >
            {% set map = {'Work':'Работа','Rest':'Выходной','Extra':'Подработка','Vacation':'Отпуск','Sick':'Больничный'} %}
            {{ map.get(states('input_text.shift_next_work_status'), states('input_text.shift_next_work_status')) | trim }}
          icon: >
            {% set s = states('input_text.shift_next_work_status') %}
            {% if s == 'Work' %}mdi:briefcase
            {% elif s == 'Extra' %}mdi:briefcase-plus
            {% elif s == 'Vacation' %}mdi:beach
            {% elif s == 'Sick' %}mdi:medical-bag
            {% else %}mdi:sofa{% endif %}

        - name: Shift Next Work Date RU
          unique_id: shift_next_work_date_ru
          icon: mdi:calendar-arrow-right
          state: >
            {% set d = states('input_text.shift_next_work_date') %}
            {% if d and d | length == 10 %}
              {% set today = now().strftime('%Y-%m-%d') %}
              {% set tomorrow = (now() + timedelta(days=1)).strftime('%Y-%m-%d') %}
              {% set day_after = (now() + timedelta(days=2)).strftime('%Y-%m-%d') %}
              {% if d == today %}Сегодня
              {% elif d == tomorrow %}Завтра
              {% elif d == day_after %}Послезавтра
              {% else %}
                {% set parts = d.split('-') %}
                {% set months = ['января','февраля','марта','апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря'] %}
                {{ parts[2] | int }} {{ months[parts[1] | int - 1] }}
              {% endif %}
            {% else %}—{% endif %}

Шаг 3 — перезапустите Home Assistant

  1. Перезапустите HA: Настройки → Система → Перезапустить.
  2. Проверьте, что появились сущности input_text.shift_today_status и другие.
  3. В приложении укажите URL вашего HA и webhook_id из пакета (shift_schedule по умолчанию).
  4. Откройте приложение — данные придут в HA автоматически.