Terus ke kandungan
solat.my

Home Assistant

Integrasi Waktu Solat Malaysia untuk Home Assistant

Custom component ini memaparkan waktu solat Malaysia terus dalam Home Assistant. Anda boleh gunakannya untuk automasi azan, papan pemuka dan tukar zon tanpa restart.

Ciri-ciri

  • 18 entiti dibuat secara automatik, termasuk sensor waktu solat, tarikh Hijri, zon, pemain media azan dan mod pengumuman
  • Semua 59 zon JAKIM di seluruh Malaysia
  • Tukar zon bila-bila masa, dan semua sensor dikemas kini serta-merta tanpa restart
  • Boleh tambah lebih daripada satu peranti, contohnya "Rumah" dan "Pejabat"
  • Tetapan melalui UI, tidak perlu edit YAML
  • Pilih mod pengumuman azan: suara TTS Google Translate atau rakaman MP3 sendiri

Pemasangan

DisyorkanMelalui HACS
  1. 1Dalam HACS, pergi ke Integrations → menu tiga titik → Custom repositories
  2. 2Tambah URL repositori ini dan pilih kategori Integration:
    https://github.com/mysolat/homeassistant
  3. 3Cari “Waktu Solat Malaysia” dalam HACS dan klik Download
  4. 4Restart Home Assistant
Pemasangan Manual
  1. 1Muat turun atau klon repositori dari GitHub
  2. 2Salin folder custom_components/solat_my/ ke dalam direktori config/custom_components/
  3. 3Restart Home Assistant

Konfigurasi

  1. 1Pergi ke Settings → Devices & Services → Add Integration
  2. 2Cari “Waktu Solat Malaysia”
  3. 3Masukkan Nama Peranti, contohnya Waktu Solat. Nama ini jadi prefix bagi ID entiti.
  4. 4Pilih zon anda, contohnya SGR01 — Selangor
  5. 5Klik Submit. Semua 18 entiti akan terus muncul.
Untuk tukar zon kemudian, ubah entiti Zon di halaman peranti. Semua sensor dikemas kini serta-merta, tanpa restart.

Entiti yang Dibuat

Sensor Waktu Solat
ID EntitiNamaKeterangan
sensor.waktu_solat_imsakImsakWaktu Imsak (timestamp)
sensor.waktu_solat_subuhSubuhWaktu Subuh (timestamp)
sensor.waktu_solat_syurukSyurukWaktu Syuruk (timestamp)
sensor.waktu_solat_dhuhaDhuhaWaktu Dhuha (timestamp)
sensor.waktu_solat_zohorZohorWaktu Zohor (timestamp)
sensor.waktu_solat_asarAsarWaktu Asar (timestamp)
sensor.waktu_solat_maghribMaghribWaktu Maghrib (timestamp)
sensor.waktu_solat_isyakIsyakWaktu Isyak (timestamp)
sensor.waktu_solat_tarikh_hijriTarikh HijriTarikh Hijri, nama bulan dalam bahasa Melayu
sensor.waktu_solat_waktu_solat_seterusnyaWaktu Solat SeterusnyaWaktu solat seterusnya, dengan kiraan detik
sensor.waktu_solat_waktu_solat_semasaWaktu Solat SemasaWaktu solat yang sedang berjalan
Entiti Konfigurasi
ID EntitiNamaKeterangan
select.waktu_solat_zonZonZon semasa. Tukar zon ini untuk kemas kini semua sensor serta-merta.
select.waktu_solat_pemain_media_azanPemain Media AzanPemain media yang memainkan azan
select.waktu_solat_mod_pengumuman_azanMod Pengumuman Azantts (Google Translate) atau audio (rakaman MP3)
number.waktu_solat_kelantangan_azanKelantangan AzanKelantangan azan (0.0–1.0)
text.waktu_solat_fail_audio_azanFail Audio AzanNama fail azan, dipisahkan dengan koma
text.waktu_solat_fail_audio_azan_subuhFail Audio Azan SubuhNama fail azan Subuh, dipisahkan dengan koma
text.waktu_solat_fail_doa_selepas_azanFail Doa Selepas AzanNama fail audio doa selepas azan

Contoh Papan Pemuka

Panduan Papan Pemuka
Kad Entiti Waktu Solat (YAML)
type: entities
title: Waktu Solat
entities:
  - entity: sensor.waktu_solat_waktu_solat_semasa
    name: Waktu Semasa
  - entity: sensor.waktu_solat_waktu_solat_seterusnya
    name: Waktu Seterusnya
  - entity: sensor.waktu_solat_imsak
    name: Imsak
    format: time
  - entity: sensor.waktu_solat_subuh
    name: Subuh
    format: time
  - entity: sensor.waktu_solat_zohor
    name: Zohor
    format: time
  - entity: sensor.waktu_solat_asar
    name: Asar
    format: time
  - entity: sensor.waktu_solat_maghrib
    name: Maghrib
    format: time
  - entity: sensor.waktu_solat_isyak
    name: Isyak
    format: time
  - entity: sensor.waktu_solat_tarikh_hijri
    name: Tarikh Hijri

Contoh Automasi Azan

Panduan Automasi
Azan Harian (YAML)
alias: "Azan Harian"
description: "Play azan for all prayer times via solat.my integration"
mode: single
triggers:
  - trigger: time
    at: sensor.waktu_solat_subuh
    id: subuh
  - trigger: time
    at: sensor.waktu_solat_zohor
    id: zohor
  - trigger: time
    at: sensor.waktu_solat_asar
    id: asar
  - trigger: time
    at: sensor.waktu_solat_maghrib
    id: maghrib
  - trigger: time
    at: sensor.waktu_solat_isyak
    id: isyak
conditions: []
actions:
  # Persistent notification
  - action: persistent_notification.create
    data:
      notification_id: solat_azan
      title: >
        🕋 Waktu Solat —
        {% set tid = trigger.id if trigger is defined else states('sensor.waktu_solat_waktu_solat_semasa') | lower %}
        {% set names = {'subuh': 'Subuh', 'syuruk': 'Syuruk', 'zohor': 'Zohor', 'asar': 'Asar', 'maghrib': 'Maghrib', 'isyak': 'Isyak'} %}
        {{ names.get(tid, 'Zohor') }}
      message: >
        {% set tid = trigger.id if trigger is defined else states('sensor.waktu_solat_waktu_solat_semasa') | lower %}
        {% set names = {'subuh': 'Subuh', 'syuruk': 'Syuruk', 'zohor': 'Zohor', 'asar': 'Asar', 'maghrib': 'Maghrib', 'isyak': 'Isyak'} %}
        {{ now().strftime('%-I:%M %p') }} — Sekarang telah masuk waktu
        {{ names.get(tid, 'Zohor') }} bagi kawasan ini dan kawasan yang sama waktu dengannya.

  # Mobile push notification
  - action: notify.notify
    data:
      title: >
        🕋 Waktu Solat —
        {% set tid = trigger.id if trigger is defined else states('sensor.waktu_solat_waktu_solat_semasa') | lower %}
        {% set names = {'subuh': 'Subuh', 'syuruk': 'Syuruk', 'zohor': 'Zohor', 'asar': 'Asar', 'maghrib': 'Maghrib', 'isyak': 'Isyak'} %}
        {{ names.get(tid, 'Zohor') }}
      message: >
        {% set tid = trigger.id if trigger is defined else states('sensor.waktu_solat_waktu_solat_semasa') | lower %}
        {% set names = {'subuh': 'Subuh', 'syuruk': 'Syuruk', 'zohor': 'Zohor', 'asar': 'Asar', 'maghrib': 'Maghrib', 'isyak': 'Isyak'} %}
        {{ now().strftime('%-I:%M %p') }} — Sekarang telah masuk waktu {{ names.get(tid, 'Zohor') }}.

  # Set volume — skipped if media player does not support it (e.g. TV)
  - if:
      - condition: template
        value_template: >
          {{ state_attr(states('select.waktu_solat_pemain_media_azan'), 'supported_features') | int(0) | bitwise_and(4) > 0 }}
    then:
      - action: media_player.volume_set
        target:
          entity_id: "{{ states('select.waktu_solat_pemain_media_azan') }}"
        data:
          volume_level: "{{ states('number.waktu_solat_kelantangan_azan') | float }}"

  # Announcement — TTS or pre-recorded audio based on user setting
  - choose:
      - conditions:
          - condition: template
            value_template: >
              {{ states('select.waktu_solat_mod_pengumuman_azan') == 'audio' }}
        sequence:
          - action: media_player.play_media
            target:
              entity_id: "{{ states('select.waktu_solat_pemain_media_azan') }}"
            data:
              media:
                media_content_type: audio/mp3
                media_content_id: >
                  {% set tid = trigger.id if trigger is defined else states('sensor.waktu_solat_waktu_solat_semasa') | lower %}
                  media-source://media_source/local/tts/tts_{{ tid }}.mp3
                metadata: {}
          - delay: "00:00:10"
    default:
      - action: tts.google_translate_say
        data:
          entity_id: "{{ states('select.waktu_solat_pemain_media_azan') }}"
          language: id
          message: >
            {% set tid = trigger.id if trigger is defined else states('sensor.waktu_solat_waktu_solat_semasa') | lower %}
            {% set names = {'subuh': 'Subuh', 'syuruk': 'Syuruk', 'zohor': 'Zohor', 'asar': 'Asar', 'maghrib': 'Maghrib', 'isyak': 'Isyak'} %}
            Sekarang telah masuk waktu {{ names.get(tid, 'Zohor') }}.
      - delay: "00:00:10"

  # Play azan audio (random selection from text entity)
  - action: media_player.play_media
    target:
      entity_id: "{{ states('select.waktu_solat_pemain_media_azan') }}"
    data:
      extra:
        title: >
          {% set tid = trigger.id if trigger is defined else states('sensor.waktu_solat_waktu_solat_semasa') | lower %}
          {% set names = {'subuh': 'Subuh', 'syuruk': 'Syuruk', 'zohor': 'Zohor', 'asar': 'Asar', 'maghrib': 'Maghrib', 'isyak': 'Isyak'} %}
          Azan {{ names.get(tid, 'Zohor') }}
        thumb: "https://solat.my/icon-512.png"
      media:
        media_content_type: audio/mp3
        media_content_id: >
          {% set tid = trigger.id if trigger is defined else states('sensor.waktu_solat_waktu_solat_semasa') | lower %}
          {% if tid == 'subuh' %}
            {{ "media-source://media_source/local/azan/" ~ states('text.waktu_solat_fail_audio_azan_subuh').split(', ') | random | trim }}
          {% else %}
            {{ "media-source://media_source/local/azan/" ~ states('text.waktu_solat_fail_audio_azan').split(', ') | random | trim }}
          {% endif %}
        metadata: {}

  # Wait for azan to finish, then play doa
  - choose:
      - conditions:
          - condition: template
            value_template: >
              {% set tid = trigger.id if trigger is defined else states('sensor.waktu_solat_waktu_solat_semasa') | lower %}
              {{ tid == 'subuh' }}
        sequence:
          - delay:
              minutes: 4
              seconds: 30
    default:
      - delay:
          minutes: 2
          seconds: 47

  # Play doa selepas azan
  - action: media_player.play_media
    alias: "Doa Selepas Azan"
    target:
      entity_id: "{{ states('select.waktu_solat_pemain_media_azan') }}"
    data:
      media:
        media_content_id: media-source://media_source/local/azan/doa_selepas_azan.mp3
        media_content_type: audio/mpeg
        metadata:
          title: doa_selepas_azan.mp3
          media_class: music

Kod sumber ada di GitHub. Laporkan masalah atau hantar pull request di sana.

github.com/mysolat/homeassistant →