Home Assistant

Connect CALinONE with Home Assistant and automate your smart home based on your appointments and shifts.

🔗

What does the integration do?

CALinONE comes with its own Home Assistant integration (installable via HACS). It automatically creates a calendar and matching sensors — you don't need to configure anything manually:

  • Real HA entities: calendar and sensors survive restarts, roll over to the new day at midnight by themselves, and keep working even when the app is closed or your phone is off.
  • Always up to date: the app sends every change straight to Home Assistant — the integration does the rest.

This lets you build automations like:

  • Ramp up the heating at 5 AM, but only when you're working
  • Turn off the lights at 9:30 PM when you have an early shift tomorrow
  • Get a reminder 30 minutes before your next appointment
  • Mute phone notifications while you're on vacation

Setup — three steps

1. Install the integration (HACS)

The button opens HACS directly in your Home Assistant and suggests adding the CALinONE repository:

Or manually: in HACS, add the URL https://github.com/Igeling/CALinONE-HomeAssistant under Custom repositories (type “Integration”), install “CALinONE” and restart Home Assistant.

2. Add the integration

There's a shortcut for this too — the button starts the setup dialog directly in your Home Assistant:

Or manually:

  1. Go to Settings → Devices & Services → Add Integration and search for “CALinONE”
  2. Confirm the dialog — Home Assistant shows you a webhook URL (e.g. https://your-ha:8123/api/webhook/abc123…)
  3. Copy this URL

3. Connect the app

  1. Activate CALinONE Pro in the app (the HA integration is a Pro feature)
  2. Open CALinONE → Settings → Home Assistant and paste the webhook URL
  3. Tap “Test connection” — the app verifies the connection and immediately sends your complete schedule

That's it! No further configuration needed.

🔄

How synchronization works

  • Direction: App → HA only (one way). Changes in HA are not written back to the app.
  • Timing: Immediately on every change (briefly batched, ~2 seconds) — including when applying entire rotations.
  • Full snapshot: The app always sends your complete schedule in a rolling window (3 months back to 12 months ahead, including appointments); the integration fully replaces the previous state. No duplicates, no stale entries.
  • Independent of the app: The integration stores the schedule in Home Assistant and computes all sensor values itself — across restarts and midnight.
  • Trigger your own automations: whenever new schedule data arrives you can react to it directly in Home Assistant — the integration provides a matching trigger for it (event calinone_updated).
📡

Which entities are created

The integration provides all entities automatically; display names follow your Home Assistant language, the entity IDs are fixed:

Entity IDWhat it showsExample
calendar.calinoneAll shifts, vacations and appointments as a calendar
sensor.calinone_current_shiftToday's shift (or off)Early shift
sensor.calinone_shift_startShift start today (else -)06:00
sensor.calinone_shift_endShift end today (else -)14:00
sensor.calinone_shift_durationShift duration today in hours (night shifts handled correctly)8.0
sensor.calinone_next_shiftShift/vacation tomorrow (or off)Late shift
sensor.calinone_next_appointmentNext appointment today — automatically advances after an appointment starts (else off)Dentist
sensor.calinone_appointment_categoryCategory of that appointment (- = no category, off = no appointment)Doctor
binary_sensor.calinone_work_dayOn = work day today (off on vacation days)on
binary_sensor.calinone_vacation_todayOn = vacation/absence todayoff

This is what entries look like in the calendar:

Entry typeDisplayExample
ShiftShort name – shift name (timed if times are set)F – Early shift
Vacation/absenceEmoji + vacation type (all-day)🏖 Vacation
AppointmentEmoji + time + title (+ location)📌 14:00 Meeting

The sensors are always up to date — you can use them directly in any automation. Four examples:

Example 1: Ramp up heating when you're working

Goal: At 5 AM the heating should go to 22°C — but only on work days.

  1. Settings → Automations → Create Automation
  2. Trigger: Time → 05:00:00
  3. Condition: State → Entity: binary_sensor.calinone_work_day → State: on
  4. Action: climate: set_temperature → Entity: your thermostat → Temperature: 22

Example 2: Turn lights off earlier before an early shift

Goal: If you have to get up early tomorrow, the bedroom light turns off at 9:30 PM.

  1. Trigger: Time → 21:30:00
  2. Condition: State → Entity: sensor.calinone_next_shift → State: Early shift (exactly the shift name from CALinONE)
  3. Action: light: turn_offlight.bedroom

Example 3: No phone notifications on vacation

  1. Trigger: State changed → Entity: binary_sensor.calinone_vacation_today → To: on
  2. Action: Send a notification to your phone

Example 4: Reminder 30 minutes before your next appointment

As a template trigger (YAML mode):

trigger:
  - platform: template
    value_template: >
      {% set t = state_attr('sensor.calinone_next_appointment', 'time') %}
      {{ t not in ['-', none] and
         now().strftime('%H:%M') == (today_at(t) - timedelta(minutes=30)).strftime('%H:%M') }}
action:
  - service: notify.mobile_app_your_phone
    data:
      title: "Appointment in 30 minutes"
      message: "{{ states('sensor.calinone_next_appointment') }} at {{ state_attr('sensor.calinone_next_appointment', 'time') }}"

You can also use the CALinONE calendar directly in automations.

Check whether an entry is currently active

In a condition: State → Entity: calendar.calinone → State: on

Check whether it's a specific shift

In a template condition (YAML mode):

{{ state_attr('calendar.calinone', 'message') == 'F – Early shift' }}

You can also use calendar triggers (Trigger → Calendar → calendar.calinone → “Event starts/ends”, optionally with an offset) — handy for “X minutes before a shift starts”.

TemplateResultExplanation
{{ states('sensor.calinone_current_shift') }}Early shift or offYou're working this shift today
{{ states('sensor.calinone_shift_start') }}06:00 or -Shift start today
{{ states('sensor.calinone_shift_end') }}14:00 or -Shift end today
{{ states('sensor.calinone_shift_duration') | float }}8.0Shift duration today (hours)
{{ states('sensor.calinone_next_shift') }}Late shift or offWhat's up tomorrow
{{ states('sensor.calinone_next_appointment') }}Dentist or offNext appointment today
{{ state_attr('sensor.calinone_next_appointment', 'time') }}14:00 or -Time of the appointment
{{ state_attr('sensor.calinone_next_appointment', 'location') }}Main St 5Location of the appointment
{{ states('sensor.calinone_appointment_category') }}Doctor, - or offCategory of the appointment
{{ is_state('binary_sensor.calinone_work_day', 'on') }}true/falseWork day today?
{{ is_state('binary_sensor.calinone_vacation_today', 'on') }}true/falseOn vacation today?
{{ state_attr('sensor.calinone_current_shift', 'short_name') }}FShort name of the shift
{{ states('calendar.calinone') }}on/offon = an entry is currently active

Download the YAML file with ready-made example automations (heating before shift start, lights off before an early shift, vacation mode and more). Copy the sections you want into your configuration.yaml or store the file as a package — and adapt the entities (thermostat, light, phone) and shift names to your CALinONE configuration.

  • The webhook URL contains a random ID and is like a password — don't share it publicly.
  • Need a new URL? Remove the integration in Home Assistant and add it again — the old one becomes invalid.
ProblemWhat you can do
“Test connection” failsCopied the webhook URL completely? Is the CALinONE integration installed and added in HA? Is Home Assistant reachable from your phone (same URL as in the browser)?
“CALinONE” doesn't appear under “Add Integration”Restart Home Assistant after installing via HACS.
Sensors show unavailableThe app has never pushed yet. Tap “Test connection” in the app — this immediately sends the complete schedule.
Values seem outdatedOpen the sync status in the app (cloud icon) → “Sync now”.
Lost the webhook URLRemove and re-add the integration in HA — a new URL is shown (update it in the app).
An automation doesn't react to the shift nameShift names in conditions must match CALinONE exactly (e.g. “Early shift”, not “Early shift F”).