Kenalan pertama dengan Asisten Rumah


Home Assistant adalah aplikasi open source yang populer untuk mengatur rumah pintar. Pengalaman pertama penulis dengan Home Assistant didasarkan pada upaya untuk mengintegrasikan penanak nasi pintar ke dalamnya. Penulis akan mencoba menggambarkan komponen utama dan fitur dari aplikasi ini, yang ia punya kesempatan untuk mengenal selangkah demi selangkah. Artikel ini dalam beberapa hal merupakan ulasan, dalam beberapa hal panduan bagi mereka yang ingin memulai berkenalan dengan Home Assistant.

Bagi mereka yang memiliki sedikit waktu luang, saya sarankan Anda untuk melewatkan pepatah - bab pertama - dan langsung ke bab kedua. Anda hanya perlu tahu bahwa kami akan bekerja dengan penanak nasi Cina pintar dari Xiaomi.

Penanak nasi pintar

Penanak nasi jelas merupakan penanak nasi. Wiki menunjukkan kepada kita kapal uap beras keramik dari British Museum yang berasal dari tahun 1250 SM Pada tahun 1945, Mitsubishi menjadi perusahaan penanak nasi listrik buatan rumah pertama di Jepang. Model kami - Penanak Nasi dari Xiaomi - tidak hanya bisa memasak nasi. “Ini adalah alat yang hebat untuk membuat tidak hanya nasi, tetapi juga jenis hidangan lainnya. Itu bisa memasak sup, kue kering, dan banyak lagi, ”kata iklan itu. Tetapi yang paling penting adalah kehadiran modul wi-fi, perangkat lunak dengan kemampuan otomasi dan 200+ resep yang dipasang oleh perangkat lunak. "Jalan menuju rumah pintar melalui perut benar," pikir penulis, dan memutuskan.

Xiaomi Rice Cooker, sebagaimana layaknya perangkat digital, secara eksternal sangat menarik, menyenangkan dengan bentuk bulat dan minimalis umum. Untuk mengkonfigurasi dan menggunakannya, pabrikan menawarkan aplikasi Mi Home. Setelah mendaftarkan akun Mi, program ini dengan mudah menemukan perangkat baru, dan Anda mendaftarkannya di jaringan lokal Anda. Antarmuka aplikasi bukan yang terburuk, menyediakan alat otomatisasi dasar, dan dapat menerima pemberitahuan dari perangkat. Namun, ada kelemahan signifikan. Tidak semua orang bisa bahagia dengan mengirimkan informasi kepada pengembang tentang setiap klik pengguna. Dan ekspresi yang tidak menyenangkan sering ditemukan hari ini warna nasional. Alih-alih 200+ resep, hanya empat yang diterjemahkan dan tersedia dalam bahasa asing. Sisanya khusus untuk orang-orang Cina. Ketika penanak nasi "pintar" Anda tidak mampu memenuhi semua tugas kuliner yang dijanjikan, maka, Anda tahu, itu menjadi sedih. Setelah berkeliaran selama beberapa waktu di Internet, seorang penulis sedih menemukan proyek menarik berikutnya (manfaat abadi bagi penulis). Yang ternyata didedikasikan untuk pengembangan modul untuk Home Assistant tertentu.

Asisten rumah

Pertama, beberapa informasi umum. Seperti yang diberitahukan di beranda HA , ”Ini adalah perangkat lunak open source untuk otomatisasi rumah pintar yang berfokus pada manajemen dan privasi lokal. Dikembangkan oleh komunitas penggemar yang terbuka, ini bagus untuk bekerja pada Raspberry Pi atau server lokal. " Proyek ini lebih dari lima tahun, menggunakan python dan lisensi Apache 2.0. Versi rilis pada saat menulis baris ini adalah 0.99.3.

HA menggunakan modul terpisah (integrasi, atau komponen) untuk mengelola perangkat. Membuatnya cukup sederhana. Di situs ini Anda dapat menemukan katalog modul utama (disetujui dan didukung oleh komunitas). Di antara jumlah total mereka (1485 buah), ada yang benar-benar beragam, nama-nama amazon, google, xiaomi, dan bahkan sekali yandex tercantum dalam katalog.
Mari kita coba untuk menginstal HA di lingkungan virtual di desktop Linux. Kami membutuhkan python3 dan manajer paket pip.
python3 -m venv homeassistant #    cd homeassistant source bin/activate #    python3 -m pip install homeassistant #  Home Assistant hass --open-ui #  Home Assistant 

Setelah itu, HA GUI akan tersedia di http: // localhost: 8123 . Saat pertama kali masuk, Anda harus membuat akun pengguna. Antarmuka web HA cukup banyak. Beberapa elemen penting yang layak disebutkan di awal adalah Configuration → General tab, di mana Anda dapat dengan mudah memuat ulang file konfigurasi atau server itu sendiri. Serta halaman Info dalam daftar alat Pengembang, di mana Anda dapat melihat log kesalahan.

HA menyimpan semua data pengguna yang diperlukan, dalam kasus Linux, dalam folder pengaturan “~ / .homeassistant”. File konfigurasi ditulis dalam format YAML , dan yang utama adalah "configuration.yaml". Ini menggabungkan data modul, otomatisasi, dll. Fitur impor memungkinkan Anda untuk membagi pengaturan menjadi file-file terpisah yang diatur secara logis. Modul disimpan dalam subfolder "komponen" (built-in) dan "custom_components".

Pengetahuan ini seharusnya cukup bagi kita untuk menginstal modul baru. Salin folder "xiaomi_cooker" dari repositori kami ke "~ / .homeassistant / custom_components" kami. Menurut deskripsi, tambahkan pengaturan modul ke file "configuration.yaml":
configuration.yaml
 xiaomi_cooker: #   name: 'Akari' #   host: 192.168.1.10 # IP   token: '4921def609273302248d040a24243a25' #   Xiaomi model: chunmi.cooker.normal2 #   


Selesai Setelah HA reboot, entri modul baru akan muncul di bagian Umum → Integrasi pada antarmuka web.

Modul apa pun adalah sekumpulan objek (entitas) dan layanan tertentu (layanan, pada dasarnya - fungsi). Objek menyimpan berbagai data yang diterima dari perangkat. Misalnya, sensor.xiaomi_cooker_temperature adalah suhu penanak nasi, sun.sun adalah posisi matahari. Data suatu objek diekspresikan oleh satu nilai dasar - status (keadaan), dan sekumpulan atribut tambahan (atribut) yang berubah-ubah. Layanan digunakan untuk mentransfer perintah dan nilai ke perangkat. Misalnya, xiaomi_cooker.start - perintah untuk memulai pengoperasian penanak nasi, atau homeassistant.check_config - inisialisasi pencarian kesalahan dalam file pengaturan HA. Daftar Alat Pengembang antarmuka web berisi bagian Layanan, di mana Anda dapat melihat daftar layanan yang tersedia untuk Anda dan bermain dengan panggilan mereka. Terdekat adalah bagian Amerika, di mana, karenanya, Anda dapat melihat dan mengubah nilai objek. Perlu dicatat bahwa perubahan dalam nilai-nilai objek di bagian Amerika adalah satu sisi. Yaitu jika, misalnya, Anda mengubah status objek lights.state dari mati menjadi aktif, ini tidak akan memengaruhi status sebenarnya dari perangkat, dan saat berikutnya data dari perangkat diperbarui, nilai objek akan ditimpa secara nyata.

Otomasi

Alat manajemen utama untuk rumah pintar adalah otomatisasi . Anda dapat menambahkan dan mengeditnya menggunakan antarmuka grafis di bagian Umum → Otomasi atau langsung di file “automations.yaml”. Fungsi utama otomatisasi adalah untuk memanggil layanan ketika kondisi tertentu terpenuhi. Alat dasar untuk mengatur kondisi untuk memanggil nilai objek, termasuk. data waktu. Ada solusi yang sedikit lebih spesifik, seperti acara. Sebagai contoh otomatisasi sederhana, kami akan memberikan kode yang memperbarui data plus penulis dengan jangka waktu 15 menit:
automations.yaml
  - id: '1565889970818' # ID  alias: Umpiro decharging #  trigger: #   - platform: time_pattern #   -  minutes: /15 #   (   –    15 ) condition: [] #    action: #    - data: # ,     entity_id: sensor.umpiro_charge #  (: ) service: homeassistant.update_entity #    


Perlu dicatat bahwa sejauh ini tidak semua otomatisasi yang tersedia (misalnya, di atas) dapat dikonfigurasi tanpa mengedit kode yaml melalui antarmuka grafis, tetapi pengembang mengatakan mereka secara aktif bekerja untuk menghilangkan kekurangan ini.

Templating

Setelah otomatisasi, saatnya berbicara tentang template (templating). Berbagai elemen pengaturan dalam file yaml memungkinkan Anda untuk menggunakan sisipan dalam bahasa scripting jinja2 . Banyak dari elemen ini disatukan oleh nama umum 'Templat', seperti service_template atau trigger_template. Menggunakan templat, kami mendapatkan akses ke nilai-nilai objek dalam HA dan kemampuan untuk menggunakan data ini dalam ekspresi matematika dan logis yang kompleks, yang sangat memperluas potensi kami. Sebagai contoh, mari kita ambil kode sensor.umpiro_charge yang sedikit lebih rumit yang dituliskan di "configuration.yaml". Ini adalah template_sensor , yaitu "sensor yang membentuk data berdasarkan nilai-nilai objek lain". Sensor kami akan berupa analog dari baterai yang secara bertahap kosong:
configuration.yaml
 sensor: #   platform: template #   -  sensors: #   #   – sensor.umpiro_charge umpiro_charge: #      UI () unit_of_measurement: '%' # ,    value_template: >- #    –   'int' # +     {% if states('sensor.umpiro_charge')|int('unknown') is number %} #       #         {% set value = (states('sensor.umpiro_charge')|int - (as_timestamp(now()) - as_timestamp(states.sensor.umpiro_charge.last_updated))/60/15)|round %} #       {{ [[0, value]|max, 100]|min }} {% else %} # ,  HA   #      {{ 'unknown' }} {% endif %} # ID  ,     #      entity_id: [] friendly_name: 'Charge' #   #      UI () device_class: battery 


Kami membiarkan entitas_id kosong karena kami telah menambahkan otomatisasi yang secara independen akan menyebabkan pembaruan data objek.

Skrip Python

Pada gilirannya, skrip python adalah alat sederhana untuk membuat layanan baru. Setelah menambahkan baris: "skrip python:" ke "configuration.yaml", semua file dengan ekstensi ".py" yang kita masukkan ke folder "~ / .homeassistant / python_scripts" akan tersedia sebagai layanan dengan nama "python_scripts. < file_name> ”. Kode mereka dieksekusi di lingkungan yang telah ditentukan, di mana data dan variabel memiliki memberi kita akses ke argumen ke panggilan layanan, serta objek dan layanan HA. Sebagai contoh, kami memberikan kode file "charge_set.py" untuk layanan "python_scripts.charge_set". Fungsinya untuk mengatur pengisian baterai kita:
python_scripts / charge_set.py
 #     name = data.get('name', 'sensor.umpiro_charge') #     new_state = data.get('charge', '100') #    attributes = hass.states.get(name).attributes #    hass.states.set(name, new_state, attributes) 



Menciptakan integrasi

Semua yang kami lakukan dengan bantuan templat dan skrip Python, mungkin akan lebih mudah melakukan ini dengan menulis modul terpisah. Seperti yang telah disebutkan, modul tidak resmi disimpan di folder "custom_components". Di masa depan, kita akan membutuhkan objek yang menyimpan informasi tentang resep saat ini untuk penanak nasi kami, dan layanan yang memungkinkan Anda untuk mengubah data ini. Berdasarkan contoh dari dokumentasi, kami akan membuat modul baru untuk ini, "overmind". Langkah pertama adalah file custom_components / overmind / __ init__.py:
custom_components / overmind / __ init__.py
 #     DOMAIN = 'overmind' #       () DEFAULT_RECIPE = { "title": "Habr post", "description": "Post an article on habr.com", "profile": "471822" } #    def setup(hass, config): #    hass.states.set('overmind.current_recipe', 'on', DEFAULT_RECIPE) #       def handle_set(call): #    recipe = call.data.get('recipe', DEFAULT_RECIPE) #   -    hass.states.set('overmind.current_recipe', 'set', recipe) #   hass.services.register(DOMAIN, 'recipe_set', handle_set) return True 


Setelah itu, kami akan melaporkan modul baru ke file konfigurasi "configuration.yaml", menambahkan baris dengan nama modul: "overmind:" ke sana. Masalahnya terpecahkan.

Lovelace ui

Ini adalah nama HA front end yang digunakan. Antarmuka grafis ini, di mana pengguna biasa diundang untuk mengontrol rumah pintar, adalah halaman depan antarmuka web HA. Antarmuka LUI dibentuk dari kartu dari berbagai jenis, yang dapat mencerminkan nilai-nilai objek, berfungsi untuk memanggil fungsi dan tugas lainnya. Kartu dapat didistribusikan pada halaman (tampilan), dengan analogi dengan bookmark browser. Pengaturan mudah diatur melalui antarmuka grafis yang sama, tetapi juga dapat diakses melalui kode yaml, di mana ada juga editor teks bawaan. Saya sarankan Anda melihat halaman https://demo.home-assistant.io/ , di mana ada beberapa contoh pengaturan LUI yang berbeda, dan di mana Anda dapat dengan mudah melihat, mengklik dan memodifikasinya.


Contoh setup GUI

Berbicara tentang kekurangan antarmuka, sayangnya, para pengembang sendiri mengakui bahwa proyek ini mencoba untuk duduk bersamaan di kursi-kursi desktop dan smartphone. LUI, secara default, suka menentukan secara independen lokasi dan ukuran kartu, yang kadang-kadang dapat mengubah halaman yang tampak normal pada monitor menjadi berantakan di layar ponsel cerdas, dan sebaliknya. Ada beberapa alat sederhana untuk merampingkan antarmuka, tetapi mereka, menurut pengalaman saya, tidak selalu efektif.

Saya pikir itu tidak masuk akal untuk menggambarkan pembuatan antarmuka menggunakan alat grafis, jadi saya akan memberikan beberapa contoh dalam bentuk kode yaml yang saya gunakan. Setelah membuat halaman terpisah (tampilan) untuk penanak nasi kami, kami akan mencoba mengisinya dengan elemen yang paling penting sehingga tidak menyebabkan penolakan saat menggunakan layar smartphone.

Di sini kita akan mencoba alat-alat pemesanan antarmuka yang sangat sederhana, ini adalah tumpukan horisontal dan vertikal. Pertama, buat tumpukan vertikal dari kartu jenis entitas-tombol dan sensor. Yang pertama akan berfungsi untuk meluncurkan penanak nasi kami, yang kedua - untuk menampilkan suhu:
tumpukan vertikal
 cards: #    - type: entity-button #      entity: sensor.xiaomi_cooker_state # ,     icon: 'mdi:selection' #     icon_height: 100px #   name: Offline #    show_icon: true # show_name: true # tap_action: #    action: call-service #  –   service: script.turn_on #  –   service_data: #    entity_id: script.order_cooker_start #  –   hold_action: #    action: none # - type: sensor #      entity: sensor.xiaomi_cooker_temperature # ,     name: Temper #   type: vertical-stack #   –   


Home Assistant menyertakan arsip Ikon Desain Bahan , yang, melalui nama yang sesuai (misalnya, mdi: selection), dapat digunakan dalam item pengaturan. Script (dalam hal ini, bukan python-, tapi yaml-), yang biasa kami sebut layanan, adalah alat HA yang mudah digunakan.

Sekarang gabungkan tumpukan vertikal di atas dengan kartu potret kita di tumpukan horizontal sekarang. Semuanya akan sesederhana itu:
tumpukan horisontal
 ards: #    - type: picture #   image: /local/akari_r.jpg #    - #         type: horizontal-stack #   –   


Di sini Anda perlu menandai baris 'gambar:'. Semua file yang kita masukkan ke folder '~ / .homeassistant / www' tersedia di tautan http: // localhost / local / filename .

Langkah selanjutnya adalah bekerja sedikit pada tombol panggilan layanan yang kami buat. Akan lebih mudah bagi kami jika itu berfungsi sebagai toggle switch, mis. on / off, dan bukan cara itu dilakukan sekarang. Ini dapat dicapai melalui penggunaan kartu jenis bersyarat, tampilan yang di layar dapat disesuaikan dengan mengatur kondisi tertentu. Di bawah ini adalah kode untuk kartu, yang merupakan tombol untuk mematikan penanak nasi dan hanya terlihat jika penanak nasi sedang dalam proses menyiapkan hidangan:
bersyarat
 card: #    entity: sensor.xiaomi_cooker_state # icon: 'mdi:star-box-outline' # icon_height: 100px # name: Running # tap_action: # action: call-service # service: xiaomi_cooker.stop # type: entity-button # conditions: #   # ,    entity: sensor.xiaomi_cooker_mode #  ,     state: Running type: conditional #   


Menulis ulang kode tombol daya yang dibuat sebelumnya dengan cara yang sama, dan menggabungkannya dengan ini, kita mendapatkan satu tombol yang berfungsi baik hidup dan mati.

Kami melengkapi minat kami dengan kartu lain - dengan waktu hingga akhir memasak (mirip dengan kartu suhu), dan satu lagi dengan rincian resep (khusus: kartu resep) ditampilkan. Akibatnya, kami mendapatkan sesuatu seperti ini:

Kartu khusus

Home Assistant, selain kekayaan jenis kartu bawaan, tentu saja, memberikan kemampuan untuk membuat kartu Anda sendiri. Kartu semacam itu disebut kartu khusus, dan javascript digunakan untuk membuatnya. Berikut adalah dua contoh kode sederhana. Sangat mudah untuk menemukan kartu yang sudah jadi yang dibuat oleh berbagai penggemar di jaringan, dan jika Anda ingin bereksperimen sendiri, akan berguna untuk mengetahui bahwa ada modul js- khusus yang dibuat untuk menyederhanakan pekerjaan menulis yang baru. Pengalaman saya dengan javascript terus ingin lebih sedikit, jadi, sebagai contoh, saya hanya akan memberikan sebagian kecil dari kode kartu yang digunakan untuk memilih dan menampilkan resep saat ini.
www / resep-card.js
 import { //     lit-element LitElement, html, css } from "https://unpkg.com/lit-element@latest/lit-element.js?module"; //      class RecipeCard extends LitElement { //     HA static get properties() { return { hass: {}, config: {} }; } //    callServiceEx() { this.hass.callService('persistent_notification', 'create', {message: 'example'}); } //  html-  render() { //    ,     const entityId = this.config.entity; //    const state = this.hass.states[entityId]; //    const titleStr = state ? state.attributes.title : 'unavailable'; const descrStr = state ? state.attributes.description : 'unavailable'; //    return html` <ha-card> <div class="flex" style="margin-top:16px;"> <div class="icon"> <ha-icon icon="mdi:bowl"></ha-icon> </div> <div class="header"> <span class="name">Recipe</span> </div> </div> <div class="flex info" style="margin-bottom:16px;"> <span class="recipe-title">${titleStr}</span> <span class="recipe-descr">${descrStr}</span> </div> </ha-card> `; } //     customElements.define('recipe-card', RecipeCard); 



Untuk menggunakan kartu baru, Anda perlu menambahkan kode berikut di awal file pengaturan LUI:
kartu resep
 resources: #    - type: module #   –  url: /local/recipe-card.js #   

dan di antara daftar kartu:
  - type: 'custom:recipe-card' #   entity: overmind.current_recipe # ,     



Notifikasi

Bagian penting dari rumah pintar adalah mengirim pesan kepada pengguna. Dalam HA, pesan-pesan ini disebut pemberitahuan dan ada dua jenis dasar pemberitahuan. Yang pertama adalah notifikasi persisten. Untuk mengirimnya, layanan bawaan "persistent_notification.create" digunakan. Daftar pesan tersebut tersedia melalui ikon bel di antarmuka grafis, mereka menggunakan markdown markup dan pada dasarnya cukup sederhana.

Alat lain yang lebih menarik adalah modul notifikasi bawaan, yang melalui pemasangan modul tambahan memungkinkan Anda mengirim pesan menggunakan platform pihak ketiga . Sebagai contoh, pertimbangkan modul untuk telegram .

Untuk menggunakan modul, pertama-tama, kita perlu membuat bot di telegram itu sendiri. Saat menyiapkan, kami membutuhkan chat_id pengguna kami dan API token bot. Cara mendapatkan data ini - dijelaskan secara rinci di tautan di atas, kami menganggap bahwa kami siap. Pindah langsung ke menginstal modul, pertama, seperti yang sudah kita lakukan, salin kode sumbernya ke folder komponen, dan kemudian tambahkan pengaturannya ke file "configuration.yaml":
configuration.yaml
 telegram_bot: #   telegram platform: polling #   api_key: XXXXXXXXXXXXX # API Token   allowed_chat_ids: XXXXXXX # chat_id   proxy_url: socks5://XXXXXXXXXXXXX #     proxy_params: username: umpiro password: umpiro_password 

pengaturan plus untuk modul notifikasi:
 notify: #   notify name: notify_send #   (   –  notify.notify_send) platform: telegram #   chat_id: XXXXXXX # chat_id   



Modul telegram memungkinkan kita mengirim pesan, gambar, atau video. Sebagai contoh, kami akan membuat otomatisasi untuk mengirim pesan dengan gambar, memberi tahu kami tentang akhir dari memasak.
automations.yaml
  - id: '1571074941908' # ID  alias: EOC #   trigger: #    # ,   - entity_id: sensor.xiaomi_cooker_mode from: Running #    #   –    platform: state to: Waiting #    condition: [] #   action: #    - service: notify.notify_send #  –   data: # ,     title: End of Cooking #  message: "EOC" #  data: #    photo: #   -  #   - file: /home/umpiro/.homeassistant/www/cat.jpg #   caption: “EOC” 



Kata penutup

Asisten Rumah mungkin menarik bagi mereka yang ingin mencoba mengatur manajemen rumah pintar setempat. Ini adalah proyek yang luas, menarik, terbuka dan aktif karena upaya masyarakat. Variasi alat Asisten Rumah tidak bisa tidak bersukacita (saya tidak punya waktu untuk menyebutkan beberapa yang penting). Sebagai minus, orang dapat menyebutkan kompleksitas relatif dan ketidaklengkapan dokumentasi.
PS
Baru-baru ini, pada 10 Oktober, ada, saya tidak tahu apakah ini bisa disebut rilis, transisi proyek dari versi 0,99 ke versi 0,100.
Kutipan dari Catatan Rilis:
Selamat datang di catatan rilis dari rilis luar biasa lainnya! Tidak, kami tidak akan untuk 1,0, kami melakukan 0,100! Kami merasa belum siap dengan sasaran untuk 1,0, tetapi kami membuat kemajuan setiap hari. Untuk mengetahui apa yang sedang kami pikirkan, periksa mode Simple blog kami di Home Assistant 1.0.

Source: https://habr.com/ru/post/id471822/


All Articles