diff --git a/.google_maps_location_sharing.cookies.mrartifactcall_gmail_com b/.google_maps_location_sharing.cookies.mrartifactcall_gmail_com
new file mode 100644
index 0000000..2131643
--- /dev/null
+++ b/.google_maps_location_sharing.cookies.mrartifactcall_gmail_com
@@ -0,0 +1,27 @@
+# Netscape HTTP Cookie File
+
+.google.com TRUE / TRUE 1722941293 AEC Ae3NU9Pj2LCVF4jsugPZh1pEuk_K5Zpzd6F7JgV7YUSKonhrwTimIreL3w
+accounts.google.com FALSE / TRUE 1709981298 OTZ 7418088_28_28_123540_24_436020
+.google.com TRUE / FALSE 1770461320 SID g.a000gAgsfoSF4DIkkoDFKP-JFAz_GAmvmfkkFsYiSJOBhF7xwlXBsN1kvAgFhFAitqEdQFU42QACgYKATsSAQASFQHGX2Mixu_jowwEkWKS7NwedYZgBhoVAUF8yKobfjp0wcKMW1TMbGkSX5wz0076
+.google.com TRUE / TRUE 1770461320 __Secure-1PSID g.a000gAgsfoSF4DIkkoDFKP-JFAz_GAmvmfkkFsYiSJOBhF7xwlXBcd7gleX6Ccy8NRY-3-whbAACgYKAUESAQASFQHGX2Mi495sLArFt1oW9eBe36L1uBoVAUF8yKprSYPxLUPe3HI3AAbWHVCM0076
+.google.com TRUE / TRUE 1770461320 __Secure-3PSID g.a000gAgsfoSF4DIkkoDFKP-JFAz_GAmvmfkkFsYiSJOBhF7xwlXBGfSO8a8VbKKNnFSkHFJGmgACgYKAVcSAQASFQHGX2MiYIcYkqojvVZj1eCDJlZs5BoVAUF8yKr_LoVaFZymaO1JG24g-dpF0076
+.google.com TRUE / FALSE 1770461320 HSID ASLWkTb8P7xDDNS9Y
+.google.com TRUE / TRUE 1770461320 SSID AzZGpgpHNtGjrlmp1
+.google.com TRUE / FALSE 1770461320 APISID TxFYSFUfoH6WOk1n/AyNzLXVQ4XVg3Vesh
+.google.com TRUE / TRUE 1770461320 SAPISID JxIFAxfr7H_5V3E8/AAidiOKXfKmy0NEUI
+.google.com TRUE / TRUE 1770461320 __Secure-1PAPISID JxIFAxfr7H_5V3E8/AAidiOKXfKmy0NEUI
+.google.com TRUE / TRUE 1770461320 __Secure-3PAPISID JxIFAxfr7H_5V3E8/AAidiOKXfKmy0NEUI
+accounts.google.com FALSE / TRUE 1770461320 __Host-GAPS 1:VVqfNO1bgRJhXoqb9cjn97ChPhdB0u7oCwUJpYZM5VRZbeaDEvZLMtyK-wCp8o7DR5l_phbXT_cDHt_89z9fjIbtlA174A:Ftd2WPeqmrPYXMAb
+accounts.google.com FALSE / TRUE 1770461320 LSID s.RU|s.youtube:g.a000gAgsfgvnZDsSzdGZUu8oWSCugkortmh1tnR8BQLEPHHn73iPmFnm-HcCbepiXtj2lc5eagACgYKAYUSAQASFQHGX2Mi9wpl9WkCbePxBoqtZAm_ORoVAUF8yKoCSd-32165cXgdioEgNgOP0076
+accounts.google.com FALSE / TRUE 1770461320 __Host-1PLSID s.RU|s.youtube:g.a000gAgsfgvnZDsSzdGZUu8oWSCugkortmh1tnR8BQLEPHHn73iPbos4BoyXh-mVOgVfcht77AACgYKAbUSAQASFQHGX2MizOWgGGXf3J5XrSbuNZjx5RoVAUF8yKpqkaShfwCeS47z6dQ_oKNO0076
+accounts.google.com FALSE / TRUE 1770461320 __Host-3PLSID s.RU|s.youtube:g.a000gAgsfgvnZDsSzdGZUu8oWSCugkortmh1tnR8BQLEPHHn73iP5R3ZIsa_PGZ_KMRjI3cXVQACgYKAZgSAQASFQHGX2MiuXeUvY682zOoftvCMvgOZBoVAUF8yKp4bwjFX6Haqm3Ywo3HNP1a0076
+accounts.google.com FALSE / TRUE 1770461320 ACCOUNT_CHOOSER AFx_qI7mu7pP86WkAhm_OlVLVgK_4hg-HUYVOZMLc8ipgFQE6B0DArl-7UF6A_FH88-Se-PlPlE7_3GfCV_GW3rDZ4vPszpuyRq6421Uf6mI6PV1BHcdlWiMX1Ga480hfl1LvQK_KPLefnSY6TgilgBTlk60kl9qgcqS_hb1iUxCEZ8L1QbN-WA
+.google.com TRUE / FALSE 1722941321 SEARCH_SAMESITE CgQIsZoB
+.google.com TRUE / TRUE 1738925326 __Secure-1PSIDTS sidts-CjEBPVxjSoGRMt9NsdtBeMfpibFfwHTU0lExdq3doNenskrCA2q9JcF9_febu803CGMwEAA
+.google.com TRUE / TRUE 1738925326 __Secure-3PSIDTS sidts-CjEBPVxjSoGRMt9NsdtBeMfpibFfwHTU0lExdq3doNenskrCA2q9JcF9_febu803CGMwEAA
+ogs.google.com FALSE / TRUE 1709981329 OTZ 7418089_28_28_123540_24_436020
+.google.com TRUE / TRUE 1723200496 NID 511=jtc5teJXhBvLFFtka-Bt4yr0yPEeN88yKRH0nXwaxONrnECYR5g7O-HTGEEsLGyfUMPOQbsEBL5UiftPpWo1O8hu0EBj7UxzxKNxNCZFt3yT2xcyvOJvUjcpz16UecAHK3KJz00CPZs8TPOMNdwWHqLRbNEGW79kRKdeDPlEb7HRU1vw9MbsmYLhEsZ2tKrtm8jl9PT7DFGDkjPEKcfQadNgWH87sqMzYR_n2ABCsUK-edLtDu3GeXMD5IfwuMPnA9taGtrH3fcuKGwUMhIVAkScjVqHeeVx4qKW6XvUc_kiAQ
+.google.com TRUE / FALSE 1738925362 SIDCC ABTWhQG9J_CFsmYD3mJL5-UbRUaIaCFhnr7w4817qJutGgSBjke3s2CSp8es7vbk_HW3m7mi
+.google.com TRUE / TRUE 1738925362 __Secure-1PSIDCC ABTWhQE9gbZ9LxSTGtLZq01GqknfIynf53fGI2rkaogSFB1eYlWEW7zJa1-9e32s7oDz2Uwr
+.google.com TRUE / TRUE 1738925362 __Secure-3PSIDCC ABTWhQGeTMCXSjSwZZ-e_mv8CMfMaXwYiJkjTVzHaia6vml3T5ShG6jhPZeILQqT-CXhsTxf
+.google.com TRUE / TRUE 1709981363 1P_JAR 2024-02-08-10
diff --git a/automations.yaml b/automations.yaml
new file mode 100644
index 0000000..945eabe
--- /dev/null
+++ b/automations.yaml
@@ -0,0 +1,147 @@
+- id: '1700660686552'
+ alias: Откл термопот, если меньше 900kwh
+ description: ''
+ trigger:
+ - platform: numeric_state
+ entity_id: sensor.termopot_power
+ below: 900
+ for:
+ hours: 0
+ minutes: 20
+ seconds: 0
+ condition: []
+ action:
+ - service: switch.turn_off
+ target:
+ entity_id: switch.termopot
+ mode: single
+- id: '1705247080932'
+ alias: Необходимо убрать бак с водой
+ description: ''
+ trigger:
+ - platform: state
+ entity_id:
+ - vacuum.dreame_mc1808_044c_robot_cleaner_2
+ attribute: clean.water_box
+ to: '1'
+ condition:
+ - condition: or
+ conditions:
+ - condition: state
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ attribute: vacuum.status_desc
+ state: docked
+ - condition: state
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ attribute: vacuum.status_desc
+ state: Charging
+ action:
+ - service: notify.telegram_id_1
+ metadata: {}
+ data:
+ message: Необходимо убрать бак с водой
+ title: Бак с водой.
+ mode: restart
+- id: '1735571592564'
+ alias: ntf|tg|bosh|end_salt
+ description: ''
+ triggers:
+ - trigger: state
+ entity_id:
+ - timer.timer_cool_washer
+ from: idle
+ to: active
+ conditions:
+ - condition: and
+ conditions:
+ - condition: state
+ entity_id: binary_sensor.day_time
+ state: 'on'
+ actions:
+ - choose:
+ - conditions:
+ - condition: and
+ conditions:
+ - condition: state
+ entity_id: device_tracker.google_maps_108918666344169166438
+ state: not_home
+ - condition: state
+ entity_id: device_tracker.google_maps_118311730364158481019
+ state: home
+ sequence:
+ - repeat:
+ sequence:
+ - delay:
+ hours: 0
+ minutes: 0
+ seconds: 10
+ milliseconds: 0
+ - action: telegram_bot.send_message
+ data:
+ message: '{{"\U00002705"}}Сушка завершена, нужно достать бельё{{"\U00002705"}}
+
+ Осталось время: {{ state_attr (''timer.timer_cool_washer'',''duration'')
+ }} '
+ target: 330380285
+ inline_keyboard: " {{'↩'}} Главное меню:/menu_back, {{'\U0001F5D1'}}
+ Прочитано:/menu_hide"
+ while:
+ - condition: state
+ entity_id: timer.timer_cool_washer
+ state: active
+ alias: Лена дома, Денис не дома
+ - conditions:
+ - condition: state
+ entity_id: device_tracker.google_maps_108918666344169166438
+ state: home
+ sequence:
+ - repeat:
+ sequence:
+ - delay:
+ hours: 0
+ minutes: 0
+ seconds: 10
+ milliseconds: 0
+ - action: telegram_bot.send_message
+ data:
+ message: '{{"\U00002705"}}Сушка завершена, нужно достать бельё{{"\U00002705"}}
+
+ Осталось время: {{ state_attr (''timer.timer_cool_washer'',''duration'')
+ }} '
+ target: 102879274
+ inline_keyboard: " {{'↩'}} Главное меню:/menu_back, {{'\U0001F5D1'}}
+ Прочитано:/menu_hide"
+ while:
+ - condition: state
+ entity_id: timer.timer_cool_washer
+ state: active
+ alias: Денис дома
+ - conditions:
+ - condition: and
+ conditions:
+ - condition: state
+ entity_id: device_tracker.google_maps_108918666344169166438
+ state: not_home
+ - condition: state
+ entity_id: device_tracker.google_maps_118311730364158481019
+ state: not_home
+ sequence:
+ - repeat:
+ sequence:
+ - delay:
+ hours: 0
+ minutes: 0
+ seconds: 10
+ milliseconds: 0
+ - action: telegram_bot.send_message
+ data:
+ message: '{{"\U00002705"}}Сушка завершена, нужно достать бельё{{"\U00002705"}}'
+ target: 102879274
+ inline_keyboard: " {{'↩'}} Главное меню:/menu_back, {{'\U0001F5D1'}}
+ Прочитано:/menu_hide"
+ while:
+ - condition: state
+ entity_id: timer.timer_cool_washer
+ state: active
+ alias: Лена и Денис не дома
+ mode: single
diff --git a/configuration.yaml b/configuration.yaml
new file mode 100644
index 0000000..b3984c1
--- /dev/null
+++ b/configuration.yaml
@@ -0,0 +1,103 @@
+homeassistant:
+
+ customize:
+ zone.home:
+ radius: 50
+ packages: !include_dir_merge_named includes/packages
+
+ time_zone: Asia/Krasnoyarsk
+
+# Loads default set of integrations. Do not remove.
+default_config:
+
+shell_command:
+ tr_files: "ls /media/share/downloads > /config/tr_list_files.txt"
+
+http:
+ use_x_forwarded_for: true
+ trusted_proxies:
+ - 192.168.1.0/24
+ ip_ban_enabled: true
+ login_attempts_threshold: 5
+
+# Load frontend themes from the themes folder
+frontend:
+ themes: !include_dir_merge_named themes
+
+automation: !include automations.yaml
+script: !include scripts.yaml
+scene: !include scenes.yaml
+template: !include template.yaml
+
+sensor:
+ - platform: time_date
+ display_options:
+ - 'time'
+ - 'date'
+ - 'date_time'
+ - 'date_time_utc'
+ - 'date_time_iso'
+ - 'time_date'
+ - 'time_utc'
+
+narodmon:
+ devices:
+ - name: "Narodmon"
+ sensors:
+ - temperature
+ - wind_speed
+ - precipitation
+ - pm
+
+#telegram_bot:
+# - platform: polling
+# api_key: !secret api_key_bot
+# allowed_chat_ids:
+# - !secret telegram_id_group_home
+# - !secret telegram_id_1
+# - !secret telegram_id_d2
+# - !secret telegram_id_el
+
+
+#notify:
+
+# - name: telegram_id_1
+# platform: telegram
+# chat_id: !secret telegram_id_1
+# - name: telegram_id_d2
+# platform: telegram
+# chat_id: !secret telegram_id_d2
+# - name: telegram_id_gr
+# platform: telegram
+# chat_id: !secret telegram_id_el
+
+
+#camera:
+# - platform: xiaomi_cloud_map_extractor
+# host: !secret xiaomi_vacuum_host
+# token: !secret xiaomi_vacuum_token
+# username: !secret xiaomi_cloud_username
+# password: !secret xiaomi_cloud_password
+# draw: ['all']
+# attributes:
+# - calibration_points
+# - rooms
+# scan_interval: 120
+
+vacuum:
+ - platform: xiaomi_vacuum
+ host: !secret xiaomi_vacuum_host
+ token: !secret xiaomi_vacuum_token
+ name: STYTJ01ZHM
+
+device_tracker:
+ - platform: google_maps
+ username: "mrartifactcall@gmail.com"
+ max_gps_accuracy: 200
+
+
+ - platform: ubus
+ host: !secret openwrt_ip
+ username: !secret openwrt_user
+ password: !secret openwrt_pass
+
diff --git a/includes/packages/GPS.yaml b/includes/packages/GPS.yaml
new file mode 100644
index 0000000..ae1801f
--- /dev/null
+++ b/includes/packages/GPS.yaml
@@ -0,0 +1,846 @@
+gps:
+ rest_command:
+ notify_n8n_lena_left_home:
+ url: "https://n8n.dddennnisss.ru:8443/webhook-test/lena_left_home"
+ method: POST
+ content_type: "application/json"
+ payload: >
+ {
+ "event": "lena_left_home",
+ "name": "{{ state_attr('device_tracker.google_maps_118311730364158481019', 'nickname') | replace('\"', '\\\"') }}",
+ "address": "{{ state_attr('device_tracker.google_maps_118311730364158481019', 'address') | replace('\"', '\\\"') }}",
+ "last_updated": "{{ states.device_tracker.google_maps_118311730364158481019.last_updated }}"
+ }
+
+ input_boolean:
+ gps_recently_nearby_d_e:
+ name: gps_recently_nearby_d_e
+ initial: false
+ icon: mdi:map-marker-distance
+
+ automation:
+ ################################################################################
+ # Уведомления о местоположении
+ ################################################################################
+
+ # ===============
+ # HOME (ДОМ)
+ # ===============
+ - id: GPS|lena_on_home
+ alias: GPS|lena_on_home
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_118311730364158481019
+ zone: zone.home
+ event: enter
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: |
+ 🏠 Лена дома.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|lena_off_home
+ alias: GPS|lena_off_home
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_118311730364158481019
+ zone: zone.home
+ event: leave
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: |
+ 💨 Лена вышла из дома.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+ - service: rest_command.notify_n8n_lena_left_home
+
+ - id: GPS|denis_on_home
+ alias: GPS|denis_on_home
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_108918666344169166438
+ zone: zone.home
+ event: enter
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1003233671944
+ message: |
+ 🏠 Денис дома.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|denis_off_home
+ alias: GPS|denis_off_home
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_108918666344169166438
+ zone: zone.home
+ event: leave
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1003233671944
+ message: |
+ 💨 Денис вышел из дома.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ # ===============
+ # RADUGA (РАДУГА)
+ # ===============
+ - id: GPS|lena_on_raduga
+ alias: GPS|lena_on_raduga
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_118311730364158481019
+ zone: zone.raduga
+ event: enter
+ action:
+ - service: telegram_bot.send_location
+ data:
+ chat_id: -1002006010424
+ latitude: "{{ state_attr('device_tracker.google_maps_118311730364158481019', 'latitude') }}"
+ longitude: "{{ state_attr('device_tracker.google_maps_118311730364158481019', 'longitude') }}"
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: |
+ 🌈 Лена на радуге.
+ inline_keyboard:
+ - '🗺️ Где Лена:/gps_send_loc_e'
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|lena_off_raduga
+ alias: GPS|lena_off_raduga
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_118311730364158481019
+ zone: zone.raduga
+ event: leave
+ action:
+ - service: telegram_bot.send_location
+ data:
+ chat_id: -1002006010424
+ latitude: "{{ state_attr('device_tracker.google_maps_118311730364158481019', 'latitude') }}"
+ longitude: "{{ state_attr('device_tracker.google_maps_118311730364158481019', 'longitude') }}"
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: |
+ 💨 Лена уехала с радуги.
+ inline_keyboard:
+ - '🗺️ Где Лена:/gps_send_loc_e'
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|denis_on_raduga
+ alias: GPS|denis_on_raduga
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_108918666344169166438
+ zone: zone.raduga
+ event: enter
+ action:
+ - service: telegram_bot.send_location
+ data:
+ chat_id: -1003233671944
+ latitude: "{{ state_attr('device_tracker.google_maps_108918666344169166438', 'latitude') }}"
+ longitude: "{{ state_attr('device_tracker.google_maps_108918666344169166438', 'longitude') }}"
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1003233671944
+ message: |
+ 🌈 Денис на радуге.
+ inline_keyboard:
+ - '🗺️ Где Денис:/gps_send_loc_d'
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|denis_off_raduga
+ alias: GPS|denis_off_raduga
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_108918666344169166438
+ zone: zone.raduga
+ event: leave
+ action:
+ - service: telegram_bot.send_location
+ data:
+ chat_id: -1003233671944
+ latitude: "{{ state_attr('device_tracker.google_maps_108918666344169166438', 'latitude') }}"
+ longitude: "{{ state_attr('device_tracker.google_maps_108918666344169166438', 'longitude') }}"
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1003233671944
+ message: |
+ 💨 Денис уехал с радуги.
+ inline_keyboard:
+ - '🗺️ Где Денис:/gps_send_loc_d'
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ # ===============
+ # CENTER (ЦЕНТР)
+ # ===============
+ - id: GPS|lena_on_center
+ alias: GPS|lena_on_center
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_118311730364158481019
+ zone: zone.tsentr
+ event: enter
+ action:
+ - service: telegram_bot.send_location
+ data:
+ chat_id: -1002006010424
+ latitude: "{{ state_attr('device_tracker.google_maps_118311730364158481019', 'latitude') }}"
+ longitude: "{{ state_attr('device_tracker.google_maps_118311730364158481019', 'longitude') }}"
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: |
+ 🏙️ Лена в центре.
+ inline_keyboard:
+ - '🗺️ Где Лена:/gps_send_loc_e'
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|lena_off_center
+ alias: GPS|lena_off_center
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_118311730364158481019
+ zone: zone.tsentr
+ event: leave
+ action:
+ - service: telegram_bot.send_location
+ data:
+ chat_id: -1002006010424
+ latitude: "{{ state_attr('device_tracker.google_maps_118311730364158481019', 'latitude') }}"
+ longitude: "{{ state_attr('device_tracker.google_maps_118311730364158481019', 'longitude') }}"
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: |
+ 💨 Лена уехала из центра.
+ inline_keyboard:
+ - '🗺️ Где Лена:/gps_send_loc_e'
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|denis_on_center
+ alias: GPS|denis_on_center
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_108918666344169166438
+ zone: zone.tsentr
+ event: enter
+ action:
+ - service: telegram_bot.send_location
+ data:
+ chat_id: -1003233671944
+ latitude: "{{ state_attr('device_tracker.google_maps_108918666344169166438', 'latitude') }}"
+ longitude: "{{ state_attr('device_tracker.google_maps_108918666344169166438', 'longitude') }}"
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1003233671944
+ message: |
+ 🏙️ Денис в центре.
+ inline_keyboard:
+ - '🗺️ Где Денис:/gps_send_loc_d'
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|denis_off_center
+ alias: GPS|denis_off_center
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_108918666344169166438
+ zone: zone.tsentr
+ event: leave
+ action:
+ - service: telegram_bot.send_location
+ data:
+ chat_id: -1003233671944
+ latitude: "{{ state_attr('device_tracker.google_maps_108918666344169166438', 'latitude') }}"
+ longitude: "{{ state_attr('device_tracker.google_maps_108918666344169166438', 'longitude') }}"
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1003233671944
+ message: |
+ 💨 Денис уехал из центра.
+ inline_keyboard:
+ - '🗺️ Где Денис:/gps_send_loc_d'
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ # ===============
+ # FAMILY (РОДИТЕЛИ)
+ # ===============
+ - id: GPS|lena_on_familyr
+ alias: GPS|lena_on_familyr
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_118311730364158481019
+ zone: zone.roditeli_leny
+ event: enter
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: |
+ 👨👩👧 Лена у родителей.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|lena_off_familyr
+ alias: GPS|lena_off_familyr
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_118311730364158481019
+ zone: zone.roditeli_leny
+ event: leave
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: |
+ 💨 Лена уехала от родителей.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|denis_on_familyr
+ alias: GPS|denis_on_familyr
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_108918666344169166438
+ zone: zone.roditeli_leny
+ event: enter
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1003233671944
+ message: |
+ 👨👩👧 Денис у родителей Лены.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|denis_off_familyr
+ alias: GPS|denis_off_familyr
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_108918666344169166438
+ zone: zone.roditeli_leny
+ event: leave
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1003233671944
+ message: |
+ 💨 Денис уехал от родителей Лены.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ # ===============
+ # JOB ELENA (РАБОТА ЛЕНЫ)
+ # ===============
+ - id: GPS|lena_on_job
+ alias: GPS|lena_on_job
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_118311730364158481019
+ zone: zone.rabota_leny
+ event: enter
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: |
+ 💼 Лена на работе.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|lena_off_job
+ alias: GPS|lena_off_job
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_118311730364158481019
+ zone: zone.rabota_leny
+ event: leave
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: |
+ 💨 Лена уехала с работы.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ # ===============
+ # YASHKA (ЯШКА)
+ # ===============
+ - id: GPS|lena_on_ya
+ alias: GPS|lena_on_ya
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_118311730364158481019
+ zone: zone.iashka
+ event: enter
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: |
+ 🐾 Лена около Яшки.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|Denis_on_ya
+ alias: GPS|Denis_on_ya
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_108918666344169166438
+ zone: zone.iashka
+ event: enter
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1003233671944
+ message: |
+ 🐾 Денис около Яшки.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ # ===============
+ # TERESHKOVOI_16 (КВАРТИРА ТЕРЕШКОВОЙ)
+ # ===============
+ - id: GPS|lena_on_tereshkovoi_16
+ alias: GPS|lena_on_tereshkovoi_16
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_118311730364158481019
+ zone: zone.tereshkovoi_16
+ event: enter
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: |
+ 🏢 Лена на квартире.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|lena_off_tereshkovoi_16
+ alias: GPS|lena_off_tereshkovoi_16
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_118311730364158481019
+ zone: zone.tereshkovoi_16
+ event: leave
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: |
+ 💨 Лена уехала с квартиры.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|denis_on_tereshkovoi_16
+ alias: GPS|denis_on_tereshkovoi_16
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_108918666344169166438
+ zone: zone.tereshkovoi_16
+ event: enter
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1003233671944
+ message: |
+ 🏢 Денис на квартире.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|denis_off_tereshkovoi_16
+ alias: GPS|denis_off_tereshkovoi_16
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_108918666344169166438
+ zone: zone.tereshkovoi_16
+ event: leave
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1003233671944
+ message: |
+ 💨 Денис уехал с квартиры.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ # ===============
+ # NOVOSTROIKA (НОВОСТРОЙКА)
+ # ===============
+ - id: GPS|lena_on_novostroika
+ alias: GPS|lena_on_novostroika
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_118311730364158481019
+ zone: zone.novostroika
+ event: enter
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: |
+ 🏗️ Лена на Новостройке.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|lena_off_novostroika
+ alias: GPS|lena_off_novostroika
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_118311730364158481019
+ zone: zone.novostroika
+ event: leave
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: |
+ 💨 Лена уехала с Новостройки.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ # ===============
+ # MAMA (МАМА)
+ # ===============
+ - id: GPS|lena_on_mama
+ alias: GPS|lena_on_mama
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_118311730364158481019
+ zone: zone.mama
+ event: enter
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: |
+ 👩👧 Лена у мамы.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|lena_off_mama
+ alias: GPS|lena_off_mama
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_118311730364158481019
+ zone: zone.mama
+ event: leave
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: |
+ 💨 Лена уехала от мамы.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|denis_on_mama
+ alias: GPS|denis_on_mama
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_108918666344169166438
+ zone: zone.mama
+ event: enter
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1003233671944
+ message: |
+ 👨👧 Денис у мамы.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|denis_off_mama
+ alias: GPS|denis_off_mama
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_108918666344169166438
+ zone: zone.mama
+ event: leave
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1003233671944
+ message: |
+ 💨 Денис уехал от мамы.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ # ===============
+ # JOB DENIS (РАБОТА ДЕНИС)
+ # ===============
+ - id: GPS|denis_on_job
+ alias: GPS|denis_on_job
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_108918666344169166438
+ zone: zone.rabota
+ event: enter
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1003233671944
+ message: |
+ 💼 Денис на работе.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|denis_off_job
+ alias: GPS|denis_off_job
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_108918666344169166438
+ zone: zone.rabota
+ event: leave
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1003233671944
+ message: |
+ 💨 Денис уехал с работы.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ # ===============
+ # LENINSKIJ (ЛЕНИНСКИЙ)
+ # ===============
+ - id: GPS|denis_on_len
+ alias: GPS|denis_on_len
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_108918666344169166438
+ zone: zone.leninskii
+ event: enter
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1003233671944
+ message: |
+ 🏘️ Денис в Ленинском.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|denis_off_len
+ alias: GPS|denis_off_len
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_108918666344169166438
+ zone: zone.leninskii
+ event: leave
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1003233671944
+ message: |
+ 💨 Денис уехал из Ленинского.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|elena_on_len
+ alias: GPS|elena_on_len
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_118311730364158481019
+ zone: zone.leninskii
+ event: enter
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: |
+ 🏘️ Лена в Ленинском.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|elena_off_len
+ alias: GPS|elena_off_len
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_118311730364158481019
+ zone: zone.leninskii
+ event: leave
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: |
+ 💨 Лена уехала из Ленинского.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ # ===============
+ # KEMEROVO (КЕМЕРОВО)
+ # ===============
+ - id: GPS|denis_on_kem
+ alias: GPS|denis_on_kem
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_108918666344169166438
+ zone: zone.kemerovo
+ event: enter
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1003233671944
+ message: |
+ 🌆 Денис в Кемерово.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|denis_off_kem
+ alias: GPS|denis_off_kem
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_108918666344169166438
+ zone: zone.kemerovo
+ event: leave
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1003233671944
+ message: |
+ 💨 Денис уехал из Кемерово.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|elena_on_kem
+ alias: GPS|elena_on_kem
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_118311730364158481019
+ zone: zone.kemerovo
+ event: enter
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: |
+ 🌆 Лена в Кемерово.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - id: GPS|elena_off_kem
+ alias: GPS|elena_off_kem
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.google_maps_118311730364158481019
+ zone: zone.kemerovo
+ event: leave
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: |
+ 💨 Лена уехала из Кемерово.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ # ===============
+ # УВЕДОМЛЕНИЕ: РЯДОМ (< 1км)
+ # ===============
+ - id: ntf|tg|GPS|distance<1km_d_e
+ alias: ntf|tg|GPS|distance<1km_d_e
+ mode: single
+ trigger:
+ - platform: template
+ value_template: >-
+ {% set lat1 = state_attr('device_tracker.google_maps_108918666344169166438', 'latitude') %}
+ {% set lon1 = state_attr('device_tracker.google_maps_108918666344169166438', 'longitude') %}
+ {% set lat2 = state_attr('device_tracker.google_maps_118311730364158481019', 'latitude') %}
+ {% set lon2 = state_attr('device_tracker.google_maps_118311730364158481019', 'longitude') %}
+ {% if lat1 and lon1 and lat2 and lon2 %}
+ {{ distance(lat1, lon1, lat2, lon2) < 1 }}
+ {% else %}
+ false
+ {% endif %}
+ for:
+ seconds: 10
+ condition:
+ - condition: state
+ entity_id: input_boolean.gps_recently_nearby_d_e
+ state: "off"
+ - condition: template
+ value_template: >
+ {{ not is_state('device_tracker.google_maps_108918666344169166438', 'home') and
+ not is_state('device_tracker.google_maps_118311730364158481019', 'home') }}
+ action:
+ - service: input_boolean.turn_on
+ target:
+ entity_id: input_boolean.gps_recently_nearby_d_e
+
+ # 1. Уведомление Денису (о Елене)
+ - service: telegram_bot.send_location
+ data:
+ chat_id: -1002006010424
+ latitude: "{{ state_attr('device_tracker.google_maps_118311730364158481019', 'latitude') }}"
+ longitude: "{{ state_attr('device_tracker.google_maps_118311730364158481019', 'longitude') }}"
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: |
+ 🤝 Вы рядом с Еленой!
+ 📏 Расстояние: {{ distance(state_attr('device_tracker.google_maps_108918666344169166438', 'latitude'), state_attr('device_tracker.google_maps_108918666344169166438', 'longitude'), state_attr('device_tracker.google_maps_118311730364158481019', 'latitude'), state_attr('device_tracker.google_maps_118311730364158481019', 'longitude')) | round(2) }} км
+ 📍 Адрес Елены: {{ state_attr('device_tracker.google_maps_118311730364158481019', 'address') }}
+ inline_keyboard:
+ - '🗺️ Где Денис:/gps_send_loc_d, 🗺️ Где Лена:/gps_send_loc_e'
+ - '🔙 Главное меню:/menu_back, ⚙️ Настройки GPS:/gps_control'
+
+ # 2. Уведомление Елене (о Денисе)
+ - service: telegram_bot.send_location
+ data:
+ chat_id: -1003233671944
+ latitude: "{{ state_attr('device_tracker.google_maps_108918666344169166438', 'latitude') }}"
+ longitude: "{{ state_attr('device_tracker.google_maps_108918666344169166438', 'longitude') }}"
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1003233671944
+ message: |
+ 🤝 Вы рядом с Денисом!
+ 📏 Расстояние: {{ distance(state_attr('device_tracker.google_maps_108918666344169166438', 'latitude'), state_attr('device_tracker.google_maps_108918666344169166438', 'longitude'), state_attr('device_tracker.google_maps_118311730364158481019', 'latitude'), state_attr('device_tracker.google_maps_118311730364158481019', 'longitude')) | round(2) }} км
+ 📍 Адрес Дениса: {{ state_attr('device_tracker.google_maps_108918666344169166438', 'address') }}
+ inline_keyboard:
+ - '🗺️ Где Денис:/gps_send_loc_d, 🗺️ Где Лена:/gps_send_loc_e'
+ - '🔙 Главное меню:/menu_back, ⚙️ Настройки GPS:/gps_control'
+
+ # Сброс вспомогательного булеана для автоматизации уведомлений в телеграм
+ - id: reset_gps_recently_nearby_d_e
+ alias: reset_gps_recently_nearby_d_e
+ description: "Сброс тумблера после расхождения > 1 км"
+ mode: single
+ trigger:
+ - platform: template
+ value_template: >
+ {% set lat1 = state_attr('device_tracker.google_maps_108918666344169166438', 'latitude') %}
+ {% set lon1 = state_attr('device_tracker.google_maps_108918666344169166438', 'longitude') %}
+ {% set lat2 = state_attr('device_tracker.google_maps_118311730364158481019', 'latitude') %}
+ {% set lon2 = state_attr('device_tracker.google_maps_118311730364158481019', 'longitude') %}
+ {% if lat1 and lon1 and lat2 and lon2 %}
+ {{ distance(lat1, lon1, lat2, lon2) > 1 }}
+ {% else %}
+ false
+ {% endif %}
+ for:
+ hours: 0
+ minutes: 5
+ seconds: 0
+ condition:
+ - condition: state
+ entity_id: input_boolean.gps_recently_nearby_d_e
+ state: "on"
+ action:
+ - service: input_boolean.turn_off
+ target:
+ entity_id: input_boolean.gps_recently_nearby_d_e
\ No newline at end of file
diff --git a/includes/packages/bus.yaml b/includes/packages/bus.yaml
new file mode 100644
index 0000000..ef732b6
--- /dev/null
+++ b/includes/packages/bus.yaml
@@ -0,0 +1,608 @@
+bus:
+
+# Время после которого будет разрешено работать автоматизации tg|ntf|tram10_rad-gor_<20m
+
+ input_datetime:
+ tram10_r_g_enable_time:
+ name: INPT|tram10_r_g_enable_time
+ has_date: false
+ has_time: true
+ initial: "07:15:00"
+
+
+
+# Сенсоры, которые получают даннные о автобусе из API
+
+#################34#####################################
+
+ sensor:
+ - platform: rest
+ name: bustime_34_kuz_pr
+ resource: "https://ru.busti.me/api/notify_stop/?stop_id=460789&bus_id=11299"
+ method: GET
+ scan_interval: 30
+ value_template: "{{ value_json.time }}"
+ json_attributes:
+ - name
+ - time
+ - x
+ - y
+ - updated
+
+ - platform: rest
+ name: bustime_34_circ
+ resource: "https://ru.busti.me/api/notify_stop/?stop_id=8880&bus_id=11299"
+ method: GET
+ scan_interval: 30
+ value_template: "{{ value_json.time }}"
+ json_attributes:
+ - name
+ - time
+ - x
+ - y
+ - updated
+
+ - platform: rest
+ name: bustime_34_univ
+ resource: "https://ru.busti.me/api/notify_stop/?stop_id=87239&bus_id=11299"
+ method: GET
+ scan_interval: 15
+ value_template: "{{ value_json.time }}"
+ json_attributes:
+ - name
+ - time
+ - x
+ - y
+ - updated
+
+#################127#####################################
+
+ - platform: rest
+ name: bustime_127_circ
+ resource: "https://ru.busti.me/api/notify_stop/?stop_id=9277&bus_id=751"
+ method: GET
+ scan_interval: 30
+ value_template: "{{ value_json.time }}"
+ json_attributes:
+ - name
+ - time
+ - x
+ - y
+ - updated
+
+#################100#####################################
+
+ - platform: rest
+ name: bustime_100_circ
+ resource: "https://ru.busti.me/api/notify_stop/?stop_id=8899&bus_id=649"
+ method: GET
+ scan_interval: 30
+ value_template: "{{ value_json.time }}"
+ json_attributes:
+ - name
+ - time
+ - x
+ - y
+ - updated
+
+#################40#####################################
+
+ - platform: rest
+ name: bustime_40_circ
+ resource: "https://ru.busti.me/api/notify_stop/?stop_id=8880&bus_id=696"
+ method: GET
+ scan_interval: 30
+ value_template: "{{ value_json.time }}"
+ json_attributes:
+ - name
+ - time
+ - x
+ - y
+ - updated
+
+#################12#####################################
+
+ - platform: rest
+ name: bustime_12_circ
+ resource: "https://ru.busti.me/api/notify_stop/?stop_id=9277&bus_id=652"
+ method: GET
+ scan_interval: 30
+ value_template: "{{ value_json.time }}"
+ json_attributes:
+ - name
+ - time
+ - x
+ - y
+ - updated
+
+########################################################
+
+# Остановка: Серебряный бор - мжк
+#################10#####################################
+
+ - platform: rest
+ name: bustime_10_sereb_sbb
+ resource: "https://ru.busti.me/api/notify_stop/?stop_id=9395&bus_id=647"
+ method: GET
+ scan_interval: 15
+ value_template: "{{ value_json.time }}"
+ json_attributes:
+ - name
+ - time
+ - x
+ - y
+ - updated
+
+ - platform: rest
+ name: bustime_10_sereb_sb
+ resource: "https://ru.busti.me/api/notify_stop/?stop_id=9397&bus_id=647"
+ method: GET
+ scan_interval: 15
+ value_template: "{{ value_json.time }}"
+ json_attributes:
+ - name
+ - time
+ - x
+ - y
+ - updated
+
+ - platform: rest
+ name: bustime_10_sereb_a
+ resource: "https://ru.busti.me/api/notify_stop/?stop_id=9407&bus_id=647"
+ method: GET
+ scan_interval: 15
+ value_template: "{{ value_json.time }}"
+ json_attributes:
+ - name
+ - time
+ - x
+ - y
+ - updated
+
+
+# Остановка: Кузбассэнерго (трамвай)- Радуга
+#################10#####################################
+
+ - platform: rest
+ name: bustime_10_kemdor
+ resource: "https://ru.busti.me/api/notify_stop/?stop_id=8956&bus_id=647"
+ method: GET
+ scan_interval: 30
+ value_template: "{{ value_json.time }}"
+ json_attributes:
+ - name
+ - time
+ - x
+ - y
+ - updated
+
+ - platform: rest
+ name: bustime_10_kuzbass
+ resource: "https://ru.busti.me/api/notify_stop/?stop_id=125776&bus_id=647"
+ method: GET
+ scan_interval: 30
+ value_template: "{{ value_json.time }}"
+ json_attributes:
+ - name
+ - time
+ - x
+ - y
+ - updated
+
+################шаблоны########################################
+
+################10########################################
+
+#сенсор показывющий время до остановки сельская б и до серебряный бор в сторону города 🚌 10 | Сельская Б: 12:49 (8 мин) | Ближ: 12:46
+ template:
+ - sensor:
+ - name: "tram10.raduga-gorod"
+ state: >
+ {% set s = 'sensor.bustime_10_sereb_a' %}
+ {% set e = 'sensor.bustime_10_sereb_sb' %}
+
+ {% set sereb_time = states(s) %}
+ {% set end_time = states(e) %}
+
+ {% set has_end = end_time not in ['unknown','unavailable',''] %}
+ {% set has_sereb = sereb_time not in ['unknown','unavailable',''] %}
+
+ {% if has_end %}
+ {% set now_ts = now() %}
+ {% set end_ts = today_at(end_time) %}
+ {% set delta = (end_ts - now_ts).total_seconds() / 60 %}
+ {% if delta < -720 %}
+ {% set end_ts = end_ts + timedelta(days=1) %}
+ {% endif %}
+ {% set diff = ((end_ts - now_ts).total_seconds() / 60) | round(0) %}
+ {% endif %}
+
+ 🚌 10 | Сельская Б: {{ end_time if has_end else 'нет данных' }}{% if has_end %} ({{ diff }} мин){% endif %} | Ближ: {{ sereb_time if has_sereb else 'нет данных' }}
+
+#сенсор показывющий время до остановки кузбассэнерго в сторону радуги 🚌 10 | нет данных
+ - sensor:
+ - name: "tram10.gorod-raduga"
+ state: >
+ {% set s = 'sensor.bustime_10_kuzbass' %}
+
+ {% set route = state_attr(s,'name') or '10' %}
+ {% set stop_time = states(s) %}
+ {% set has_time = stop_time not in ['unknown','unavailable',''] %}
+
+ {% if has_time %}
+ {% set now_ts = now() %}
+ {% set stop_ts = today_at(stop_time) %}
+ {% set delta = (stop_ts - now_ts).total_seconds() / 60 %}
+
+ {# если ушло сильно в минус — значит это уже завтра #}
+ {% if delta < -720 %}
+ {% set stop_ts = stop_ts + timedelta(days=1) %}
+ {% endif %}
+
+ {% set diff = ((stop_ts - now_ts).total_seconds() / 60) | round(0) %}
+ {% endif %}
+
+ 🚌 {{ route }} | {{ stop_time if has_time else 'нет данных' }}{% if has_time %} ({{ diff }} мин){% endif %}
+
+#сенсор проверки, что осталось от 3 до 1 минуты до остановки сельская больница трамвая 10, используется в tg|ntf|tram10_rad-gor_<20m
+
+ - sensor:
+ - name: "tram10.raduga<3m"
+ state: >
+ {% set t = states('sensor.bustime_10_sereb_sb') %}
+ {% if t in ['unknown','unavailable',''] %}
+ false
+ {% else %}
+ {% set now_ts = now() %}
+ {% set arr = today_at(t) %}
+ {% if arr < now_ts %}
+ {% set arr = arr + timedelta(days=1) %}
+ {% endif %}
+ {% set diff = ((arr - now_ts).total_seconds() / 60) %}
+ {{ 1 <= diff <= 4 }}
+ {% endif %}
+
+#сенсоры сравнения координат автобуса и остановки sensor.bus34_stop_ub, используется в tg|ntf|bus34_ub_check
+ #34
+ - sensor:
+ - name: "bus34_stop_ub_gps_true"
+ state: >
+ {% set lat1 = state_attr('sensor.bus34_stop_univ','latitude') %}
+ {% set lon1 = state_attr('sensor.bus34_stop_univ','longitude') %}
+
+ {% set lat2 = state_attr('sensor.bustime_34_univ','y') %}
+ {% set lon2 = state_attr('sensor.bustime_34_univ','x') %}
+
+ {% if lat2 and lon2 %}
+ {{ distance(lat1, lon1, lat2, lon2) <= 0.02 }}
+ {% else %}
+ false
+ {% endif %}
+
+ #10
+ - sensor:
+ - name: "tram10_stop_kemdor_gps_true"
+ state: >
+ {% set lat1 = state_attr('sensor.tram10_stop_kemdor','latitude') %}
+ {% set lon1 = state_attr('sensor.tram10_stop_kemdor','longitude') %}
+
+ {% set lat2 = state_attr('sensor.bustime_10_kemdor','y') %}
+ {% set lon2 = state_attr('sensor.bustime_10_kemdor','x') %}
+
+ {% if lat2 and lon2 %}
+ {{ distance(lat1, lon1, lat2, lon2) <= 0.2 }}
+ {% else %}
+ false
+ {% endif %}
+
+
+#Сенсор с координатами
+ #34
+ - sensor:
+ - name: "bus34_stop_univ"
+ state: "ok"
+ attributes:
+ latitude: 55.344968
+ longitude: 86.127703
+
+
+ #10
+ #34
+ - sensor:
+ - name: "tram10_stop_kemdor"
+ state: "ok"
+ attributes:
+ latitude: 55.348193
+ longitude: 86.061649
+
+
+
+ automation:
+#####################################10#########################################
+##############################10Радуга-Город####################################
+
+###########################запуск автоматизации#################################
+
+ - alias: tg|ntf|tram10_rad-gor_ask_run
+ description: ""
+ mode: single
+ triggers:
+ - trigger: time
+ at: "22:00:00"
+ weekday:
+ - mon
+ - tue
+ - wed
+ - thu
+ - sun
+ action:
+ - action: input_datetime.set_datetime
+ metadata: {}
+ target:
+ entity_id: input_datetime.tram10_r_g_enable_time
+ data:
+ time: "07:15:00"
+ - action: automation.turn_on
+ metadata: {}
+ target:
+ entity_id: automation.tg_ntf_tram10_rad_gor_20m
+ - service: telegram_bot.send_message
+ data:
+ chat_id:
+ - "-1002006010424"
+ message: "🚌 Запустить автоматизацию уведомления трамвая 10?"
+ inline_keyboard:
+ - "▶ Запустить:/tram10_r_g_run, ❌ Не запускать:/tram10_r_g_skip"
+ - '{{''\U0001F552''}}Время:/toggle_bs_r_g_time, {{''\U0001F553''}}Сброс:/toggle_bs_r_g_cancel'
+
+
+ ## Управление временем запуска уведомления прихода трамвая 10 радуга-город
+ - id: tg|mn|tram10_start_time_raduga_gorod
+ alias: tg|mn|tram10_start_time_raduga_gorod
+ initial_state: true
+ trigger:
+ - platform: event
+ event_type: telegram_callback
+ event_data: {}
+ action:
+ - choose:
+ - conditions:
+ - condition: template
+ value_template: "{{ trigger.event.data.command == '/toggle_bs_r_g_time' }}"
+ sequence:
+ - service: telegram_bot.delete_message
+ data_template:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ - service: telegram_bot.send_message
+ data:
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: &msg_bs_t10_r_g |
+ {{'\U0001F30A'}}Выбор времени начала уведомлений: {{ states('input_datetime.tram10_r_g_enable_time') }}
+
+ inline_keyboard: &keyb_bs_t10_r_g
+ - '{{''\U0001F556''}}7:00:/toggle_bs_r_g_time7, {{''\U0001F557''}}8:00:/toggle_bs_r_g_time8'
+ - "▶ Запустить:/tram10_r_g_run, ❌ Не запускать:/tram10_r_g_skip"
+
+ - conditions:
+ - condition: template
+ value_template: "{{ trigger.event.data.command == '/toggle_bs_r_g_time7' }}"
+ sequence:
+ - service: input_datetime.set_datetime
+ data:
+ time: "07:00:00"
+ target:
+ entity_id: input_datetime.tram10_r_g_enable_time
+ - delay:
+ milliseconds: 500
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: |
+ {{"\U0001F4AC"}} Время установлено на 7:00
+ - service: telegram_bot.delete_message
+ data_template:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ - service: telegram_bot.send_message
+ data:
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: *msg_bs_t10_r_g
+ inline_keyboard: *keyb_bs_t10_r_g
+
+ - conditions:
+ - condition: template
+ value_template: "{{ trigger.event.data.command == '/toggle_bs_r_g_time8' }}"
+ sequence:
+ - service: input_datetime.set_datetime
+ data:
+ time: "08:00:00"
+ target:
+ entity_id: input_datetime.tram10_r_g_enable_time
+ - delay:
+ milliseconds: 500
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: |
+ {{"\U0001F4AC"}} Время установлено на 8:00
+ - service: telegram_bot.delete_message
+ data_template:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ - service: telegram_bot.send_message
+ data:
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: *msg_bs_t10_r_g
+ inline_keyboard: *keyb_bs_t10_r_g
+
+
+ - alias: tg|tram10_rad_gor_run
+ mode: single
+ trigger:
+ - platform: event
+ event_type: telegram_callback
+ event_data:
+ data: "/tram10_r_g_run"
+
+ action:
+ - service: automation.turn_on
+ target:
+ entity_id: automation.tg_ntf_tram10_rad_gor_20m
+
+ - service: telegram_bot.send_message
+ data:
+ chat_id:
+ - "-1002006010424"
+ message: "✅ Автоматизация трамвая 10 включена"
+
+
+ - alias: tg|tram10_rad_gor_skip
+ mode: single
+ trigger:
+ - platform: event
+ event_type: telegram_callback
+ event_data:
+ command: "/tram10_r_g_skip"
+ action:
+ - action: automation.turn_off
+ metadata: {}
+ target:
+ entity_id: automation.tg_ntf_tram10_rad_gor_20m
+ data:
+ stop_actions: true
+ - service: telegram_bot.send_message
+ data:
+ chat_id:
+ - "-1002006010424"
+ message: "❌Оповещения трамвая 10 Радуга-Город отключены"
+ inline_keyboard:
+ - "▶ Запустить:/tram10_r_g_run"
+
+
+
+ - alias: tg|ntf|tram10_rad-gor_<20m
+ description: ""
+ mode: single
+ triggers:
+ - trigger: state
+ entity_id:
+ - sensor.tram10_raduga_3m
+ from:
+ - "False"
+ to:
+ - "True"
+ for:
+ hours: 0
+ minutes: 0
+ seconds: 0
+ conditions:
+ - condition: template
+ value_template: >
+ {{ now().strftime('%H:%M') >=
+ states('input_datetime.tram10_r_g_enable_time')[0:5] }}
+ actions:
+ - action: telegram_bot.send_message
+ metadata: {}
+ data:
+ chat_id:
+ - "-1002006010424"
+ message: >-
+ 🚌 10 будет ~ {{ states('sensor.bustime_10_sereb_a') }}, следующий ~ {%
+ set t = states('sensor.bustime_10_sereb_sb') %}{% if t in
+ ['unknown','unavailable',''] %}нет данных{% else %}{% set base =
+ today_at(t) %}{% set plus = base + timedelta(minutes=10) %}{{
+ plus.strftime('%H:%M') }}{% endif %}
+ - action: automation.turn_off
+ metadata: {}
+ target:
+ entity_id: automation.tg_ntf_tram10_rad_gor_20m
+ data:
+ stop_actions: false
+ - delay:
+ hours: 0
+ minutes: 3
+ seconds: 0
+ milliseconds: 0
+ - action: automation.turn_on
+ metadata: {}
+ target:
+ entity_id: automation.tg_ntf_tram10_rad_gor_20m
+ data: {}
+
+
+ - alias: tg|ntf|tram10_rad-gor_<20m_off
+ description: ""
+ mode: single
+ triggers:
+ - trigger: zone
+ entity_id: device_tracker.google_maps_108918666344169166438
+ zone: zone.transport_raduga
+ event: leave
+ conditions:
+ - condition: state
+ entity_id: automation.tg_ntf_tram10_rad_gor_20m
+ state:
+ - "on"
+ actions:
+ - action: automation.turn_off
+ metadata: {}
+ target:
+ entity_id: automation.tg_ntf_tram10_rad_gor_20m
+ data:
+ stop_actions: true
+ - action: telegram_bot.send_message
+ metadata: {}
+ data:
+ chat_id:
+ - "-1002006010424"
+ message: >-
+ Вы покинули зону уведомлений транспорта на радуге - автоматизация
+ отключена
+
+##############################10Город-Радуга####################################
+
+ - alias: tg|ntf|tram10_kemdor_check
+ description: ""
+ mode: single
+ triggers:
+ - trigger: state
+ entity_id:
+ - sensor.bus34_stop_ub_gps_true
+ from: null
+ to:
+ - "True"
+ conditions: []
+ actions:
+ - action: telegram_bot.send_message
+ metadata: {}
+ data:
+ chat_id:
+ - "-1002006010424"
+ message: 🚌 34 проехал юбилейный
+
+#####################################34#########################################
+#################################город-радуга###################################
+
+ - alias: tg|ntf|bus34_ub_check
+ description: ""
+ mode: single
+ triggers:
+ - trigger: state
+ entity_id:
+ - sensor.tram10_stop_kemdor_gps_true
+ from: null
+ to:
+ - "True"
+ conditions: []
+ actions:
+ - action: telegram_bot.send_message
+ metadata: {}
+ data:
+ chat_id:
+ - "-1002006010424"
+ message: 🚌 10 проехал кемдор
+
+
+
+
diff --git a/includes/packages/controls_light.yaml b/includes/packages/controls_light.yaml
new file mode 100644
index 0000000..689c13a
--- /dev/null
+++ b/includes/packages/controls_light.yaml
@@ -0,0 +1,1069 @@
+controls_light:
+###################################################################################
+#диммер около кровати
+ ble_monitor:
+ devices:
+ - mac: 'F8:24:41:C5:DD:28'
+ name: 'dimmer_yeelight_room'
+ encryption_key: 'cfe177acf7c4b6b8ad9bdc7f'
+ reset_timer: 1
+
+
+###################################################################################
+
+#настройка времени суток || https://www.youtube.com/watch?v=oLxN0GHk_rk
+
+ #инпуты для ввода времени в интерфейсе
+ input_datetime:
+ #Основные
+ night_start:
+ name: INPT|night_start
+ has_date: false
+ has_time: true
+ night_stop:
+ name: INPT|night_stop
+ has_date: false
+ has_time: true
+
+ day_start:
+ name: INPT|day_start
+ has_date: false
+ has_time: true
+ day_stop:
+ name: INPT|day_stop
+ has_date: false
+ has_time: true
+
+ #дополнительные
+ night_lobby_start:
+ name: INPT|night_lobby_start
+ has_date: false
+ has_time: true
+ night_lobby_stop:
+ name: INPT|night_lobby_stop
+ has_date: false
+ has_time: true
+
+ day_lobby_start:
+ name: INPT|day_lobby_start
+ has_date: false
+ has_time: true
+ day_lobby_stop:
+ name: INPT|day_lobby_stop
+ has_date: false
+ has_time: true
+
+ #инпуты для ввода времени таймеров
+ bathroom_day_timer:
+ name: INPT|bathroom_day_timer
+ has_date: false
+ has_time: true
+ bathroom_night_timer:
+ name: INPT|bathroom_night_timer
+ has_date: false
+ has_time: true
+
+ lobby_day_timer:
+ name: INPT|lobby_day_timer
+ has_date: false
+ has_time: true
+ lobby_night_timer:
+ name: INPT|lobby_night_timer
+ has_date: false
+ has_time: true
+
+ room_day_timer:
+ name: INPT|room_day_timer
+ has_date: false
+ has_time: true
+ room_night_timer:
+ name: INPT|room_night_timer
+ has_date: false
+ has_time: true
+
+ kitchen_day_timer:
+ name: INPT|kitchen_day_timer
+ has_date: false
+ has_time: true
+ kitchen_night_timer:
+ name: INPT|kitchen_night_timer
+ has_date: false
+ has_time: true
+
+ #шаблонные сенсоры время суток
+ template:
+ - binary_sensor:
+ #основные
+ - name: night_time
+ unique_id: night_time
+ state: >
+ {% if states('input_datetime.night_start') < states('input_datetime.night_stop') %}
+ {{ states('input_datetime.night_start') <= now().strftime('%H:%M:%S') <= states('input_datetime.night_stop') }}
+ {% elif states('input_datetime.night_start') > states('input_datetime.night_stop') %}
+ {{states('input_datetime.night_start') <= now().strftime('%H:%M:%S') <= '23:59:59'
+ or '00:00:00' <= now().strftime('%H:%M:%S') <= states('input_datetime.night_stop')}}
+ {% endif %}
+ device_class: running
+
+ - name: day_time
+ unique_id: day_time
+ state: >
+ {% if states('input_datetime.day_start') < states('input_datetime.day_stop') %}
+ {{ states('input_datetime.day_start') <= now().strftime('%H:%M:%S') <= states('input_datetime.day_stop') }}
+ {% elif states('input_datetime.day_start') > states('input_datetime.day_stop') %}
+ {{states('input_datetime.day_start') <= now().strftime('%H:%M:%S') <= '23:59:59'
+ or '00:00:00' <= now().strftime('%H:%M:%S') <= states('input_datetime.day_stop')}}
+ {% endif %}
+ device_class: running
+
+ #дополнительные
+ - name: night_lobby_time
+ unique_id: night_lobby_time
+ state: >
+ {% if states('input_datetime.night_lobby_start') < states('input_datetime.night_lobby_stop') %}
+ {{ states('input_datetime.night_lobby_start') <= now().strftime('%H:%M:%S') <= states('input_datetime.night_lobby_stop') }}
+ {% elif states('input_datetime.night_lobby_start') > states('input_datetime.night_lobby_stop') %}
+ {{states('input_datetime.night_lobby_start') <= now().strftime('%H:%M:%S') <= '23:59:59'
+ or '00:00:00' <= now().strftime('%H:%M:%S') <= states('input_datetime.night_lobby_stop')}}
+ {% endif %}
+ device_class: running
+
+ - name: day_lobby_time
+ unique_id: day_lobby_time
+ state: >
+ {% if states('input_datetime.day_lobby_start') < states('input_datetime.day_lobby_stop') %}
+ {{ states('input_datetime.day_lobby_start') <= now().strftime('%H:%M:%S') <= states('input_datetime.day_lobby_stop') }}
+ {% elif states('input_datetime.day_lobby_start') > states('input_datetime.day_lobby_stop') %}
+ {{states('input_datetime.day_lobby_start') <= now().strftime('%H:%M:%S') <= '23:59:59'
+ or '00:00:00' <= now().strftime('%H:%M:%S') <= states('input_datetime.day_lobby_stop')}}
+ {% endif %}
+ device_class: running
+###################################################################################
+
+ # Сенсоры включенного света в комнатах
+ # Сенсоры включенного света кухня
+ - default_entity_id: binary_sensor.lighton_kitchen
+ name: Сенсор вкл свет кухня
+ state: '{{ is_state(''light.yeelink_ceilc_ff3a_light'', ''on'') or is_state(''light.yeelink_ceilc_ff3a_ambient_light'',
+ ''on'')}}'
+
+ # Сенсоры включенного света комната
+ - default_entity_id: binary_sensor.lighton_room
+ name: Сенсор вкл свет комната
+ state: '{{ is_state(''light.yeelink_ceiling19_d85c_light'', ''on'') or is_state(''light.yeelink_ceiling19_d85c_ambient_light'',
+ ''on'')}}'
+
+ # Сенсоры включенного света ванна
+ - default_entity_id: binary_sensor.lighton_bathroom
+ name: Сенсор вкл света ванная
+ state: '{{ is_state(''light.yeelink_ceilc_cc51_light'', ''on'') or is_state(''light.yeelink_ceilc_cc51_ambient_light'',
+ ''on'')}}'
+
+###################################################################################
+
+#комната
+ automation:
+ - alias: LGHT|Димер выкл весь свет
+ description: ""
+ trigger:
+ - platform: template
+ value_template: >-
+ {{(is_state('sensor.ble_dimmer_dimmer_yeelight_room', 'long press 6 steps'))}}
+ - platform: template
+ value_template: >-
+ {{(is_state('sensor.ble_dimmer_dimmer_yeelight_room', 'long press 8 steps'))}}
+ - platform: template
+ value_template: >-
+ {{(is_state('sensor.ble_dimmer_dimmer_yeelight_room', 'long press 10 steps'))}}
+ - platform: template
+ value_template: >-
+ {{(is_state('sensor.ble_dimmer_dimmer_yeelight_room', 'long press 11 steps'))}}
+ - platform: template
+ value_template: >-
+ {{(is_state('sensor.ble_dimmer_dimmer_yeelight_room', 'long press 12 steps'))}}
+ - platform: template
+ value_template: >-
+ {{(is_state('sensor.ble_dimmer_dimmer_yeelight_room', 'long press 13 steps'))}}
+ - platform: template
+ value_template: >-
+ {{(is_state('sensor.ble_dimmer_dimmer_yeelight_room', 'long press 14 steps'))}}
+ - platform: template
+ value_template: >-
+ {{(is_state('sensor.ble_dimmer_dimmer_yeelight_room', 'long press 15 steps'))}}
+ - platform: template
+ value_template: >-
+ {{(is_state('sensor.ble_dimmer_dimmer_yeelight_room', 'long press 16 steps'))}}
+ condition: []
+ action:
+ - service: scene.turn_on
+ target:
+ entity_id:
+ - scene.vannaia_vykl_svet
+ - scene.komnata_vykl_svet
+ - scene.kukhnia_vykl_svet
+ data: {}
+ - service: switch.turn_off
+ target:
+ entity_id:
+ - switch.glavnyi_vykliuchatel_prikhozhaia_left
+ - switch.glavnyi_vykliuchatel_prikhozhaia_right
+ - switch.rele_zerkalo_i_ventiliatsiia_l1
+ data: {}
+ mode: single
+
+ - alias: LGHT|btn_all_light_off
+ description: ""
+ mode: single
+ trigger:
+ - platform: state
+ entity_id: input_button.btn_vykliuchit_ves_svet
+ action:
+ - service: scene.turn_on
+ target:
+ entity_id:
+ - scene.vannaia_vykl_svet
+ - scene.komnata_vykl_svet
+ - scene.kukhnia_vykl_svet
+ data: {}
+ - service: switch.turn_off
+ target:
+ entity_id:
+ - switch.glavnyi_vykliuchatel_prikhozhaia_left
+ - switch.glavnyi_vykliuchatel_prikhozhaia_right
+ - switch.rele_zerkalo_i_ventiliatsiia_l1
+ data: {}
+
+ - alias: LGHT|mbchrg_off_gps_off
+ description: ""
+ mode: single
+ trigger:
+ - platform: state
+ entity_id:
+ - sensor.where_people
+ to: "False"
+ from: null
+ condition: []
+ action:
+ - service: switch.turn_off
+ target:
+ entity_id: switch.0xa4c138a1b1cd2be1
+ data: {}
+
+ - alias: LGHT|mbchrg_on_gps_on
+ description: ""
+ mode: single
+ trigger:
+ - platform: state
+ entity_id:
+ - sensor.where_people
+ from: null
+ to: "True"
+ condition: []
+ action:
+ - service: switch.turn_on
+ target:
+ entity_id: switch.0xa4c138a1b1cd2be1
+ data: {}
+
+ #стандартный свет комната
+ - alias: LGHT|room_std_on
+ description: ""
+ trigger:
+ - platform: device
+ domain: mqtt
+ device_id: 69804df32abfe4154281b2fc176ce519
+ type: action
+ subtype: double_left
+ discovery_id: 0x54ef44100017e9a7 action_double_left
+ condition: []
+ action:
+ - service: scene.turn_on
+ target:
+ entity_id: scene.komnata_osveshchenie_standart
+
+ - alias: LGHT|room_100
+ mode: single
+ trigger:
+ - platform: device
+ domain: mqtt
+ device_id: 69804df32abfe4154281b2fc176ce519
+ type: action
+ subtype: double_both
+ condition: []
+ action:
+ - service: scene.turn_on
+ metadata: {}
+ target:
+ entity_id: scene.lght_room_100
+
+ #красный свет вкл
+ - alias: LGHT|room_red_on
+ description: ""
+ trigger:
+ - platform: device
+ domain: mqtt
+ device_id: 69804df32abfe4154281b2fc176ce519
+ type: action
+ subtype: single_both
+ discovery_id: 0x54ef44100017e9a7 action_single_both
+ condition: []
+ action:
+ - service: scene.turn_on
+ target:
+ entity_id: scene.novaia_stsena
+ metadata: {}
+ mode: single
+
+ #синий свет вкл
+ - alias: LGHT|room_tv_on
+ description: ""
+ trigger:
+ - platform: device
+ domain: mqtt
+ device_id: 69804df32abfe4154281b2fc176ce519
+ type: action
+ subtype: double_right
+ discovery_id: 0x54ef44100017e9a7 action_double_right
+ condition: []
+ action:
+ - service: scene.turn_on
+ target:
+ entity_id: scene.komnata_ambilight_sinii
+ metadata: {}
+
+ - alias: LGHT|on\off_room_light
+ description: ""
+ trigger:
+ - platform: device
+ domain: mqtt
+ device_id: 69804df32abfe4154281b2fc176ce519
+ type: action
+ subtype: single_left
+ discovery_id: 0x54ef44100017e9a7 action_single_left
+ condition: []
+ action:
+ - choose:
+ - conditions:
+ - condition: state
+ entity_id: light.yeelight_ceiling19_0x159cb1c7
+ state: "off"
+ sequence:
+ - service: scene.turn_on
+ metadata: {}
+ target:
+ entity_id: scene.komnata_osveshchenie_standart
+ - conditions:
+ - condition: device
+ type: is_on
+ device_id: 4e045c09a0acc894d6fcf78850b92a5d
+ entity_id: 6062bbf1e0f2a8208bc4c2e288d19698
+ domain: light
+ sequence:
+ - service: scene.turn_on
+ metadata: {}
+ target:
+ entity_id: scene.komnata_vykl_svet
+
+ - alias: LGHT|on_room_night
+ description: ""
+ trigger:
+ - platform: device
+ domain: mqtt
+ device_id: 69804df32abfe4154281b2fc176ce519
+ type: action
+ subtype: single_right
+ discovery_id: 0x54ef44100017e9a7 action_single_right
+ condition: []
+ action:
+ - service: scene.turn_on
+ metadata: {}
+ target:
+ entity_id: scene.lght_room_night_on
+
+ # Таймер автоотключения комната
+ - alias: tmr|light_on_presencenone_room_on
+ initial_state: true
+ trigger:
+ # Условия для запуска таймера освещения
+ - platform: state
+ entity_id: binary_sensor.sensor_vkl_svet_bez_dvizheniia_komnata
+ to: 'on'
+ action:
+ - choose:
+ - conditions:
+ - condition: state
+ entity_id: binary_sensor.night_time
+ state: "on"
+ sequence:
+ - service: timer.start
+ entity_id: timer.timer_lighton_presencenone_room
+ data_template:
+ duration: "{{ states('input_datetime.room_night_timer') }}"
+ - choose:
+ - conditions:
+ - condition: state
+ entity_id: binary_sensor.day_time
+ state: "on"
+ sequence:
+ - service: timer.start
+ entity_id: timer.timer_lighton_presencenone_room
+ data_template:
+ duration: "{{ states('input_datetime.room_day_timer') }}"
+
+ # отключения света по таймеру комната
+ - alias: LGHT|room_off_timer_light
+ trigger:
+ - platform: state
+ entity_id:
+ - timer.timer_lighton_presencenone_room
+ from: null
+ for:
+ hours: 0
+ minutes: 0
+ seconds: 0
+ to: idle
+ condition:
+ - condition: template
+ value_template: |-
+ {{ (is_state('binary_sensor.54ef44e45e59_motion', 'off')
+ and is_state('binary_sensor.54ef44e327ba_motion', 'off')
+ and is_state('binary_sensor.54ef44e32e91_motion', 'off'))}}
+ action:
+ - service: scene.turn_on
+ target:
+ entity_id: scene.komnata_vykl_svet
+###################################################################################
+#ванная
+
+ - alias: LGHT|Bathroom_on_standart_light
+ description: ""
+ mode: single
+ trigger:
+ - platform: state
+ entity_id:
+ - binary_sensor.datchik_prisutstviia_vannaia_presence
+ from: "off"
+ to: "on"
+ condition:
+ - condition: state
+ entity_id: light.yeelink_ceilc_cc51_light
+ state: "off"
+ - condition: state
+ entity_id: light.yeelink_ceilc_cc51_ambient_light
+ state: "off"
+ action:
+ - service: switch.turn_on
+ metadata: {}
+ data: {}
+ target:
+ entity_id: switch.rele_zerkalo_i_ventiliatsiia_l1
+ - choose:
+ - conditions:
+ - condition: state
+ entity_id: binary_sensor.day_time
+ state: "on"
+ sequence:
+ - service: scene.turn_on
+ target:
+ entity_id: scene.vannaia_standartnyi_svet
+ metadata: {}
+ enabled: true
+ - service: switch.turn_on
+ metadata: {}
+ data: {}
+ target:
+ entity_id: switch.rele_zerkalo_i_ventiliatsiia_l1
+ enabled: false
+ - conditions:
+ - condition: or
+ conditions:
+ - condition: state
+ entity_id: light.yeelight_ceiling19_0x159cb1c7
+ state: "on"
+ - condition: state
+ entity_id: light.yeelight
+ state: "on"
+ - condition: state
+ entity_id: binary_sensor.night_time
+ state: "on"
+ sequence:
+ - service: scene.turn_on
+ target:
+ entity_id: scene.vannaia_standartnyi_svet
+ metadata: {}
+ - service: switch.turn_on
+ metadata: {}
+ data: {}
+ target:
+ entity_id: switch.rele_zerkalo_i_ventiliatsiia_l1
+ enabled: false
+
+ - alias: LGHT|Bathroom_on_night_light
+ description: ""
+ trigger:
+ - platform: state
+ entity_id:
+ - binary_sensor.datchik_prisutstviia_vannaia_presence
+ from: "off"
+ to: "on"
+ condition:
+ - condition: state
+ entity_id: light.yeelink_ceilc_cc51_light
+ state: "off"
+ - condition: state
+ entity_id: light.yeelink_ceilc_cc51_ambient_light
+ state: "off"
+ action:
+ - choose:
+ - conditions:
+ - condition: state
+ entity_id: binary_sensor.night_time
+ state: "on"
+ - condition: state
+ entity_id: light.yeelight_ceiling19_0x159cb1c7
+ state: "off"
+ - condition: state
+ entity_id: light.yeelight
+ state: "off"
+ sequence:
+ - service: scene.turn_on
+ target:
+ entity_id: scene.vannaia_nochnik_1
+ metadata: {}
+ - service: switch.turn_on
+ metadata: {}
+ data: {}
+ target:
+ entity_id: switch.rele_zerkalo_i_ventiliatsiia_l1
+ mode: single
+
+ - alias: LGHT|Bathroom_btn_on_light
+ description: ""
+ mode: single
+ triggers:
+ - domain: mqtt
+ device_id: bfa6bf0e6ae94405b731622e2a09cf6d
+ type: action
+ subtype: single_right
+ discovery_id: 0x54ef4410003abdb9 action_single_right
+ trigger: device
+ conditions:
+ - condition: state
+ entity_id: light.yeelink_ceilc_cc51_light
+ state: "off"
+ - condition: state
+ entity_id: light.yeelink_ceilc_cc51_ambient_light
+ state: "off"
+ actions:
+ - target:
+ entity_id: scene.vannaia_standartnyi_svet
+ metadata: {}
+ action: scene.turn_on
+ data: {}
+ - metadata: {}
+ data: {}
+ target:
+ entity_id: switch.rele_zerkalo_i_ventiliatsiia_l1
+ action: switch.turn_on
+
+ - alias: LGHT|Bathroom_btn_off_light
+ description: ""
+ mode: single
+ triggers:
+ - domain: mqtt
+ device_id: bfa6bf0e6ae94405b731622e2a09cf6d
+ type: action
+ subtype: single_right
+ discovery_id: 0x54ef4410003abdb9 action_single_right
+ trigger: device
+ conditions:
+ - condition: or
+ conditions:
+ - condition: state
+ entity_id: light.yeelink_ceilc_cc51_light
+ state: "on"
+ - condition: state
+ entity_id: light.yeelink_ceilc_cc51_ambient_light
+ state: "off"
+ actions:
+ - target:
+ entity_id: scene.vannaia_vykl_svet
+ metadata: {}
+ action: scene.turn_on
+ data: {}
+ - metadata: {}
+ data: {}
+ target:
+ entity_id: switch.rele_zerkalo_i_ventiliatsiia_l1
+ action: switch.turn_off
+
+
+ - alias: LGHT|Bathroom_dblclck_standart_light
+ description: ""
+ trigger:
+ - platform: device
+ domain: mqtt
+ device_id: bfa6bf0e6ae94405b731622e2a09cf6d
+ type: action
+ subtype: double_right
+ discovery_id: 0x54ef4410003abdb9 action_double_right
+ condition: []
+ action:
+ - service: switch.turn_on
+ metadata: {}
+ data: {}
+ target:
+ entity_id: switch.rele_zerkalo_i_ventiliatsiia_l1
+ - service: scene.turn_on
+ target:
+ entity_id: scene.vannaia_standartnyi_svet
+ metadata: {}
+ mode: single
+
+ # Старт таймера автоотключения ванная
+ - alias: tmr|light_on_presencenone_bathroom_on
+ description: ""
+ trigger:
+ - platform: state
+ entity_id: binary_sensor.sensor_vkl_svet_bez_dvizheniia_vannaia
+ to: "on"
+ condition: []
+ action:
+ - choose:
+ - conditions:
+ - condition: state
+ entity_id: binary_sensor.night_time
+ state: "on"
+ sequence:
+ - service: timer.start
+ entity_id: timer.timer_lighton_presencenone_bathroom
+ data_template:
+ duration: "{{ states('input_datetime.bathroom_night_timer') }}"
+ - choose:
+ - conditions:
+ - condition: state
+ entity_id: binary_sensor.day_time
+ state: "on"
+ sequence:
+ - service: timer.start
+ entity_id: timer.timer_lighton_presencenone_bathroom
+ data_template:
+ duration: "{{ states('input_datetime.bathroom_day_timer') }}"
+
+ # отключения света по таймеру ванна
+ - alias: LGHT|Bathroom_off_timer_light
+ trigger:
+ - platform: state
+ entity_id:
+ - timer.timer_lighton_presencenone_bathroom
+ from: null
+ for:
+ hours: 0
+ minutes: 0
+ seconds: 0
+ to: idle
+ condition:
+ - condition: state
+ entity_id: binary_sensor.datchik_prisutstviia_vannaia_presence
+ state: "off"
+ action:
+ - service: switch.turn_off
+ entity_id: switch.rele_zerkalo_i_ventiliatsiia_l1
+ - service: scene.turn_on
+ target:
+ entity_id: scene.vannaia_vykl_svet
+
+###################################################################################
+
+# Прихожая
+
+ - alias: LGHT|light_on_room_lobby_open_door
+ description: ""
+ mode: single
+ trigger:
+ - platform: state
+ entity_id:
+ - binary_sensor.e4aaec3747b2_contact
+ from: "off"
+ to: "on"
+ condition:
+ - condition: state
+ entity_id: binary_sensor.datchik_dvizheniia_prikhozhaia_occupancy
+ state: "off"
+ action:
+ - choose:
+ - conditions:
+ - condition: state
+ entity_id: binary_sensor.day_lobby_time
+ state: "on"
+ sequence:
+ - service: switch.turn_on
+ target:
+ entity_id: switch.glavnyi_vykliuchatel_prikhozhaia_right
+ data: {}
+ - if:
+ - condition: state
+ entity_id: binary_sensor.54ef44e45e59_light
+ state: "off"
+ - condition: state
+ entity_id: sensor.all_motion
+ state: "False"
+ for:
+ hours: 1
+ minutes: 0
+ seconds: 0
+ then:
+ - service: scene.turn_on
+ metadata: {}
+ target:
+ entity_id: scene.komnata_osveshchenie_standart
+ - conditions:
+ - condition: state
+ entity_id: binary_sensor.night_lobby_time
+ state: "on"
+ sequence:
+ - service: switch.turn_on
+ data: {}
+ target:
+ entity_id: switch.glavnyi_vykliuchatel_prikhozhaia_left
+
+ - alias: LGHT|btn_lobby_light_on/off_night
+ description: ""
+ trigger:
+ - platform: device
+ domain: mqtt
+ device_id: 975fb5853727f1fa4279bac09fd7fb6b
+ type: action
+ subtype: double_left
+ discovery_id: 0x00158d0006c6bca8 action_double_left
+ condition: []
+ action:
+ - service: switch.toggle
+ metadata: {}
+ data: {}
+ target:
+ entity_id: switch.glavnyi_vykliuchatel_prikhozhaia_left
+ mode: single
+
+ - alias: LGHT|btn_lobby_light_on/off_day
+ description: ""
+ trigger:
+ - platform: device
+ domain: mqtt
+ device_id: 975fb5853727f1fa4279bac09fd7fb6b
+ type: action
+ subtype: single_left
+ discovery_id: 0x00158d0006c6bca8 action_single_left
+ condition: []
+ action:
+ - service: switch.toggle
+ metadata: {}
+ data: {}
+ target:
+ entity_id: switch.glavnyi_vykliuchatel_prikhozhaia_right
+ mode: single
+
+ - alias: LGHT|lobby_light_on_day_motion
+ description: ""
+ trigger:
+ - platform: state
+ entity_id:
+ - binary_sensor.datchik_dvizheniia_prikhozhaia_occupancy
+ to: "on"
+ condition:
+ - condition: state
+ entity_id: binary_sensor.day_lobby_time
+ state: "on"
+ action:
+ - service: switch.turn_on
+ metadata: {}
+ data: {}
+ target:
+ entity_id: switch.glavnyi_vykliuchatel_prikhozhaia_right
+ mode: single
+
+ - alias: LGHT|lobby_light_on_night_motion
+ description: ""
+ trigger:
+ - platform: state
+ entity_id:
+ - binary_sensor.datchik_dvizheniia_prikhozhaia_occupancy
+ to: "on"
+ condition:
+ - condition: state
+ entity_id: binary_sensor.night_lobby_time
+ state: "on"
+ action:
+ - service: switch.turn_on
+ metadata: {}
+ data: {}
+ target:
+ entity_id: switch.glavnyi_vykliuchatel_prikhozhaia_left
+ mode: single
+
+ - alias: LGHT|lobby_clck_all_light_off
+ mode: single
+ trigger:
+ - platform: device
+ domain: mqtt
+ device_id: 975fb5853727f1fa4279bac09fd7fb6b
+ type: action
+ subtype: single_right
+ condition: []
+ action:
+ - service: scene.turn_on
+ target:
+ entity_id:
+ - scene.komnata_vykl_svet
+ data: {}
+ - service: switch.turn_off
+ target:
+ entity_id:
+ - switch.glavnyi_vykliuchatel_prikhozhaia_left
+ - switch.glavnyi_vykliuchatel_prikhozhaia_right
+ data: {}
+
+ # отключения света по таймеру коридор
+ - alias: LGHT|lobby_off_timer_light
+ description: ""
+ mode: single
+ trigger:
+ - platform: state
+ entity_id:
+ - timer.timer_lighton_presencenone_lobby
+ from: null
+ for:
+ hours: 0
+ minutes: 0
+ seconds: 0
+ to: idle
+ condition:
+ - condition: state
+ entity_id: binary_sensor.datchik_dvizheniia_prikhozhaia_occupancy
+ state: "off"
+ action:
+ - service: switch.turn_off
+ metadata: {}
+ data: {}
+ target:
+ entity_id:
+ - switch.glavnyi_vykliuchatel_prikhozhaia_left
+ - switch.glavnyi_vykliuchatel_prikhozhaia_right
+
+ - alias: LGHT|btn_left_wifi_on_light_room
+ description: ""
+ mode: single
+ triggers:
+ - domain: mqtt
+ device_id: 975fb5853727f1fa4279bac09fd7fb6b
+ type: action
+ subtype: hold_left
+ discovery_id: 0x00158d0006c6bca8 action_hold_left
+ trigger: device
+ conditions: []
+ actions:
+ - target:
+ entity_id: scene.komnata_osveshchenie_standart
+ metadata: {}
+ action: scene.turn_on
+
+
+
+ # Таймер автоотключения коридор
+ - alias: tmr|light_on_presencenone_lobby_on
+ initial_state: true
+ trigger:
+ # Условия для запуска таймера освещения
+ - platform: state
+ entity_id: binary_sensor.sensor_vkl_svet_bez_dvizheniia_koridor
+ to: 'on'
+ action:
+ - choose:
+ - conditions:
+ - condition: state
+ entity_id: binary_sensor.night_lobby_time
+ state: "on"
+ sequence:
+ - service: timer.start
+ entity_id: timer.timer_lighton_presencenone_lobby
+ data_template:
+ duration: "{{ states('input_datetime.lobby_night_timer') }}"
+ - choose:
+ - conditions:
+ - condition: state
+ entity_id: binary_sensor.day_lobby_time
+ state: "on"
+ sequence:
+ - service: timer.start
+ entity_id: timer.timer_lighton_presencenone_lobby
+ data_template:
+ duration: "{{ states('input_datetime.lobby_day_timer') }}"
+#========================================================================================
+
+#Кухня
+
+ - alias: LGHT|on_btnclc_kitchen
+ description: ""
+ trigger:
+ - platform: device
+ domain: mqtt
+ device_id: 3477021b47adcf79dc87c91f73cc9183
+ type: action
+ subtype: single
+ discovery_id: 0x54ef4410000f268c action_single
+ condition: []
+ action:
+ - choose:
+ - conditions:
+ - condition: state
+ entity_id: light.yeelink_ceilc_ff3a_light
+ state: "off"
+ - condition: state
+ entity_id: light.yeelink_ceilc_ff3a_ambient_light
+ state: "off"
+ sequence:
+ - service: scene.turn_on
+ target:
+ entity_id: scene.svet_v_kukhne_100
+ metadata: {}
+ - conditions:
+ - condition: or
+ conditions:
+ - condition: state
+ entity_id: light.yeelink_ceilc_ff3a_light
+ state: "on"
+ - condition: state
+ entity_id: light.yeelink_ceilc_ff3a_ambient_light
+ state: "on"
+ sequence:
+ - service: scene.turn_on
+ metadata: {}
+ target:
+ entity_id: scene.kukhnia_vykl_svet
+
+ - alias: LGHT|kitchen_on_lght<50
+ description: ""
+ mode: single
+ trigger:
+ - platform: state
+ entity_id:
+ - binary_sensor.datchik_prisutstviia_kukhnia_presence
+ from: "off"
+ to: "on"
+ condition:
+ - condition: numeric_state
+ entity_id: sensor.datchik_osveshcheniia_illuminance
+ below: 60
+ - condition: state
+ entity_id: light.yeelink_ceilc_ff3a_light
+ state: "off"
+ - condition: state
+ entity_id: light.yeelink_ceilc_ff3a_ambient_light
+ state: "off"
+ action:
+ - choose:
+ - conditions:
+ - condition: state
+ entity_id: binary_sensor.day_time
+ state: "on"
+ - condition: state
+ entity_id: light.yeelink_ceilc_ff3a_light
+ state: "off"
+ - condition: state
+ entity_id: light.yeelink_ceilc_ff3a_ambient_light
+ state: "off"
+ sequence:
+ - service: scene.turn_on
+ target:
+ entity_id: scene.svet_v_kukhne_100
+ metadata: {}
+ enabled: true
+ - conditions:
+ - condition: state
+ entity_id: binary_sensor.night_time
+ state: "on"
+ - condition: state
+ entity_id: light.yeelink_ceilc_ff3a_light
+ state: "off"
+ - condition: state
+ entity_id: light.yeelink_ceilc_ff3a_ambient_light
+ state: "off"
+ - condition: or
+ conditions:
+ - condition: state
+ entity_id: light.yeelight_ceiling19_0x159cb1c7
+ state: "on"
+ - condition: state
+ entity_id: light.yeelight_ceilc_0x19f138fc
+ state: "on"
+ sequence:
+ - service: scene.turn_on
+ target:
+ entity_id: scene.svet_v_kukhne_100
+ metadata: {}
+ - conditions:
+ - condition: state
+ entity_id: binary_sensor.night_time
+ state: "on"
+ - condition: state
+ entity_id: light.yeelight_ceiling19_0x159cb1c7
+ state: "off"
+ - condition: state
+ entity_id: light.yeelight_ceilc_0x19f138fc
+ state: "off"
+ sequence:
+ - service: scene.turn_on
+ metadata: {}
+ target:
+ entity_id: scene.kukhnia_noch
+
+ # Таймер автоотключения кухня
+ - alias: tmr|light_on_presencenone_kitchen_on
+ initial_state: true
+ trigger:
+ # Условия для запуска таймера освещения
+ - platform: state
+ entity_id: binary_sensor.sensor_vkl_svet_bez_dvizheniia_kukhnia
+ to: 'on'
+ action:
+ - choose:
+ - conditions:
+ - condition: state
+ entity_id: binary_sensor.night_time
+ state: "on"
+ sequence:
+ - service: timer.start
+ entity_id: timer.timer_lighton_presencenone_kitchen
+ data_template:
+ duration: "{{ states('input_datetime.kitchen_night_timer') }}"
+ - choose:
+ - conditions:
+ - condition: state
+ entity_id: binary_sensor.day_time
+ state: "on"
+ sequence:
+ - service: timer.start
+ entity_id: timer.timer_lighton_presencenone_kitchen
+ data_template:
+ duration: "{{ states('input_datetime.kitchen_day_timer') }}"
+
+ # отключения света по таймеру кухня
+ - alias: LGHT|kitchen_off_timer_light
+ trigger:
+ - platform: state
+ entity_id:
+ - timer.timer_lighton_presencenone_kitchen
+ from: null
+ for:
+ hours: 0
+ minutes: 0
+ seconds: 0
+ to: idle
+ condition:
+ - condition: state
+ entity_id: binary_sensor.datchik_prisutstviia_kukhnia_presence
+ state: "off"
+ action:
+ - service: scene.turn_on
+ target:
+ entity_id: scene.kukhnia_vykl_svet
\ No newline at end of file
diff --git a/includes/packages/dishwasher.yaml b/includes/packages/dishwasher.yaml
new file mode 100644
index 0000000..0638133
--- /dev/null
+++ b/includes/packages/dishwasher.yaml
@@ -0,0 +1,268 @@
+dishwasher:
+
+ # инпут для ввода времени отложенного старта
+ input_datetime:
+ dishwasher_startinrelative:
+ name: INPT|dishwasher_startinrelative
+ has_date: false
+ has_time: true
+
+ input_boolean:
+ dishwasher_needs_unloading:
+ name: Нужно разобрать посуду
+ icon: mdi:dishwasher
+
+ script:
+ dw_start_select_program:
+ alias: dw_start_select_program_relative
+ sequence:
+ - action: homeconnect_ws.start_program
+ data:
+ device_id: 0166c54489231f7edaf804c02ab6a652
+ start_in:
+ hours: "{{ state_attr('input_datetime.dishwasher_startinrelative', 'hour') }}"
+ minutes: "{{ state_attr('input_datetime.dishwasher_startinrelative', 'minute') }}"
+ seconds: "{{ state_attr('input_datetime.dishwasher_startinrelative', 'second') }}"
+
+ dw_stop_program:
+ alias: dw_stop_program
+ sequence:
+ - action: button.press
+ target:
+ entity_id: button.bosch_dishwasher_abort
+ - service: input_datetime.set_datetime
+ data:
+ time: "00:00:00"
+ target:
+ entity_id: input_datetime.dishwasher_startinrelative
+
+ dw_install_auto_45_65_extradry_extrarinse:
+ alias: dw_install_auto_45_65_extradry_extrarinse
+ sequence:
+ - service: select.select_option
+ data:
+ entity_id: select.bosch_dishwasher_selected_program
+ option: dishcare_dishwasher_program_auto2
+
+ dw_install_quick_65_extradry_extrarinse:
+ alias: dw_install_quick_65_extradry_extrarinse
+ sequence:
+ - service: select.select_option
+ data:
+ entity_id: select.bosch_dishwasher_selected_program
+ option: dishcare_dishwasher_program_quick65
+
+ dw_install_int_70_extradry_extrarinse:
+ alias: dw_install_int_70_extradry_extrarinse
+ sequence:
+ - service: select.select_option
+ data:
+ entity_id: select.bosch_dishwasher_selected_program
+ option: dishcare_dishwasher_program_intensiv70
+
+ dw_install_eco_50_extradry_extrarinse:
+ alias: dw_install_eco_50_extradry_extrarinse
+ sequence:
+ - service: select.select_option
+ data:
+ entity_id: select.bosch_dishwasher_selected_program
+ option: dishcare_dishwasher_program_eco50
+
+ dw_install_care:
+ alias: dw_install_care
+ sequence:
+ - service: select.select_option
+ data:
+ entity_id: select.bosch_dishwasher_selected_program
+ option: dishcare_dishwasher_program_machinecare
+
+ automation:
+
+ # ==========================================
+ # --- СБРОС ТАЙМЕРА ПРИ СТАРТЕ ---
+ # ==========================================
+ - id: dw_refresh_inp_dttm_dw
+ alias: "dw|refresh_inp_dttm_dw"
+ description: "Сброс времени отложенного старта"
+ mode: single
+ trigger:
+ - platform: state
+ entity_id: sensor.bosch_dishwasher_operation_state
+ from: null
+ to: "Run"
+ - platform: state
+ entity_id: sensor.bosch_dishwasher_operation_state
+ from: null
+ to: "DelayedStart"
+ action:
+ - service: input_datetime.set_datetime
+ data:
+ time: "00:00:00"
+ target:
+ entity_id: input_datetime.dishwasher_startinrelative
+
+ # ==========================================
+ # --- УВЕДОМЛЕНИЕ О ЗАВЕРШЕНИИ И РАЗБОРЕ ---
+ # ==========================================
+ - id: ntf_tg_dw_end_wash
+ alias: "ntf|tg|dw|end_wash"
+ description: "Уведомление о завершении мойки с проверкой открытия дверцы"
+ mode: single
+ trigger:
+ - platform: state
+ entity_id: sensor.bosch_dishwasher_operation_state
+ from: "Run"
+ to: "Finished"
+ action:
+ - service: input_boolean.turn_on
+ target:
+ entity_id: input_boolean.dishwasher_needs_unloading
+
+ - repeat:
+ sequence:
+ # Отправляем уведомление в обе группы!
+ - service: telegram_bot.send_message
+ data:
+ chat_id:
+ - -1002006010424
+ - -1003233671944
+ message: "✅ Мойка посуды завершена! Необходимо разобрать её."
+ parse_mode: html
+ inline_keyboard:
+ - '🌊 Посудомойка:/dw_control'
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ # Ждем открытия дверцы до 3 часов
+ - wait_for_trigger:
+ - platform: state
+ entity_id: binary_sensor.bosch_dishwasher_door
+ to: "on"
+ timeout: "03:00:00"
+ continue_on_timeout: true
+
+ # Если дверцу открыли
+ - choose:
+ - conditions:
+ - condition: state
+ entity_id: binary_sensor.bosch_dishwasher_door
+ state: "on"
+ sequence:
+ - delay: "00:01:00"
+ # Проверяем, что она всё ещё открыта (посуду разбирают)
+ - condition: state
+ entity_id: binary_sensor.bosch_dishwasher_door
+ state: "on"
+ - service: telegram_bot.send_message
+ data:
+ chat_id:
+ - -1002006010424
+ - -1003233671944
+ message: "🎉 Посудомойка успешно разобрана!"
+ parse_mode: html
+ - service: input_boolean.turn_off
+ target:
+ entity_id: input_boolean.dishwasher_needs_unloading
+ until:
+ - condition: state
+ entity_id: binary_sensor.bosch_dishwasher_door
+ state: "on"
+ for:
+ minutes: 1
+
+ # ==========================================
+ # --- КОМАНДА: УСТАНОВКА ТАЙМЕРА (/time) ---
+ # ==========================================
+ - id: dw_install_time_startinrelative
+ alias: "dw|install_time_startinrelative"
+ mode: single
+ trigger:
+ - platform: event
+ event_type: telegram_command
+ event_data:
+ command: "/time"
+ - platform: event
+ event_type: telegram_command
+ event_data:
+ command: "/time@ha_dddennnisss_bot"
+ action:
+ - choose:
+ # Вариант 1: формат HH:MM (например /time 14:30)
+ - conditions: >
+ {{ trigger.event.data.args is defined and
+ trigger.event.data.args | length > 0 and
+ ':' in trigger.event.data.args[0] }}
+ sequence:
+ - variables:
+ time_parts: "{{ trigger.event.data.args[0].split(':') }}"
+ - service: input_datetime.set_datetime
+ data:
+ time: "{{ '%02d:%02d:00' | format(time_parts[0] | int, time_parts[1] | int) }}"
+ target:
+ entity_id: input_datetime.dishwasher_startinrelative
+ - service: telegram_bot.send_message
+ data:
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: "✅ Отложенный запуск через {{ '%02d:%02d' | format(time_parts[0] | int, time_parts[1] | int) }}"
+ parse_mode: html
+ inline_keyboard:
+ - '▶️ Старт программы:/toggle_dw_start, ❌ Сброс пуска:/toggle_dw_delay_clear'
+ - '🔙 Меню:/menu_back, 🌊 Посудомойка:/dw_control'
+
+ # Вариант 2: только минуты (например /time 45)
+ - conditions: >
+ {{ trigger.event.data.args is defined and
+ trigger.event.data.args | length > 0 and
+ trigger.event.data.args[0] | int(default=0) > 0 and
+ ':' not in trigger.event.data.args[0] }}
+ sequence:
+ - variables:
+ minutes_only: "{{ trigger.event.data.args[0] | int }}"
+ target_hour: "{{ (minutes_only // 60) % 24 }}"
+ target_minute: "{{ minutes_only % 60 }}"
+ - service: input_datetime.set_datetime
+ data:
+ time: "{{ '%02d:%02d:00' | format(target_hour, target_minute) }}"
+ target:
+ entity_id: input_datetime.dishwasher_startinrelative
+ - service: telegram_bot.send_message
+ data:
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: "✅ Отложенный запуск через {{ '%02d:%02d' | format(target_hour, target_minute) }}"
+ parse_mode: html
+ inline_keyboard:
+ - '▶️ Старт программы:/toggle_dw_start, ❌ Сброс пуска:/toggle_dw_delay_clear'
+ - '🔙 Меню:/menu_back, 🌊 Посудомойка:/dw_control'
+
+ # Ошибка: неверный формат
+ default:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: "⚠️ Укажите время в правильном формате:\n/time 14:30 (часы:минуты)\nили\n/time 45 (только минуты)"
+ parse_mode: html
+
+ # ==========================================
+ # --- УВЕДОМЛЕНИЕ: МАЛО СОЛИ ---
+ # ==========================================
+ - id: ntf_tg_dw_salt_off
+ alias: "ntf|tg|dw_salt_off"
+ description: "Каждые 6 часов уведомлять, если соль закончилась"
+ trigger:
+ - platform: time_pattern
+ hours: "/6"
+ condition:
+ - condition: state
+ entity_id: sensor.bosch_dishwasher_salt
+ state: "nearly_empty"
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id:
+ - -1002006010424
+ - -1003233671944
+ parse_mode: html
+ message: |
+ 🧂❌ Внимание! Соль в посудомоечной машине почти закончилась.
+ Пожалуйста, пополните резервуар как можно скорее.
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
\ No newline at end of file
diff --git a/includes/packages/fun.yaml b/includes/packages/fun.yaml
new file mode 100644
index 0000000..e0ac57f
--- /dev/null
+++ b/includes/packages/fun.yaml
@@ -0,0 +1,202 @@
+fun:
+
+####################Таймеры###############################
+ timer:
+ vent_work:
+ name: Вытяжка в ванной – время работы
+ duration: "00:20:00"
+
+ vent_cooldown:
+ name: Вытяжка в ванной – время отдыха
+ duration: "01:00:00"
+
+####################Автоматизации###############################
+
+ automation:
+
+ - alias: Вытяжка в ванной – умное включение
+ mode: single
+ trigger:
+ - platform: numeric_state
+ entity_id: sensor.datchik_temperatury_i_vlazhnosti_vanna_humidity
+ above: 50
+
+ - platform: state
+ entity_id: binary_sensor.datchik_prisutstviia_vannaia_presence
+ to: "on"
+ for: "00:10:00"
+
+ condition:
+ - condition: state
+ entity_id: timer.vent_cooldown
+ state: "idle"
+
+ - condition: or
+ conditions:
+ # Лето и влажность > 50
+ - condition: and
+ conditions:
+ - condition: template
+ value_template: "{{ now().month in [6,7,8] }}"
+ - condition: numeric_state
+ entity_id: sensor.datchik_temperatury_i_vlazhnosti_vanna_humidity
+ above: 50
+
+ # Не лето и влажность > 60
+ - condition: and
+ conditions:
+ - condition: template
+ value_template: "{{ now().month not in [6,7,8] }}"
+ - condition: numeric_state
+ entity_id: sensor.datchik_temperatury_i_vlazhnosti_vanna_humidity
+ above: 60
+
+ # Или присутствие
+ - condition: state
+ entity_id: binary_sensor.datchik_prisutstviia_vannaia_presence
+ state: "on"
+
+ action:
+ - service: switch.turn_on
+ target:
+ entity_id: switch.rele_zerkalo_i_ventiliatsiia_l2
+
+ - alias: Вытяжка в ванной – старт таймера при включении
+ mode: restart
+ trigger:
+ - platform: state
+ entity_id: switch.rele_zerkalo_i_ventiliatsiia_l2
+ to: "on"
+
+ action:
+ - service: timer.start
+ target:
+ entity_id: timer.vent_work
+
+ - alias: Вытяжка в ванной – выключение и cooldown
+ mode: restart
+ trigger:
+ - platform: event
+ event_type: timer.finished
+ event_data:
+ entity_id: timer.vent_work
+
+ action:
+ - service: switch.turn_off
+ target:
+ entity_id: switch.rele_zerkalo_i_ventiliatsiia_l2
+
+ - service: timer.start
+ target:
+ entity_id: timer.vent_cooldown
+
+
+ - alias: Вытяжка в ванной – периодическая проверка влажности
+ mode: single
+ trigger:
+ # После перезапуска Home Assistant
+ - platform: homeassistant
+ event: start
+
+ # Периодическая проверка каждые 5 минут
+ - platform: time_pattern
+ minutes: "/5"
+
+ condition:
+ # Вентиляция сейчас выключена
+ - condition: state
+ entity_id: switch.rele_zerkalo_i_ventiliatsiia_l2
+ state: "off"
+
+ # Таймер отдыха закончился
+ - condition: state
+ entity_id: timer.vent_cooldown
+ state: "idle"
+
+ # Влажность выше порога по сезонам
+ - condition: or
+ conditions:
+
+ # Лето → >50%
+ - condition: and
+ conditions:
+ - condition: template
+ value_template: "{{ now().month in [6,7,8] }}"
+ - condition: numeric_state
+ entity_id: sensor.datchik_temperatury_i_vlazhnosti_vanna_humidity
+ above: 50
+
+ # Не лето → >60%
+ - condition: and
+ conditions:
+ - condition: template
+ value_template: "{{ now().month not in [6,7,8] }}"
+ - condition: numeric_state
+ entity_id: sensor.datchik_temperatury_i_vlazhnosti_vanna_humidity
+ above: 60
+
+ action:
+ - service: switch.turn_on
+ target:
+ entity_id: switch.rele_zerkalo_i_ventiliatsiia_l2
+
+
+ - alias: Вытяжка в ванной – резкий рост влажности
+ mode: restart
+
+ trigger:
+ - platform: state
+ entity_id: sensor.datchik_temperatury_i_vlazhnosti_vanna_humidity
+
+ condition:
+ - condition: template
+ value_template: >
+ {% if trigger.from_state is none or trigger.to_state is none %}
+ false
+ {% else %}
+ {% set from_s = trigger.from_state.state %}
+ {% set to_s = trigger.to_state.state %}
+ {% if from_s in ['unknown','unavailable','none','']
+ or to_s in ['unknown','unavailable','none',''] %}
+ false
+ {% else %}
+ {{ (to_s | float - from_s | float) >= 15 }}
+ {% endif %}
+ {% endif %}
+
+ action:
+ - choose:
+
+ # Вытяжка уже работает → +10 минут
+ - conditions:
+ - condition: state
+ entity_id: switch.rele_zerkalo_i_ventiliatsiia_l2
+ state: "on"
+ sequence:
+ - variables:
+ remaining: "{{ state_attr('timer.vent_work','remaining') }}"
+
+ - service: timer.start
+ target:
+ entity_id: timer.vent_work
+ data:
+ duration: >
+ {% if remaining is none %}
+ 00:10:00
+ {% else %}
+ {{ (as_timedelta(remaining) + timedelta(minutes=10)) }}
+ {% endif %}
+
+ # Вытяжка выключена → включить на 20 минут (игнор cooldown)
+ default:
+ - service: switch.turn_on
+ target:
+ entity_id: switch.rele_zerkalo_i_ventiliatsiia_l2
+
+ - service: timer.start
+ target:
+ entity_id: timer.vent_work
+ data:
+ duration: "00:20:00"
+
+
diff --git a/includes/packages/intercom.yaml* b/includes/packages/intercom.yaml*
new file mode 100644
index 0000000..ae77f62
--- /dev/null
+++ b/includes/packages/intercom.yaml*
@@ -0,0 +1,156 @@
+intercom:
+ shell_command:
+ update_goodline_token: "python3 /config/scripts/update_goodline_token.py {{ code }}"
+ open_goodline_door: 'curl -s -X GET "https://api-video.goodline.info/ords/mobile/onlinedozor/gates/Kemerovo_Serebryanyy_bor_4a_Podezd_1/open-door" -H "token: $(cat /config/scripts/goodline_token.txt)" -H "origin: https://video.online-dozor.ru" -H "referer: https://video.online-dozor.ru/" -H "user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" -H "accept: application/json, text/plain, */*"'
+
+ command_line:
+ - sensor:
+ name: "Goodline Camera URL"
+ unique_id: goodline_cam_url
+ command: "python3 /config/scripts/get_camera.py"
+ scan_interval: 300
+
+ template:
+ - sensor:
+ - name: "Расстояние до подъезда"
+ unique_id: distance_to_intercom
+ unit_of_measurement: "м"
+ state: >
+ {{ distance('device_tracker.google_maps_108918666344169166438', 'zone.intercom') | multiply(1000) | round(0) }}
+ icon: mdi:map-marker-distance
+
+ - name: "Дистанция (Телефон)"
+ unique_id: distance_to_intercom_phone
+ unit_of_measurement: "м"
+ state: >
+ {{ distance('device_tracker.cph2573_2', 'zone.intercom') | multiply(1000) | round(0) }}
+ icon: mdi:cellphone-marker
+
+ input_boolean:
+ intercom_auto_open:
+ name: "Автооткрытие двери"
+ icon: mdi:door-open
+
+ automation:
+ # ==========================================
+ # 1. ПЕРЕХВАТ СМС (Работает ВСЕГДА)
+ # ==========================================
+ - id: catch_onlinedozor_sms_webhook
+ alias: "sms|catch_onlinedozor_code"
+ mode: single
+ trigger:
+ - platform: webhook
+ webhook_id: "goodline_sms_hook"
+ allowed_methods: [POST]
+ local_only: true
+ action:
+ - variables:
+ sms_code: "{{ trigger.json.text | regex_findall_index('[0-9]{4}') }}"
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: "🔑 Код: {{ sms_code }}"
+ - service: shell_command.update_goodline_token
+ data:
+ code: "{{ sms_code }}"
+
+ # ==========================================
+ # 2. ВКЛЮЧЕНИЕ ТОЧНОГО GPS (Только если Авто ВКЛ)
+ # ==========================================
+ - id: turn_on_high_accuracy_at_zone
+ alias: "gps|turn_on_at_home_high_zone"
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.cph2573_2
+ zone: zone.gps_home_high
+ event: enter
+ - platform: state
+ entity_id: input_boolean.intercom_auto_open
+ to: "on"
+ condition:
+ - condition: state
+ entity_id: input_boolean.intercom_auto_open
+ state: "on"
+ - condition: zone
+ entity_id: device_tracker.cph2573_2
+ zone: zone.gps_home_high
+ - condition: template
+ value_template: "{{ not is_state('binary_sensor.oneplus12_high_accuracy_mode', 'on') }}"
+ action:
+ - service: notify.mobile_app_oneplus12
+ data:
+ message: "command_high_accuracy_mode"
+ data:
+ command: "turn_on"
+ ttl: 0
+ priority: high
+
+ # ==========================================
+ # 3. АВТООТКРЫТИЕ ДВЕРИ (Тройное с кнопками)
+ # ==========================================
+ - id: auto_open_at_intercom_zone
+ alias: "intercom|open_at_zone"
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.cph2573_2
+ zone: zone.intercom
+ event: enter
+ condition:
+ - condition: state
+ entity_id: input_boolean.intercom_auto_open
+ state: "on"
+ - condition: template
+ value_template: "{{ this.attributes.last_triggered == none or (now() - this.attributes.last_triggered).total_seconds() > 300 }}"
+ action:
+ # Цикл открытия двери: 3 раза с интервалом 7 секунд
+ - repeat:
+ count: 7
+ sequence:
+ - service: shell_command.open_goodline_door
+ # Ждем 7 секунд перед следующим открытием (кроме последнего раза)
+ - condition: template
+ value_template: "{{ repeat.index < 3 }}"
+ - delay:
+ seconds: 5
+
+ # Уведомление с кнопками управления
+ - service: telegram_bot.send_message
+ data:
+ target: -1002006010424
+ parse_mode: html
+ message: "🏠 Зона INTERCOM достигнута!\nДверь открыта 3 раза с интервалом 7 сек."
+ inline_keyboard:
+ - "🔔 Домофон:/intercom_menu"
+ - "🏠 Главное меню:/menu_back"
+
+ # Выключение точного GPS для экономии заряда
+ - service: notify.mobile_app_oneplus12
+ data:
+ message: "command_high_accuracy_mode"
+ data:
+ command: "turn_off"
+ ttl: 0
+ priority: high
+
+ # ==========================================
+ # 4. ВЫКЛЮЧЕНИЕ GPS ПРИ ВЫХОДЕ (Работает ВСЕГДА для экономии заряда)
+ # ==========================================
+ - id: turn_off_high_accuracy_on_leave
+ alias: "gps|turn_off_on_leave"
+ trigger:
+ - platform: zone
+ entity_id: device_tracker.cph2573_2
+ zone: zone.gps_home_high
+ event: leave
+ condition:
+ - condition: state
+ entity_id: binary_sensor.oneplus12_high_accuracy_mode
+ state: "on"
+ action:
+ - service: notify.mobile_app_oneplus12
+ data:
+ message: "command_high_accuracy_mode"
+ data:
+ command: "turn_off"
+ ttl: 0
+ priority: high
\ No newline at end of file
diff --git a/includes/packages/notifications_telegram.yaml b/includes/packages/notifications_telegram.yaml
new file mode 100644
index 0000000..db23eaa
--- /dev/null
+++ b/includes/packages/notifications_telegram.yaml
@@ -0,0 +1,659 @@
+notifications_telegram:
+
+#таймеры для уведомлений
+ #стиралка
+ timer:
+ timer_cool_washer:
+ name: "Таймер времени охлаждения белья в стиралке"
+ duration: '04:00:00'
+
+
+ automation:
+
+#автоматизация таймеров для уведомлений
+ #стиралка
+ - alias: tmr|wshr|cool_duration_on
+ description: Запуск таймера продолжительности охлаждения белья
+ triggers:
+ - trigger: state
+ entity_id:
+ - sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_run_state
+ from: Завершено
+ to: Охлаждение
+ conditions: []
+ actions:
+ - action: timer.start
+ metadata: {}
+ data: {}
+ target:
+ entity_id: timer.timer_cool_washer
+ mode: single
+
+ - alias: tmr|wshr|cool_duration_off
+ description: Остановить таймер продолжительности охлаждения белья
+ triggers:
+ - trigger: state
+ entity_id:
+ - sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_run_state
+ from: Охлаждение
+ to: null
+ conditions: []
+ actions:
+ - action: timer.finish
+ metadata: {}
+ data: {}
+ target:
+ entity_id: timer.timer_cool_washer
+ mode: single
+
+
+################################################################################
+#home_assistant
+
+ - id: ntf|ha_start_message
+ alias: ntf|ha_start_message
+ initial_state: true
+ trigger:
+ - platform: homeassistant
+ event: start
+ action:
+ - delay:
+ hours: 0
+ minutes: 1
+ seconds: 15
+ milliseconds: 0
+ - action: telegram_bot.send_message
+ data:
+ # ЗАМЕНЕНО: target -> chat_id
+ chat_id: -1002006010424
+ message: |
+ {{"\U0001F567"}} Зафиксирован запуск HA в {{ states('sensor.time') }} {{"\U0001F567"}}
+
+ {{'\U0001F30D'}}Состояние proxmox:
+
+ {{'\U0001F321'}}CPU | {{'\U000023EB'}}CPU | {{'\U0001F4DD'}} RAM
+ {{ states ('sensor.proxmox_cpu_temperature') }} {{"\U00002103"}} | {{ states ('sensor.node_pr_cpu_used') | round(2)}} % | {{ states ('sensor.node_pr_memory_used') | round(2) }} GB
+ {{'\U0001F4BD'}}Disk |{{'\U000023F1'}}UpTime
+ {{ states ('sensor.node_pr_disk_used_percentage') | round(2) }} % | {% set s = (as_timestamp (now()) -as_timestamp(states('sensor.node_pr_last_boot')))|int(0) %}{{ '{:d}д {:02d}:{:02d}'.format (s // 86400, s % 86400 // 3600, s % 3600 // 60, s % 60) }}
+ {{"\U0001F4BF"}}Smb | {{"\U0001F4FA"}}Win | {{"\U0001F4FA"}}lmp-trcr | {{"\U0001F4FA"}}ngnix
+ {{ states ('binary_sensor.lxc_docker_101_status') }}|{{ states ('binary_sensor.qemu_wni10forjob_105_status') }}|{{ states ('binary_sensor.qemu_lampa_traccar_102_status') }}|{{ states ('binary_sensor.lxc_nginxproxymanager_108_status') }}
+ inline_keyboard:
+ - '{{''\U000021A9''}} Главное меню:/menu_back , {{''\U000021AA''}} Proxmox:/prxmx_control'
+ - '{{''\U0001F5D1''}} Прочитано:/menu_hide'
+
+
+ - id: ntf|send_auto_weather
+ alias: ntf|send_auto_weather
+ initial_state: true
+ trigger:
+ - platform: time
+ at: "07:20:00"
+ - platform: time
+ at: "17:15:00"
+ enabled: true
+ condition:
+ - condition: time
+ weekday:
+ - mon
+ - tue
+ - wed
+ - thu
+ - fri
+ action:
+ - service: telegram_bot.send_message
+ data:
+ target: [6265196444, 102879274]
+ message: |
+ {{"\U0001F308"}} Погода:
+
+ {{"\U0001FA9F"}}За окном: {%- set current = states('sensor.openweathermap_weather_code')|int %} {%- set conditions={'Туман \U0001F32B': [701, 741], 'Гроза \U0001F329': [210, 211, 212, 221], 'Дождь/Гроза \U000026C8': [200, 201, 202, 230, 231, 232], 'Облачно \U000026C5': [801, 802, 803, 804], 'Дождь \U00002614': [504, 314, 502, 503, 522, 300, 301, 302, 310, 311, 312, 313, 500, 501, 520, 521, 906], 'Снег \U00002744': [600, 601, 602, 611, 612, 620, 621, 622], 'Снег с дождём \U00002614\U00002744': [511, 615, 616], 'Ясно \U00002600': [800], 'Ветер \U0001F4A8': [905, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961], 'Внимание \U000026A0': [711, 721, 731, 751, 761, 762, 771, 900, 901, 962, 903, 904] } %} {%- for condition, value in conditions.items() %} {%- if current in value %} {{- " "+condition}} {%- endif %} {%- endfor %}
+ {{"\U0001F321"}}Температура: {{- " "+state_attr('weather.openweathermap','temperature')|string }} {{"\U00002103"}}
+ {{"\U0001F4A8"}}Ветер: {{ state_attr('weather.openweathermap', 'wind_speed') | float }} км/ч {%- if state_attr('weather.openweathermap', 'wind_speed') | float < 1 %} - Штиль {%- elif state_attr('weather.openweathermap', 'wind_speed') | float < 5 %} - Тихий {%- elif state_attr('weather.openweathermap', 'wind_speed') | float < 11 %} - Легкий {%- elif state_attr('weather.openweathermap', 'wind_speed') | float< 19 %} - Слабый {%- elif state_attr('weather.openweathermap', 'wind_speed') | float < 28 %} - Умеренный {%- elif state_attr('weather.openweathermap','wind_speed') | float < 38 %} - Свежий {%- elif state_attr('weather.openweathermap', 'wind_speed') | float < 49 %} - Сильный {%- elif state_attr('weather.openweathermap', 'wind_speed') | float < 61 %} - Крепкий {%- elif state_attr('weather.openweathermap', 'wind_speed') |float < 74 %} - Очень крепкий {%- elif state_attr('weather.openweathermap', 'wind_speed') | float < 88 %} - Шторм {%- elif state_attr('weather.openweathermap', 'wind_speed') | float < 102 %} - Сильный шторм {%- elif state_attr('weather.openweathermap', 'wind_speed') |float < 117 %} - Жестокий шторм {%- elif state_attr('weather.openweathermap', 'wind_speed') | float > 117 %} - Ураган {%- endif %}
+ ⚠ PM10: {{states ('sensor.narodmon_particulate_matter')}} мкг/м
+
+ ⌚ Почасовой прогноз:
+
+ {{state_attr('sensor.forecast_hour','datetime0')|as_timestamp()|timestamp_custom('%d.%m|%H:%M')}}
+ {% set c = state_attr('sensor.forecast_hour','condition0') %}
+ {%- if c == 'clear-night' %}🌟
+ {%- elif c == 'cloudy' %}☁️
+ {%- elif c == 'exceptional' %}⚠️
+ {%- elif c == 'fog' %}🌫
+ {%- elif c == 'hail' %}☄
+ {%- elif c == 'lightning' %}⚡️
+ {%- elif c == 'lightning-rainy' %}⛈
+ {%- elif c == 'partlycloudy' %}⛅️
+ {%- elif c == 'pouring' %}⛈
+ {%- elif c == 'rainy' %}☔
+ {%- elif c == 'snowy' %}❄️
+ {%- elif c == 'snowy-rainy' %}❄️/☔ С
+ {%- elif c == 'sunny' %}☀️
+ {%- elif c == 'windy' %}💨
+ {%- else%} Не определено {%endif%} {{state_attr('sensor.forecast_hour','temperature0')}}°C, {{state_attr('sensor.forecast_hour','wind_speed0')}} км/ч, ☔ {{state_attr('sensor.forecast_hour','precipitation_probability0')}} %
+ {{state_attr('sensor.forecast_hour','datetime1')|as_timestamp()|timestamp_custom('%d.%m|%H:%M')}}
+ {% set c = state_attr('sensor.forecast_hour','condition1') %}
+ {%- if c == 'clear-night' %}🌟
+ {%- elif c == 'cloudy' %}☁️
+ {%- elif c == 'exceptional' %}⚠️
+ {%- elif c == 'fog' %}🌫
+ {%- elif c == 'hail' %}☄
+ {%- elif c == 'lightning' %}⚡️
+ {%- elif c == 'lightning-rainy' %}⛈ М
+ {%- elif c == 'partlycloudy' %}⛅️
+ {%- elif c == 'pouring' %}⛈
+ {%- elif c == 'rainy' %}☔
+ {%- elif c == 'snowy' %}❄️
+ {%- elif c == 'snowy-rainy' %}❄️/☔ Сн
+ {%- elif c == 'sunny' %}☀️
+ {%- elif c == 'windy' %}💨
+ {%- else%} Не определено {%endif%} {{state_attr('sensor.forecast_hour','temperature1')}}°C, {{state_attr('sensor.forecast_hour','wind_speed1')}} км/ч, ☔ {{state_attr('sensor.forecast_hour','precipitation_probability1')}} %
+ {{state_attr('sensor.forecast_hour','datetime2')|as_timestamp()|timestamp_custom('%d.%m|%H:%M')}}
+ {% set c = state_attr('sensor.forecast_hour','condition2') %}
+ {%- if c == 'clear-night' %}🌟
+ {%- elif c == 'cloudy' %}☁️
+ {%- elif c == 'exceptional' %}⚠️
+ {%- elif c == 'fog' %}🌫
+ {%- elif c == 'hail' %}☄
+ {%- elif c == 'lightning' %}⚡️
+ {%- elif c == 'lightning-rainy' %}⛈ М
+ {%- elif c == 'partlycloudy' %}⛅️
+ {%- elif c == 'pouring' %}⛈
+ {%- elif c == 'rainy' %}☔
+ {%- elif c == 'snowy' %}❄️
+ {%- elif c == 'snowy-rainy' %}❄️/☔ Сн
+ {%- elif c == 'sunny' %}☀️
+ {%- elif c == 'windy' %}💨
+ {%- else%} Не определено {%endif%} {{state_attr('sensor.forecast_hour','temperature2')}}°C, {{state_attr('sensor.forecast_hour','wind_speed2')}} км/ч, ☔ {{state_attr('sensor.forecast_hour','precipitation_probability2')}} %
+ {{state_attr('sensor.forecast_hour','datetime3')|as_timestamp()|timestamp_custom('%d.%m|%H:%M')}}
+ {% set c = state_attr('sensor.forecast_hour','condition3') %}
+ {%- if c == 'clear-night' %}🌟
+ {%- elif c == 'cloudy' %}☁️
+ {%- elif c == 'exceptional' %}⚠️
+ {%- elif c == 'fog' %}🌫
+ {%- elif c == 'hail' %}☄
+ {%- elif c == 'lightning' %}⚡️
+ {%- elif c == 'lightning-rainy' %}⛈
+ {%- elif c == 'partlycloudy' %}⛅️
+ {%- elif c == 'pouring' %}⛈
+ {%- elif c == 'rainy' %}☔
+ {%- elif c == 'snowy' %}❄️
+ {%- elif c == 'snowy-rainy' %}❄️/☔
+ {%- elif c == 'sunny' %}☀️
+ {%- elif c == 'windy' %}💨
+ {%- else%} Не определено {%endif%} {{state_attr('sensor.forecast_hour','temperature3')}}°C, {{state_attr('sensor.forecast_hour','wind_speed3')}} км/ч, ☔ {{state_attr('sensor.forecast_hour','precipitation_probability3')}} %
+ {{state_attr('sensor.forecast_hour','datetime4')|as_timestamp()|timestamp_custom('%d.%m|%H:%M')}}
+ {% set c = state_attr('sensor.forecast_hour','condition4') %}
+ {%- if c == 'clear-night' %}🌟
+ {%- elif c == 'cloudy' %}☁️
+ {%- elif c == 'exceptional' %}⚠️
+ {%- elif c == 'fog' %}🌫
+ {%- elif c == 'hail' %}☄
+ {%- elif c == 'lightning' %}⚡️
+ {%- elif c == 'lightning-rainy' %}⛈ и
+ {%- elif c == 'partlycloudy' %}⛅️
+ {%- elif c == 'pouring' %}⛈
+ {%- elif c == 'rainy' %}☔
+ {%- elif c == 'snowy' %}❄️
+ {%- elif c == 'snowy-rainy' %}❄️/☔
+ {%- elif c == 'sunny' %}☀️
+ {%- elif c == 'windy' %}💨
+ {%- else%} Не определено {%endif%} {{state_attr('sensor.forecast_hour','temperature4')}}°C, {{state_attr('sensor.forecast_hour','wind_speed4')}} км/ч, ☔ {{state_attr('sensor.forecast_hour','precipitation_probability4')}} %
+ {{state_attr('sensor.forecast_hour','datetime5')|as_timestamp()|timestamp_custom('%d.%m|%H:%M')}}
+ {% set c = state_attr('sensor.forecast_hour','condition5') %}
+ {%- if c == 'clear-night' %}🌟
+ {%- elif c == 'cloudy' %}☁️
+ {%- elif c == 'exceptional' %}⚠️
+ {%- elif c == 'fog' %}🌫
+ {%- elif c == 'hail' %}☄
+ {%- elif c == 'lightning' %}⚡️
+ {%- elif c == 'lightning-rainy' %}⛈
+ {%- elif c == 'partlycloudy' %}⛅️
+ {%- elif c == 'pouring' %}⛈
+ {%- elif c == 'rainy' %}☔
+ {%- elif c == 'snowy' %}❄️
+ {%- elif c == 'snowy-rainy' %}❄️/☔ Сн
+ {%- elif c == 'sunny' %}☀️
+ {%- elif c == 'windy' %}💨
+ {%- else%} Не определено {%endif%} {{state_attr('sensor.forecast_hour','temperature5')}}°C, {{state_attr('sensor.forecast_hour','wind_speed5')}} км/ч, ☔ {{state_attr('sensor.forecast_hour','precipitation_probability5')}} %
+ {{state_attr('sensor.forecast_hour','datetime6')|as_timestamp()|timestamp_custom('%d.%m|%H:%M')}}
+ {% set c = state_attr('sensor.forecast_hour','condition6') %}
+ {%- if c == 'clear-night' %}🌟
+ {%- elif c == 'cloudy' %}☁️
+ {%- elif c == 'exceptional' %}⚠️
+ {%- elif c == 'fog' %}🌫
+ {%- elif c == 'hail' %}☄
+ {%- elif c == 'lightning' %}⚡️
+ {%- elif c == 'lightning-rainy' %}⛈
+ {%- elif c == 'partlycloudy' %}⛅️
+ {%- elif c == 'pouring' %}⛈
+ {%- elif c == 'rainy' %}☔
+ {%- elif c == 'snowy' %}❄️
+ {%- elif c == 'snowy-rainy' %}❄️/☔
+ {%- elif c == 'sunny' %}☀️
+ {%- elif c == 'windy' %}💨
+ {%- else%} Не определено {%endif%} {{state_attr('sensor.forecast_hour','temperature4')}}°C, {{state_attr('sensor.forecast_hour','wind_speed6')}} км/ч, ☔ {{state_attr('sensor.forecast_hour','precipitation_probability6')}} %
+ {{state_attr('sensor.forecast_hour','datetime7')|as_timestamp()|timestamp_custom('%d.%m|%H:%M')}}
+ {% set c = state_attr('sensor.forecast_hour','condition7') %}
+ {%- if c == 'clear-night' %}🌟
+ {%- elif c == 'cloudy' %}☁️
+ {%- elif c == 'exceptional' %}⚠️
+ {%- elif c == 'fog' %}🌫
+ {%- elif c == 'hail' %}☄
+ {%- elif c == 'lightning' %}⚡️
+ {%- elif c == 'lightning-rainy' %}⛈
+ {%- elif c == 'partlycloudy' %}⛅️
+ {%- elif c == 'pouring' %}⛈
+ {%- elif c == 'rainy' %}☔
+ {%- elif c == 'snowy' %}❄️
+ {%- elif c == 'snowy-rainy' %}❄️/☔ С
+ {%- elif c == 'sunny' %}☀️
+ {%- elif c == 'windy' %}💨
+ {%- else%} Не определено {%endif%} {{state_attr('sensor.forecast_hour','temperature7')}}°C, {{state_attr('sensor.forecast_hour','wind_speed7')}} км/ч, ☔ {{state_attr('sensor.forecast_hour','precipitation_probability7')}} %
+ {{state_attr('sensor.forecast_hour','datetime8')|as_timestamp()|timestamp_custom('%d.%m|%H:%M')}}
+ {% set c = state_attr('sensor.forecast_hour','condition8') %}
+ {%- if c == 'clear-night' %}🌟
+ {%- elif c == 'cloudy' %}☁️
+ {%- elif c == 'exceptional' %}⚠️
+ {%- elif c == 'fog' %}🌫
+ {%- elif c == 'hail' %}☄
+ {%- elif c == 'lightning' %}⚡️
+ {%- elif c == 'lightning-rainy' %}⛈
+ {%- elif c == 'partlycloudy' %}⛅️
+ {%- elif c == 'pouring' %}⛈
+ {%- elif c == 'rainy' %}☔
+ {%- elif c == 'snowy' %}❄️
+ {%- elif c == 'snowy-rainy' %}❄️/☔
+ {%- elif c == 'sunny' %}☀️
+ {%- elif c == 'windy' %}💨
+ {%- else%} Не определено {%endif%} {{state_attr('sensor.forecast_hour','temperature8')}}°C, {{state_attr('sensor.forecast_hour','wind_speed8')}} км/ч, ☔ {{state_attr('sensor.forecast_hour','precipitation_probability8')}} %
+ {{state_attr('sensor.forecast_hour','datetime9')|as_timestamp()|timestamp_custom('%d.%m|%H:%M')}}
+ {% set c = state_attr('sensor.forecast_hour','condition9') %}
+ {%- if c == 'clear-night' %}🌟
+ {%- elif c == 'cloudy' %}☁️
+ {%- elif c == 'exceptional' %}⚠️
+ {%- elif c == 'fog' %}🌫
+ {%- elif c == 'hail' %}☄
+ {%- elif c == 'lightning' %}⚡️
+ {%- elif c == 'lightning-rainy' %}⛈
+ {%- elif c == 'partlycloudy' %}⛅️
+ {%- elif c == 'pouring' %}⛈
+ {%- elif c == 'rainy' %}☔
+ {%- elif c == 'snowy' %}❄️
+ {%- elif c == 'snowy-rainy' %}❄️/☔
+ {%- elif c == 'sunny' %}☀️
+ {%- elif c == 'windy' %}💨
+ {%- else%} Не определено {%endif%} {{state_attr('sensor.forecast_hour','temperature9')}}°C, {{state_attr('sensor.forecast_hour','wind_speed9')}} км/ч, ☔ {{state_attr('sensor.forecast_hour','precipitation_probability9')}} %
+ {{state_attr('sensor.forecast_hour','datetime10')|as_timestamp()|timestamp_custom('%d.%m|%H:%M')}}
+ {% set c = state_attr('sensor.forecast_hour','condition10') %}
+ {%- if c == 'clear-night' %}🌟
+ {%- elif c == 'cloudy' %}☁️
+ {%- elif c == 'exceptional' %}⚠️
+ {%- elif c == 'fog' %}🌫
+ {%- elif c == 'hail' %}☄
+ {%- elif c == 'lightning' %}⚡️
+ {%- elif c == 'lightning-rainy' %}⛈
+ {%- elif c == 'partlycloudy' %}⛅️
+ {%- elif c == 'pouring' %}⛈
+ {%- elif c == 'rainy' %}☔
+ {%- elif c == 'snowy' %}❄️
+ {%- elif c == 'snowy-rainy' %}❄️/☔
+ {%- elif c == 'sunny' %}☀️
+ {%- elif c == 'windy' %}💨
+ {%- else%} Не определено {%endif%} {{state_attr('sensor.forecast_hour','temperature10')}}°C, {{state_attr('sensor.forecast_hour','wind_speed10')}} км/ч, ☔ {{state_attr('sensor.forecast_hour','precipitation_probability10')}} %
+ {{state_attr('sensor.forecast_hour','datetime11')|as_timestamp()|timestamp_custom('%d.%m|%H:%M')}}
+ {% set c = state_attr('sensor.forecast_hour','condition11') %}
+ {%- if c == 'clear-night' %}🌟
+ {%- elif c == 'cloudy' %}☁️
+ {%- elif c == 'exceptional' %}⚠️
+ {%- elif c == 'fog' %}🌫
+ {%- elif c == 'hail' %}☄
+ {%- elif c == 'lightning' %}⚡️
+ {%- elif c == 'lightning-rainy' %}⛈
+ {%- elif c == 'partlycloudy' %}⛅️
+ {%- elif c == 'pouring' %}⛈
+ {%- elif c == 'rainy' %}☔
+ {%- elif c == 'snowy' %}❄️
+ {%- elif c == 'snowy-rainy' %}❄️/☔
+ {%- elif c == 'sunny' %}☀️
+ {%- elif c == 'windy' %}💨
+ {%- else%} Не определено {%endif%} {{state_attr('sensor.forecast_hour','temperature11')}}°C, {{state_attr('sensor.forecast_hour','wind_speed11')}} км/ч, ☔ {{state_attr('sensor.forecast_hour','precipitation_probability11')}} %
+ inline_keyboard:
+ - '{{"\U0001F553"}} Почасовой прогноз:/wthr_h_control, {{''\U0001F5D3''}} Ежедневный прогноз:/wthr_d_control'
+ - '{{''\U000021A9''}} Главное меню:/menu_back , {{''\U000021AA''}} Обновить:/wthr_control'
+ - '{{''\U0001F5D1''}} Прочитано:/menu_hide'
+
+################################################################################
+#торренты
+
+
+
+
+
+################################################################################
+#стиральная машина
+
+
+
+
+################################################################################
+#Термопот
+
+################################################################################
+#Прихожая
+ - alias: ntf|door_open
+ description: ""
+ trigger:
+ - platform: state
+ entity_id:
+ - binary_sensor.e4aaec3747b2_contact
+ from: "off"
+ to: "on"
+ condition:
+ - condition: state
+ entity_id: binary_sensor.0x00158d000707efdf_motion
+ state: "off"
+ action:
+ - service: telegram_bot.send_message
+ metadata: {}
+ data:
+ message: "{{\"\\U0001F567\"}} Входная дверь открыта {{ states('sensor.time') }} "
+ inline_keyboard:
+ - '{{''\U000021A9''}} Главное меню:/menu_back , {{''\U0001F5D1''}} Прочитано:/menu_hide'
+
+ - alias: ntf|door_lock
+ description: ""
+ trigger:
+ - platform: state
+ entity_id:
+ - binary_sensor.e4aaec3747b2_contact
+ from: "on"
+ to: "off"
+ condition: []
+ action:
+ - service: telegram_bot.send_message
+ metadata: {}
+ data:
+ message: "{{\"\\U0001F567\"}} Входная дверь закрыта {{ states('sensor.time') }} "
+
+ inline_keyboard:
+ - '{{''\U000021A9''}} Главное меню:/menu_back , {{''\U0001F5D1''}} Прочитано:/menu_hide'
+
+
+ - alias: ntf|door_open_5min
+ description: ""
+ mode: single
+ triggers:
+ - entity_id:
+ - binary_sensor.e4aaec3747b2_contact
+ from: null
+ to: "on"
+ for:
+ hours: 0
+ minutes: 3
+ seconds: 0
+ trigger: state
+ conditions: []
+ actions:
+ - repeat:
+ sequence:
+ - metadata: {}
+ data:
+ message: >-
+ {{"\U00002757"}} Входная дверь открыта больше 5
+ минут{{"\U00002757"}} {{ states('sensor.time') }}
+ inline_keyboard:
+ - '{{''\U000021A9''}} Отмена уведомления:/toggle_lb_off_door'
+ - '{{''\U000021A9''}} Главное меню:/menu_back , {{''\U0001F5D1''}} Прочитано:/menu_hide'
+ action: telegram_bot.send_message
+ - delay:
+ hours: 0
+ minutes: 0
+ seconds: 30
+ milliseconds: 0
+ while:
+ - condition: or
+ conditions:
+ - condition: state
+ entity_id: binary_sensor.e4aaec3747b2_contact
+ state: "on"
+
+
+
+
+################################################################################
+#Ванная
+
+
+
+
+
+################################################################################
+#ping
+
+ #nem.dddennnisss.ru
+ - alias: ntf|connect_down_nem.dddennnisss.ru
+ description: ""
+ mode: single
+ trigger:
+ - platform: state
+ entity_id:
+ - binary_sensor.nem_dddennnisss_ru
+ from: "on"
+ to: "off"
+ for:
+ hours: 0
+ minutes: 3
+ seconds: 0
+ condition:
+ - condition: state
+ entity_id: binary_sensor.day_time
+ state: "on"
+ action:
+ - service: telegram_bot.send_message
+ data:
+ target:
+ - 102879274
+ inline_keyboard:
+ - >-
+ {{'\U000021A9'}} Главное меню:/menu_back , {{'\U0001F5D1'}}
+ Прочитано:/menu_hide
+ message: Пропал коннект до nem.dddennnisss.ru
+
+ #nem.dddennnisss.ru
+ - alias: ntf|connect_up_nem.dddennnisss.ru
+ description: ""
+ mode: single
+ trigger:
+ - platform: state
+ entity_id:
+ - binary_sensor.nem_dddennnisss_ru
+ from: "off"
+ to: "on"
+ for:
+ hours: 0
+ minutes: 3
+ seconds: 0
+ condition:
+ - condition: state
+ entity_id: binary_sensor.day_time
+ state: "on"
+ action:
+ - service: telegram_bot.send_message
+ data:
+ target:
+ - 102879274
+ inline_keyboard:
+ - >-
+ {{'\U000021A9'}} Главное меню:/menu_back , {{'\U0001F5D1'}}
+ Прочитано:/menu_hide
+ message: Поднялся коннект до nem.dddennnisss.ru
+
+ #176.222.54.79
+ - alias: ntf|connect_down_176.222.54.79
+ description: ""
+ mode: single
+ trigger:
+ - platform: state
+ entity_id:
+ - binary_sensor.176_222_54_79
+ from: "on"
+ to: "off"
+ for:
+ hours: 0
+ minutes: 1
+ seconds: 30
+ condition:
+ - condition: state
+ entity_id: binary_sensor.day_time
+ state: "on"
+ action:
+ - service: telegram_bot.send_message
+ data:
+ target:
+ - 102879274
+ inline_keyboard:
+ - >-
+ {{'\U000021A9'}} Главное меню:/menu_back , {{'\U0001F5D1'}}
+ Прочитано:/menu_hide
+ message: Пропал коннект до 176.222.54.79
+
+ - alias: ntf|connect_up_176.222.54.79
+ description: ""
+ mode: single
+ trigger:
+ - platform: state
+ entity_id:
+ - binary_sensor.176_222_54_79
+ from: "off"
+ to: "on"
+ for:
+ hours: 0
+ minutes: 3
+ seconds: 0
+ condition:
+ - condition: state
+ entity_id: binary_sensor.day_time
+ state: "on"
+ action:
+ - service: telegram_bot.send_message
+ data:
+ target:
+ - 102879274
+ inline_keyboard:
+ - >-
+ {{'\U000021A9'}} Главное меню:/menu_back , {{'\U0001F5D1'}}
+ Прочитано:/menu_hide
+ message: Поднялся коннект до 176.222.54.79
+
+################################################################################
+#Датчики протечки
+ #Обнаружена протечка
+ #noname датчик
+ - alias: ntf|water_leak_noname_on
+ description: ""
+ mode: single
+ triggers:
+ - trigger: state
+ entity_id:
+ - binary_sensor.0xa4c1386278c84377_water_leak
+ from: "off"
+ to: "on"
+ conditions: []
+ actions:
+ - action: telegram_bot.send_message
+ data:
+ target:
+ - 102879274
+ inline_keyboard:
+ - >-
+ {{'\U000021A9'}} Главное меню:/menu_back , {{'\U0001F5D1'}}
+ Прочитано:/menu_hide
+ message: Обнаружена протечка! Датчик noname
+
+ - alias: ntf|water_leak_noname_off
+ description: ""
+ mode: single
+ triggers:
+ - trigger: state
+ entity_id:
+ - binary_sensor.0xa4c1386278c84377_water_leak
+ from: "on"
+ to: "off"
+ for:
+ hours: 0
+ minutes: 1
+ seconds: 0
+ conditions: []
+ actions:
+ - action: telegram_bot.send_message
+ data:
+ target:
+ - 102879274
+ inline_keyboard:
+ - >-
+ {{'\U000021A9'}} Главное меню:/menu_back , {{'\U0001F5D1'}}
+ Прочитано:/menu_hide
+ message: Протечка устранена! Датчик noname
+ - action: notify.mobile_app_m2007j3sg
+ metadata: {}
+ data:
+ title: Датчик noname
+ message: "Протечка устранена!"
+
+ #aqara
+ - alias: ntf|water_leak_aqara_on
+ description: ""
+ mode: single
+ triggers:
+ - trigger: state
+ entity_id:
+ - binary_sensor.0x00158d000af3c1dd_water_leak
+ from: "off"
+ to: "on"
+ conditions: []
+ actions:
+ - action: telegram_bot.send_message
+ data:
+ target:
+ - 102879274
+ inline_keyboard:
+ - >-
+ {{'\U000021A9'}} Главное меню:/menu_back , {{'\U0001F5D1'}}
+ Прочитано:/menu_hide
+ message: Обнаружена протечка! Датчик aqara
+ - action: notify.mobile_app_m2007j3sg
+ metadata: {}
+ data:
+ title: Датчик aqara
+ message: "Обнаружена протечка!"
+
+ - alias: ntf|water_leak_aqara_off
+ description: ""
+ mode: single
+ triggers:
+ - trigger: state
+ entity_id:
+ - binary_sensor.0x00158d000af3c1dd_water_leak
+ from: "on"
+ to: "off"
+ for:
+ hours: 0
+ minutes: 1
+ seconds: 0
+ conditions: []
+ actions:
+ - action: telegram_bot.send_message
+ data:
+ target:
+ - 102879274
+ inline_keyboard:
+ - >-
+ {{'\U000021A9'}} Главное меню:/menu_back , {{'\U0001F5D1'}}
+ Прочитано:/menu_hide
+ message: Протечка устранена! Датчик aqara
+ - action: notify.mobile_app_m2007j3sg
+ metadata: {}
+ data:
+ title: Датчик aqara
+ message: "Протечка устранена!"
+
diff --git a/includes/packages/router.yaml b/includes/packages/router.yaml
new file mode 100644
index 0000000..48b25df
--- /dev/null
+++ b/includes/packages/router.yaml
@@ -0,0 +1,100 @@
+router:
+
+ shell_command:
+ get_connect_accept_ips: ssh -i /config/.ssh/id_rsa_openwrt -o UserKnownHostsFile=/config/.ssh/known_hosts root@192.168.1.1 /root/get_connect_accept_ips.sh
+ add_ip_to_connect_accept: >
+ ssh -i /config/.ssh/id_rsa_openwrt
+ -o UserKnownHostsFile=/config/.ssh/known_hosts
+ root@192.168.1.1 /root/add_ip_connect_accept.sh {{ ip }}
+ wrt_ca_on: >
+ ssh -i /config/.ssh/id_rsa_openwrt
+ -o UserKnownHostsFile=/config/.ssh/known_hosts
+ root@192.168.1.1 /root/on_off_connect_accept.sh on
+
+ wrt_ca_off: >
+ ssh -i /config/.ssh/id_rsa_openwrt
+ -o UserKnownHostsFile=/config/.ssh/known_hosts
+ root@192.168.1.1 /root/on_off_connect_accept.sh off
+
+ wrt_wol_sd: >
+ ssh -i /config/.ssh/id_rsa_openwrt
+ -o UserKnownHostsFile=/config/.ssh/known_hosts
+ root@192.168.1.1 '
+ etherwake -i br-lan D8:D0:90:2B:29:93 ;
+ etherwake -i br-lan 00:E0:4C:75:2C:C2 ;
+ etherwake -i br-lan 00:E0:4C:FE:20:50
+ '
+
+ automation:
+
+ - alias: ntf|tg|wrt_ip
+ description: Получает IP-адреса из ipset connect_accept на OpenWRT и отправляет их в Telegram
+ trigger:
+ - platform: event
+ event_type: telegram_command
+ event_data:
+ command: '/wrt_ip'
+ - platform: event
+ event_type: telegram_command
+ event_data:
+ command: '/wrt_ip@ha_dddennnisss_bot'
+ action:
+ - service: shell_command.get_connect_accept_ips
+ response_variable: wrt_ips
+ - service: telegram_bot.send_message
+ data:
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: >
+ connect-accept:
+
+ {{ wrt_ips.stdout | default('Нет данных') }}
+ mode: single
+
+ - alias: tg|wrt_ip_add
+ trigger:
+ platform: event
+ event_type: telegram_command
+ event_data:
+ command: /wrt_ip_add
+ action:
+ - variables:
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ ip_arg: "{{ trigger.event.data.args | join(' ') }}"
+ - service: shell_command.add_ip_to_connect_accept
+ data:
+ ip: "{{ ip_arg }}"
+ - service: telegram_bot.send_message
+ data:
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: "IP {{ ip_arg }} добавлен в connect-accept"
+ parse_mode: none
+
+ - alias: tg|wrt_off_connect_accept
+ trigger:
+ platform: event
+ event_type: telegram_command
+ event_data:
+ command: /wrt_ca_off
+ action:
+ - variables:
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ - service: shell_command.wrt_ca_off
+ - service: telegram_bot.send_message
+ data:
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: "connect-accept отключён"
+
+ - alias: tg|wrt_on_connect_accept
+ trigger:
+ platform: event
+ event_type: telegram_command
+ event_data:
+ command: /wrt_ca_on
+ action:
+ - variables:
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ - service: shell_command.wrt_ca_on
+ - service: telegram_bot.send_message
+ data:
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: "connect-accept включён"
diff --git a/includes/packages/scooter.yaml b/includes/packages/scooter.yaml
new file mode 100644
index 0000000..5452dbc
--- /dev/null
+++ b/includes/packages/scooter.yaml
@@ -0,0 +1,304 @@
+scooter:
+
+ sensor:
+ - platform: rest
+ name: "Traccar Daily Distance"
+ resource: "https://gps.dddennnisss.ru/api/reports/summary"
+ headers:
+ Authorization: "Bearer RzBFAiEA7kYylJY3l1TFjpbLP9E38CbvtV5eIteHN-f2Urj96NgCIBF800289eJIbaiOgQ4C4Jhlc7yYM1sGR2SO2Kk1M-q5eyJ1IjoxLCJlIjoiMjAyOS0xMi0zMFQxNzowMDowMC4wMDArMDA6MDAifQ"
+ Content-Type: "application/json"
+ params:
+ deviceId: 1
+ type: distance
+ from: "{{ now().replace(hour=0, minute=0, second=0, microsecond=0).isoformat() }}"
+ to: "{{ now().isoformat() }}"
+ json_attributes_path: "$[0]"
+ json_attributes:
+ - distance
+ - averageSpeed
+ - maxSpeed
+ - startTime
+ - endTime
+ value_template: "{{ value_json[0].distance | float / 1000 | round(2) }}"
+ unit_of_measurement: "км"
+ scan_interval: 60
+
+ template:
+
+ - sensor:
+ - name: "Самокат Пробег Сегодня"
+ unique_id: "scooter_daily_distance_formatted"
+ state: >
+ {{ states('sensor.traccar_daily_distance') | float | round(2) }}
+ unit_of_measurement: "км"
+ icon: mdi:map-marker-distance
+
+ - name: "Самокат Максимальная Скорость"
+ unique_id: "scooter_max_speed_kmh"
+ state: >
+ {% set max_speed_knots = state_attr('sensor.traccar_daily_distance', 'maxSpeed') | float %}
+ {{ (max_speed_knots * 1.852) | round(2) }}
+ unit_of_measurement: "км/ч"
+ icon: mdi:speedometer
+ attributes:
+ speed_in_knots: "{{ state_attr('sensor.traccar_daily_distance', 'maxSpeed') | round(2) }}"
+ calculation: "{{ state_attr('sensor.traccar_daily_distance', 'maxSpeed') | float }} узлов × 1.852 = {{ (state_attr('sensor.traccar_daily_distance', 'maxSpeed') | float * 1.852) | round(2) }} км/ч"
+
+ - name: "Самокат Начало Поездки"
+ unique_id: "scooter_start_time_local"
+ state: >
+ {% set start_time = state_attr('sensor.traccar_daily_distance', 'startTime') %}
+ {% if start_time %}
+ {{ as_timestamp(start_time) | timestamp_custom('%H:%M') }}
+ {% else %}
+ Неизвестно
+ {% endif %}
+ icon: mdi:clock-start
+ attributes:
+ utc_time: "{{ state_attr('sensor.traccar_daily_distance', 'startTime') }}"
+ local_time: >
+ {% set start_time = state_attr('sensor.traccar_daily_distance', 'startTime') %}
+ {% if start_time %}
+ {{ as_timestamp(start_time) | timestamp_custom('%H:%M (%d.%m.%Y)') }}
+ {% endif %}
+
+ - name: "Самокат Конец Поездки"
+ unique_id: "scooter_end_time_local"
+ state: >
+ {% set end_time = state_attr('sensor.traccar_daily_distance', 'endTime') %}
+ {% if end_time %}
+ {{ as_timestamp(end_time) | timestamp_custom('%H:%M') }}
+ {% else %}
+ Активно
+ {% endif %}
+ icon: mdi:clock-end
+ attributes:
+ utc_time: "{{ state_attr('sensor.traccar_daily_distance', 'endTime') }}"
+ local_time: >
+ {% set end_time = state_attr('sensor.traccar_daily_distance', 'endTime') %}
+ {% if end_time %}
+ {{ as_timestamp(end_time) | timestamp_custom('%H:%M (%d.%m.%Y)') }}
+ {% endif %}
+
+ - name: "Самокат Время в Дороге"
+ unique_id: "scooter_trip_duration"
+ state: >
+ {% set start_time = state_attr('sensor.traccar_daily_distance', 'startTime') %}
+ {% set end_time = state_attr('sensor.traccar_daily_distance', 'endTime') %}
+ {% if start_time and end_time %}
+ {% set duration = (as_timestamp(end_time) - as_timestamp(start_time)) / 3600 %}
+ {{ duration | round(1) }}
+ {% else %}
+ 0
+ {% endif %}
+ unit_of_measurement: "ч"
+ icon: mdi:timer
+
+ - binary_sensor:
+ - name: "scooter_gps_data_fresh"
+ unique_id: scooter_gps_data_fresh
+ state: >-
+ {% set scooter_updated = now() - states.device_tracker.samokat_dddennnisss.last_updated %}
+ {% set you_updated = now() - states.device_tracker.google_maps_108918666344169166438.last_updated %}
+ {{ scooter_updated.total_seconds() < 180 and you_updated.total_seconds() < 180 }}
+ device_class: connectivity
+ attributes:
+ scooter_last_updated: >-
+ {{ (states.device_tracker.samokat_dddennnisss.last_updated + timedelta(hours=7)).strftime('%Y-%m-%d %H:%M:%S') }}
+ dddennnisss_last_updated: >-
+ {{ (states.device_tracker.google_maps_108918666344169166438.last_updated + timedelta(hours=7)).strftime('%Y-%m-%d %H:%M:%S') }}
+ scooter_age_seconds: >-
+ {{ (now() - states.device_tracker.samokat_dddennnisss.last_updated).total_seconds() | round(0) }}
+ dddennnisss_age_seconds: >-
+ {{ (now() - states.device_tracker.google_maps_108918666344169166438.last_updated).total_seconds() | round(0) }}
+
+
+
+
+
+ input_boolean:
+ scooter_protection_active:
+ name: scooter_protection_active
+ initial: off
+
+
+ automation:
+ - alias: ntf|tg|scooter_protection_activate
+ id: scooter_protection_activate
+ mode: single
+ trigger:
+ - platform: template
+ value_template: >-
+ {% set lat1 = state_attr('device_tracker.google_maps_108918666344169166438', 'latitude') %}
+ {% set lon1 = state_attr('device_tracker.google_maps_108918666344169166438', 'longitude') %}
+ {% set lat2 = state_attr('device_tracker.samokat_dddennnisss', 'latitude') %}
+ {% set lon2 = state_attr('device_tracker.samokat_dddennnisss', 'longitude') %}
+ {% if lat1 and lon1 and lat2 and lon2 %}
+ {{ distance(lat1, lon1, lat2, lon2) > 0.05 }}
+ {% else %}
+ false
+ {% endif %}
+ for:
+ minutes: 4
+ condition:
+ - condition: state
+ entity_id: input_boolean.scooter_protection_active
+ state: 'off'
+# - condition: not
+# conditions:
+# - condition: state
+# entity_id: device_tracker.samokat_dddennnisss
+# state: 'home'
+ - condition: state
+ entity_id: binary_sensor.samokat_dddennnisss_motion
+ state: 'off'
+ for:
+ minutes: 2
+ - condition: template
+ value_template: >-
+ {% set scooter_updated = now() - states.device_tracker.samokat_dddennnisss.last_updated %}
+ {% set you_updated = now() - states.device_tracker.google_maps_108918666344169166438.last_updated %}
+ {{ scooter_updated.total_seconds() < 180 and you_updated.total_seconds() < 180 }}
+ action:
+ - service: input_boolean.turn_on
+ target:
+ entity_id: input_boolean.scooter_protection_active
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: >-
+ ⚠️ Самокат поставлен в режим защиты!
+
+ 📈 Скорость: {{ states('sensor.samokat_dddennnisss_speed') }} км/ч
+ 🏃♂️ Движение: {% if is_state('binary_sensor.samokat_dddennnisss_motion', 'on') %}Да{% else %}Нет{% endif %}
+ {% if is_state('input_boolean.scooter_protection_active', 'on') %}🔐 Включена блокировка{% else %}🔒 Отключена блокировка{% endif %}
+
+ 🛰️ GPS данные свежие: {% if is_state('binary_sensor.scooter_gps_data_fresh', 'on') %}Да ✅{% else %}Нет ❌{% endif %}
+ ⏳ Геоданные самоката: {{ (state_attr('binary_sensor.scooter_gps_data_fresh', 'scooter_age_seconds') or 0) | int }} сек
+ ⏳ Геоданные ddd: {{ (state_attr('binary_sensor.scooter_gps_data_fresh', 'dddennnisss_age_seconds') or 0) | int }} сек
+ 📍 Расстояние до самоката: {{
+ distance(
+ state_attr('device_tracker.google_maps_108918666344169166438', 'latitude'),
+ state_attr('device_tracker.google_maps_108918666344169166438', 'longitude'),
+ state_attr('device_tracker.samokat_dddennnisss', 'latitude'),
+ state_attr('device_tracker.samokat_dddennnisss', 'longitude')
+ ) | round(2)
+ }} км.
+
+
+ inline_keyboard:
+ - '🔓 Снять защиту:/sc_r_unlocked'
+ - '🛴 Самокат:/sc_control, ↩️ Меню:/menu_back'
+
+
+
+ - id: tg|mn|scooter_protection_deactivate
+ alias: tg|scooter_protection_deactivate
+ initial_state: true
+ trigger:
+ - platform: event
+ event_type: telegram_callback
+ event_data: {}
+ action:
+ - choose:
+ - conditions:
+ - condition: template
+ value_template: '{{ trigger.event.data.command == "/sc_r_unlocked" }}'
+ sequence:
+ - service: input_boolean.turn_off
+ target:
+ entity_id: input_boolean.scooter_protection_active
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "Защита самоката снята."
+ show_alert: false
+ - service: telegram_bot.delete_message
+ data_template:
+ message_id: '{{ trigger.event.data.message.message_id }}'
+ chat_id: '{{ trigger.event.data.chat_id }}'
+ - service: telegram_bot.send_message
+ data:
+ chat_id: '{{ trigger.event.data.chat_id }}'
+ message: "✅ Защита самоката успешно снята."
+ inline_keyboard:
+ - '🔓 Включить защиту:/sc_r_locked'
+ - '{{''\U0001F6F4''}} Самокат:/sc_control, {{''\U000021A9''}} Меню:/menu_back'
+
+
+ - id: tg|mn|scooter_protection_activate
+ alias: tg|scooter_protection_activate
+ initial_state: true
+ trigger:
+ - platform: event
+ event_type: telegram_callback
+ event_data: {}
+ action:
+ - choose:
+ - conditions:
+ - condition: template
+ value_template: '{{ trigger.event.data.command == "/sc_r_locked" }}'
+ sequence:
+ - service: input_boolean.turn_on
+ target:
+ entity_id: input_boolean.scooter_protection_active
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "Защита самоката включена."
+ show_alert: false
+ - service: telegram_bot.delete_message
+ data_template:
+ message_id: '{{ trigger.event.data.message.message_id }}'
+ chat_id: '{{ trigger.event.data.chat_id }}'
+ - service: telegram_bot.send_message
+ data:
+ chat_id: '{{ trigger.event.data.chat_id }}'
+ message: "✅ Защита самоката успешно включена."
+ inline_keyboard:
+ - '🔓 Снять защиту:/sc_r_unlocked'
+ - '{{''\U0001F6F4''}} Самокат:/sc_control, {{''\U000021A9''}} Меню:/menu_back'
+
+ - alias: ntf|tg|scooter_protection_alert
+ id: ntf_tg_scooter_protection_alert
+ mode: single
+ trigger:
+ - platform: template
+ value_template: >
+ {{
+ is_state('binary_sensor.samokat_dddennnisss_motion', 'on') and
+ (states('sensor.samokat_dddennnisss_speed') | float > 5.0) and
+ is_state('input_boolean.scooter_protection_active', 'on')
+ }}
+ for:
+ seconds: 40
+ condition:
+# - condition: template
+# value_template: >
+# {{ (as_timestamp(now()) - as_timestamp(states.binary_sensor.samokat_dddennnisss_motion.last_changed)) > 15 }}
+# - condition: template
+# value_template: >
+# {{ (as_timestamp(now()) - as_timestamp(states.sensor.samokat_dddennnisss_speed.last_changed)) > 15 }}
+ action:
+ - repeat:
+ while:
+ - condition: state
+ entity_id: input_boolean.scooter_protection_active
+ state: 'on'
+ sequence:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ message: >
+ 🚨 Внимание! Самокат движется со скоростью {{ states('sensor.samokat_dddennnisss_speed') }} км/ч.
+ Защита активна.
+ inline_keyboard:
+ - '🔓 Снять защиту:/sc_r_unlocked'
+ - '{{''\U0001F6F4''}} Самокат:/sc_control, {{''\U000021A9''}} Меню:/menu_back'
+ - delay: '00:00:30'
+
+
+
+
+
+
diff --git a/includes/packages/sensors.yaml b/includes/packages/sensors.yaml
new file mode 100644
index 0000000..1786a47
--- /dev/null
+++ b/includes/packages/sensors.yaml
@@ -0,0 +1,28 @@
+add_sensors:
+
+ template:
+
+########################
+#room
+
+ - sensor:
+ - default_entity_id: sensor.all_motion
+ name: Движение в квартире
+ state: '{{ (is_state(''sensor.0xa4c13834741ffdf4_presence_state'', ''presence'')
+ or is_state(''sensor.0xa4c1387cda74958b_presence_state'', ''presence'') or is_state(''binary_sensor.0x00158d000707efdf_motion'',
+ ''on'') or is_state(''sensor.room_motion'', ''True''))}}'
+
+
+ - default_entity_id: sensor.room_motion
+ name: Движение в комнате
+ state: '{{ (is_state(''binary_sensor.54ef44e32e91_motion'', ''on'') or is_state(''binary_sensor.54ef44e327ba_motion'',
+ ''on'') or is_state(''binary_sensor.54ef44e45e59_motion'', ''on''))}}'
+
+
+ - default_entity_id: sensor.where_people
+ name: Пристуствие людей в квартире
+ state: '{{ is_state(''device_tracker.google_maps_108918666344169166438'', ''home'')
+ or is_state(''device_tracker.google_maps_118311730364158481019'', ''home'')}}'
+
+
+
\ No newline at end of file
diff --git a/includes/packages/steamdeck.yaml b/includes/packages/steamdeck.yaml
new file mode 100644
index 0000000..f4e2702
--- /dev/null
+++ b/includes/packages/steamdeck.yaml
@@ -0,0 +1,168 @@
+steamdeck:
+ shell_command:
+ steamdeck_reboot: 'ssh -i /config/ssh/id_ed25519 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@192.168.1.185 "reboot"'
+ steamdeck_sleep: 'ssh -i /config/ssh/id_ed25519 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@192.168.1.185 "systemctl suspend"'
+ steamdeck_gamemode: 'ssh -i /config/ssh/id_ed25519 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null deck@192.168.1.185 "steamos-session-select gamescope"'
+ steamdeck_desktop: 'ssh -i /config/ssh/id_ed25519 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null deck@192.168.1.185 "steamos-session-select plasma-x11-persistent"'
+ steamdeck_mode: >
+ ssh -o StrictHostKeyChecking=no -i /config/ssh/id_ed25519 root@192.168.1.185 '
+ if pgrep -x gamescope >/dev/null; then
+ echo gaming
+ else
+ echo desktop
+ fi
+ '
+
+
+
+ sensor:
+ - platform: rest
+ name: SteamDeck System Info
+ resource: http://192.168.1.185:5050/status
+ method: GET
+ value_template: "{{ value_json.cpu.usage_percent }}"
+ json_attributes:
+ - cpu
+ - memory
+ - disk
+ - temperature_c
+ - uptime_seconds
+ - os
+ - os_version
+ - hostname
+ scan_interval: 60
+ template:
+ - sensor:
+ # CPU
+ - default_entity_id: sensor.steamdeck_cpu_logical
+ name: SteamDeck CPU Logical Cores
+ state: '{{ state_attr(''sensor.steamdeck_system_info'', ''cpu'')[''cores_logical'']}}'
+ - default_entity_id: sensor.steamdeck_cpu_physical
+ name: SteamDeck CPU Physical Cores
+ state: '{{ state_attr(''sensor.steamdeck_system_info'', ''cpu'')[''cores_physical'']}}'
+ - unit_of_measurement: '%'
+ default_entity_id: sensor.steamdeck_cpu_usage
+ name: SteamDeck CPU Usage
+ state: '{{ state_attr(''sensor.steamdeck_system_info'', ''cpu'')[''usage_percent'']| round(1) }}'
+
+ # RAM
+ - unit_of_measurement: GB
+ default_entity_id: sensor.steamdeck_ram_total
+ name: SteamDeck RAM Total
+ state: '{{ (state_attr(''sensor.steamdeck_system_info'', ''memory'')[''total'']/ 1024**3) | round(1) }}'
+ - unit_of_measurement: GB
+ default_entity_id: sensor.steamdeck_ram_used
+ name: SteamDeck RAM Used
+ state: '{{ (state_attr(''sensor.steamdeck_system_info'', ''memory'')[''used'']/ 1024**3) | round(1) }}'
+ - unit_of_measurement: GB
+ default_entity_id: sensor.steamdeck_ram_free
+ name: SteamDeck RAM Free
+ state: '{{ (state_attr(''sensor.steamdeck_system_info'', ''memory'')[''free'']/ 1024**3) | round(1) }}'
+ - unit_of_measurement: '%'
+ default_entity_id: sensor.steamdeck_ram_usage
+ name: SteamDeck RAM Usage
+ state: '{{ state_attr(''sensor.steamdeck_system_info'', ''memory'')[''usage_percent'']| round(1) }}'
+
+ # Внутренний диск
+ - unit_of_measurement: GB
+ default_entity_id: sensor.steamdeck_disk_internal_total
+ name: SteamDeck Disk Internal Total
+ state: '{{ (state_attr(''sensor.steamdeck_system_info'', ''disk'')[''internal''][''total'']/ 1024**3) | round(1) }}'
+ - unit_of_measurement: GB
+ default_entity_id: sensor.steamdeck_disk_internal_used
+ name: SteamDeck Disk Internal Used
+ state: '{{ (state_attr(''sensor.steamdeck_system_info'', ''disk'')[''internal''][''used'']/ 1024**3) | round(1) }}'
+ - unit_of_measurement: GB
+ default_entity_id: sensor.steamdeck_disk_internal_free
+ name: SteamDeck Disk Internal Free
+ state: '{{ (state_attr(''sensor.steamdeck_system_info'', ''disk'')[''internal''][''free'']/ 1024**3) | round(1) }}'
+ - unit_of_measurement: '%'
+ default_entity_id: sensor.steamdeck_disk_internal_usage
+ name: SteamDeck Disk Internal Usage
+ state: '{{ state_attr(''sensor.steamdeck_system_info'', ''disk'')[''internal''][''percent'']
+ | round(1) }}'
+
+ # SD-карта
+ - unit_of_measurement: GB
+ default_entity_id: sensor.steamdeck_disk_sd_total
+ name: SteamDeck Disk SD Total
+ state: '{{ (state_attr(''sensor.steamdeck_system_info'', ''disk'')[''sdcard''][''total'']/ 1024**3) | round(1) }}'
+ - unit_of_measurement: GB
+ default_entity_id: sensor.steamdeck_disk_sd_used
+ name: SteamDeck Disk SD Used
+ state: '{{ (state_attr(''sensor.steamdeck_system_info'', ''disk'')[''sdcard''][''used'']/ 1024**3) | round(1) }}'
+ - unit_of_measurement: GB
+ default_entity_id: sensor.steamdeck_disk_sd_free
+ name: SteamDeck Disk SD Free
+ state: '{{ (state_attr(''sensor.steamdeck_system_info'', ''disk'')[''sdcard''][''free'']/ 1024**3) | round(1) }}'
+ - unit_of_measurement: '%'
+ default_entity_id: sensor.steamdeck_disk_sd_usage
+ name: SteamDeck Disk SD Usage
+ state: '{{ state_attr(''sensor.steamdeck_system_info'', ''disk'')[''sdcard''][''percent'']| round(1) }}'
+
+ # Температуры
+ - unit_of_measurement: °C
+ default_entity_id: sensor.steamdeck_temp_edge
+ name: SteamDeck Temperature Edge
+ state: '{{ state_attr(''sensor.steamdeck_system_info'', ''temperature_c'')[''edge'']}}'
+ - unit_of_measurement: °C
+ default_entity_id: sensor.steamdeck_temp_composite
+ name: SteamDeck Temperature Composite
+ state: '{{ state_attr(''sensor.steamdeck_system_info'', ''temperature_c'')[''Composite'']}}'
+ - unit_of_measurement: °C
+ default_entity_id: sensor.steamdeck_temp_battery
+ name: SteamDeck Temperature Battery
+ state: '{{ state_attr(''sensor.steamdeck_system_info'', ''temperature_c'')[''BatteryTemp''] }}'
+ - unit_of_measurement: °C
+ default_entity_id: sensor.steamdeck_temp_wifi
+ name: SteamDeck Temperature WiFi
+ state: '{{ state_attr(''sensor.steamdeck_system_info'', ''temperature_c'')[''ath11k_hwmon'']}}'
+
+ # Аптайм
+ - unit_of_measurement: s
+ default_entity_id: sensor.steamdeck_uptime_seconds
+ name: SteamDeck Uptime Seconds
+ state: '{{ state_attr(''sensor.steamdeck_system_info'', ''uptime_seconds'') |int }}'
+ - default_entity_id: sensor.steamdeck_uptime_human
+ name: SteamDeck Uptime
+ state: "{% set s = state_attr('sensor.steamdeck_system_info', 'uptime_seconds')| int %} {% set h = s // 3600 %} {% set m = (s % 3600) // 60 %} {% set d = h// 24 %} {% if d > 0 %}\n {{ d }}д {{ h % 24 }}ч {{ m }}м\n{% else %}\n {{h }}ч {{ m }}м\n{% endif %}"
+
+ input_text:
+ telegram_message_id:
+ name: Telegram message ID
+ max: 10
+
+ automation:
+ - alias: tg|wrt_wol_steamdeck
+ trigger:
+ platform: event
+ event_type: telegram_command
+ event_data:
+ command: /wrt_wol_sd
+ action:
+ - variables:
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ - service: shell_command.wrt_wol_sd
+ - service: telegram_bot.send_message
+ data:
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: "steamdeck разбужен"
+ parse_mode: ""
+
+ - alias: tg|mn|status_sd_update
+ mode: single
+ trigger:
+ - platform: time_pattern
+ minutes: "/1" # запуск каждые 1 минуту
+ action:
+ - service: telegram_bot.edit_message
+ data:
+ chat_id: -1002006010424
+ message_id: 5767
+ message: >
+ 🎮: {% if is_state('binary_sensor.steamdeck', 'on') %}🟢 {% else %}🔴 {% endif %}
+ 🖧: {{ states('sensor.qemu_haos10_5_100_cpu_used') | round(1) }}% |🌡️ {{ states('sensor.proxmox_cpu_temperature') }}°C
+
+
+
+
diff --git a/includes/packages/telegramv2.yaml b/includes/packages/telegramv2.yaml
new file mode 100644
index 0000000..e770865
--- /dev/null
+++ b/includes/packages/telegramv2.yaml
@@ -0,0 +1,2022 @@
+telegramv2:
+ automation:
+ ## ---------------------------------------------------------
+ ## СТАРТОВАЯ АВТОМАТИЗАЦИЯ ГЛАВНОГО МЕНЮ (/go)
+ ## ---------------------------------------------------------
+ - id: telegram_menu_start
+ alias: "Вызов меню управления телеграм"
+ initial_state: true
+ trigger:
+ - platform: event
+ event_type: telegram_command
+ event_data:
+ command: "/go"
+ # --- ДОБАВЛЕННЫЙ ТРИГГЕР ДЛЯ ГРУППЫ ---
+ - platform: event
+ event_type: telegram_command
+ event_data:
+ command: "/go@ha_dddennnisss_bot"
+ action:
+ - service: weather.get_forecasts
+ continue_on_error: true
+ data:
+ type: hourly
+ target:
+ entity_id: weather.yandex_pogoda
+ response_variable: hourly_data
+ - service: telegram_bot.send_message
+ data:
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ parse_mode: html
+ message: |
+ {%- set s = (as_timestamp(now()) - as_timestamp(states('sensor.system_monitor_last_boot'))) | int -%}
+ {%- set current_cond = states('weather.yandex_pogoda') -%}
+ {%- set weather_available = current_cond not in ['unavailable', 'unknown'] and hourly_data is defined and 'weather.yandex_pogoda' in hourly_data -%}
+ {%- if weather_available -%}
+ {%- set condition_map = {'clear': '☀️', 'partlycloudy': '🌤', 'cloudy': '☁️', 'overcast': '🌫', 'rainy': '🌧', 'pouring': '🌧', 'lightrain': '🌦', 'snowy': '🌨', 'snowyrainy': '🌨🌧', 'exceptional': '❗', 'hail': '🌨', 'lightning': '⛈', 'lightning-rainy': '⛈', 'fog': '🌫', 'windy': '💨', 'windy-variant': '💨', 'partly-cloudy-day': '🌤', 'partly-cloudy-night': '🌤', 'clear-night': '🌙', 'none': '❓'} -%}
+ {%- set t = state_attr('weather.yandex_pogoda', 'temperature') | default('?', true) -%}
+ {%- set w = state_attr('weather.yandex_pogoda', 'wind_speed') | float(0) -%}
+ {%- set wind_desc = 'Штиль' if w < 1 else 'Тихий' if w < 5 else 'Лёгкий' if w < 11 else 'Слабый' if w < 19 else 'Умеренный' if w < 28 else 'Свежий' if w < 38 else 'Сильный' if w < 49 else 'Крепкий' if w < 61 else 'Очень крепкий' if w < 74 else 'Шторм' if w < 88 else 'Сильный шторм' if w < 102 else 'Жестокий шторм' if w < 117 else 'Ураган' -%}
+ {%- set weather_text = '🌍 Погода: 🌡️ ' ~ t ~ '° - ' ~ condition_map.get(current_cond, '❓') ~ '\n💨 ' ~ w ~ ' км/ч — ' ~ wind_desc -%}
+ {%- if hourly_data['weather.yandex_pogoda'].forecast is defined -%}
+ {%- set ns = namespace(f_list=[]) -%}
+ {%- for hour in hourly_data['weather.yandex_pogoda'].forecast[:3] -%}
+ {%- set ns.f_list = ns.f_list + [hour.datetime.strftime("%H:%M") ~ ' ' ~ (hour.temperature | round(0)) ~ '° ' ~ condition_map.get(hour.condition, '☁️')] -%}
+ {%- endfor -%}
+ {%- set weather_text = weather_text ~ '\n🕒 ' ~ ns.f_list | join(' | ') -%}
+ {%- endif -%}
+ {%- else -%}
+ {%- set weather_text = '🌍 Погода: ⚠️ Данные погоды временно недоступны' -%}
+ {%- endif -%}
+ 🔧 HA: ⚙️ {{ states('sensor.qemu_haos10_5_100_cpu_used') | round(1) }}% | 💾 {{ states('sensor.qemu_haos10_5_100_memory_used_percentage') | round(1) }}% | 🌡️ {{ states('sensor.proxmox_cpu_temperature') }}°C | ⏱️ {{ s // 86400 }}d {{ '%02d:%02d' % ((s % 86400) // 3600, (s % 3600) // 60) }}
+
+ 🚪 Дверь: {% if is_state('binary_sensor.e4aaec3747b2_contact', 'off') %}закрыта{% else %}открыта{% endif %}
+ 🏡 Дома: {% set denis_home = is_state('device_tracker.google_maps_108918666344169166438', 'home') %}{% set lena_home = is_state('device_tracker.google_maps_118311730364158481019', 'home') %}{% if denis_home and lena_home %}Денис и Лена{% elif denis_home %}Денис{% elif lena_home %}Лена{% else %}Все ушли{% endif %}
+ 🚶 Присутствие: {% if not is_state('sensor.room_motion', 'False') %}Зал✔ {% endif %}{% if is_state('binary_sensor.datchik_prisutstviia_kukhnia_presence', 'on') %}Кухня✔ {% endif %}{% if is_state('binary_sensor.datchik_prisutstviia_vannaia_presence', 'on') %}Ванна✔ {% endif %}{% if is_state('binary_sensor.0x00158d000707efdf_motion', 'on') %}Коридор✔{% endif %}
+ 🌡️ {{ states('sensor.a4c1387695b9_temperature') }}°C | 💧 {{ states('sensor.a4c1387695b9_humidity') }}%
+
+ 🍽️: {% set dw_status = states('sensor.bosch_dishwasher_operation_state') %}{% set dw_salt = states('sensor.bosch_dishwasher_salt') %}{% if dw_salt == 'full' %}{% if dw_status == 'Ready' %}{% if states('input_datetime.dishwasher_startinrelative') == '00:00:00' %}{% if is_state('input_boolean.dishwasher_needs_unloading', 'on') %}Нужно разобрать посуду{% else %}Ожидание{% endif %}{% else %}Отложенный запуск: {{ states('input_datetime.dishwasher_startinrelative') }}{% endif %}{% elif dw_status == 'Run' %}✅ Выполнено: {{ states('sensor.bosch_dishwasher_program_progress') }}%{% else %}ℹ️ {{ dw_status }}{% endif %}{% else %}⚠️ Проверь соль!{% endif %}
+ 👔: {% if is_state('binary_sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_error_state', 'on') %}❗ Ошибка стиралки ❗{% else %}{% set wm_state = states('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_run_state') %}{% if wm_state in ['Стирка', 'Ополаскивание', 'Отжим', 'Сушка'] %}Осталось: {{ state_attr('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi','remain_time') }}{% elif wm_state == 'Охлаждение' %}❗ Достань бельё❗{% endif %}{% endif %}
+ 🌀: {% set vac = states('sensor.dreame_mc1808_044c_status') %}{% if vac == 'сухая уборка' %}Уборка: {{ state_attr('vacuum.stytj01zhm','cleaning_time') or 0 }} мин{% elif vac == 'ошибка' %}❗ Ошибка пылесоса ❗{% else %}{{ vac | capitalize }} 🔋{{ states('sensor.dreame_mc1808_044c_battery_level') }}%{% endif %}{% if is_state('sensor.vacuum_water_box', '1') %} ❗ Убери бак с водой ❗{% endif %}
+ {{ weather_text }}
+ inline_keyboard:
+ - '🌍 Proxmox:/prxmx_control, 🌈 Погода:/wthr_control'
+ - '🌀 Пылесос:/vcm_control, 🌊 Посудомойка:/dw_control'
+ - '🏢 Квартира:/kv_control, 🎮 SteamDeck {% if is_state("binary_sensor.steamdeck", "off") %}🔴{% else %}🟢{% endif %}:/sd_control'
+ - '💡 Выкл весь свет:/toggle_off_lght'
+ - '📍 gps:/gps_control, 🛴 Самокат:/sc_control'
+ - '⬇️ Торренты:/tr_control, ⚙️ Автоматизация:/au_control'
+ - '🔔 Домофон:/intercom_menu'
+ - '🔄 Обновить:/menu_back, 🗑 Прочитано:/menu_hide'
+
+ # Автоматизация отключения света по таймеру \\ /homeassistant/includes/packages/controls_light.yaml
+
+ ## ---------------------------------------------------------
+ ## КОНТРОЛЛЕР ГЛАВНОГО МЕНЮ (Обработка кнопок)
+ ## ---------------------------------------------------------
+ - id: telegram_menu_control
+ alias: "Главное меню управления телеграм"
+ initial_state: true
+ trigger:
+ - platform: event
+ event_type: telegram_callback
+ action:
+ - choose:
+ # --- КНОПКА: ЗАКРЫТЬ МЕНЮ ---
+ - conditions: "{{ trigger.event.data.command == '/menu_hide' }}"
+ sequence:
+ - service: telegram_bot.delete_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+
+ # --- КНОПКА: ВЫКЛЮЧИТЬ СВЕТ ---
+ - conditions: "{{ trigger.event.data.command == '/toggle_off_lght' }}"
+ sequence:
+ - service: input_button.press
+ target:
+ entity_id: input_button.btn_vykliuchit_ves_svet
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "💡 Свет выключен!"
+
+ # --- КНОПКА: ОБНОВИТЬ ГЛАВНОЕ МЕНЮ ---
+ - conditions: "{{ trigger.event.data.command == '/menu_back' }}"
+ sequence:
+ - service: weather.get_forecasts
+ continue_on_error: true
+ data:
+ type: hourly
+ target:
+ entity_id: weather.yandex_pogoda
+ response_variable: hourly_data
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ parse_mode: html
+ message: |
+ {%- set s = (as_timestamp(now()) - as_timestamp(states('sensor.system_monitor_last_boot'))) | int -%}
+ {%- set current_cond = states('weather.yandex_pogoda') -%}
+ {%- set weather_available = current_cond not in ['unavailable', 'unknown'] and hourly_data is defined and 'weather.yandex_pogoda' in hourly_data -%}
+ {%- if weather_available -%}
+ {%- set condition_map = {'clear': '☀️', 'partlycloudy': '🌤', 'cloudy': '☁️', 'overcast': '🌫', 'rainy': '🌧', 'pouring': '🌧', 'lightrain': '🌦', 'snowy': '🌨', 'snowyrainy': '🌨🌧', 'exceptional': '❗', 'hail': '🌨', 'lightning': '⛈', 'lightning-rainy': '⛈', 'fog': '🌫', 'windy': '💨', 'windy-variant': '💨', 'partly-cloudy-day': '🌤', 'partly-cloudy-night': '🌤', 'clear-night': '🌙', 'none': '❓'} -%}
+ {%- set t = state_attr('weather.yandex_pogoda', 'temperature') | default('?', true) -%}
+ {%- set w = state_attr('weather.yandex_pogoda', 'wind_speed') | float(0) -%}
+ {%- set wind_desc = 'Штиль' if w < 1 else 'Тихий' if w < 5 else 'Лёгкий' if w < 11 else 'Слабый' if w < 19 else 'Умеренный' if w < 28 else 'Свежий' if w < 38 else 'Сильный' if w < 49 else 'Крепкий' if w < 61 else 'Очень крепкий' if w < 74 else 'Шторм' if w < 88 else 'Сильный шторм' if w < 102 else 'Жестокий шторм' if w < 117 else 'Ураган' -%}
+ {%- set weather_text = '🌍 Погода: 🌡️ ' ~ t ~ '° - ' ~ condition_map.get(current_cond, '❓') ~ '\n💨 ' ~ w ~ ' км/ч — ' ~ wind_desc -%}
+ {%- if hourly_data['weather.yandex_pogoda'].forecast is defined -%}
+ {%- set ns = namespace(f_list=[]) -%}
+ {%- for hour in hourly_data['weather.yandex_pogoda'].forecast[:3] -%}
+ {%- set ns.f_list = ns.f_list + [hour.datetime.strftime("%H:%M") ~ ' ' ~ (hour.temperature | round(0)) ~ '° ' ~ condition_map.get(hour.condition, '☁️')] -%}
+ {%- endfor -%}
+ {%- set weather_text = weather_text ~ '\n🕒 ' ~ ns.f_list | join(' | ') -%}
+ {%- endif -%}
+ {%- else -%}
+ {%- set weather_text = '🌍 Погода: ⚠️ Данные погоды временно недоступны' -%}
+ {%- endif -%}
+ 🔧 HA: ⚙️ {{ states('sensor.qemu_haos10_5_100_cpu_used') | round(1) }}% | 💾 {{ states('sensor.qemu_haos10_5_100_memory_used_percentage') | round(1) }}% | 🌡️ {{ states('sensor.proxmox_cpu_temperature') }}°C | ⏱️ {{ s // 86400 }}d {{ '%02d:%02d' % ((s % 86400) // 3600, (s % 3600) // 60) }}
+
+ 🚪 Дверь: {% if is_state('binary_sensor.e4aaec3747b2_contact', 'off') %}закрыта{% else %}открыта{% endif %}
+ 🏡 Дома: {% set denis_home = is_state('device_tracker.google_maps_108918666344169166438', 'home') %}{% set lena_home = is_state('device_tracker.google_maps_118311730364158481019', 'home') %}{% if denis_home and lena_home %}Денис и Лена{% elif denis_home %}Денис{% elif lena_home %}Лена{% else %}Все ушли{% endif %}
+ 🚶 Присутствие: {% if not is_state('sensor.room_motion', 'False') %}Зал✔ {% endif %}{% if is_state('binary_sensor.datchik_prisutstviia_kukhnia_presence', 'on') %}Кухня✔ {% endif %}{% if is_state('binary_sensor.datchik_prisutstviia_vannaia_presence', 'on') %}Ванна✔ {% endif %}{% if is_state('binary_sensor.0x00158d000707efdf_motion', 'on') %}Коридор✔{% endif %}
+ 🌡️ {{ states('sensor.a4c1387695b9_temperature') }}°C | 💧 {{ states('sensor.a4c1387695b9_humidity') }}%
+
+ 🍽️: {% set dw_status = states('sensor.bosch_dishwasher_operation_state') %}{% set dw_salt = states('sensor.bosch_dishwasher_salt') %}{% if dw_salt == 'full' %}{% if dw_status == 'Ready' %}{% if states('input_datetime.dishwasher_startinrelative') == '00:00:00' %}{% if is_state('input_boolean.dishwasher_needs_unloading', 'on') %}Нужно разобрать посуду{% else %}Ожидание{% endif %}{% else %}Отложенный запуск: {{ states('input_datetime.dishwasher_startinrelative') }}{% endif %}{% elif dw_status == 'Run' %}✅ Выполнено: {{ states('sensor.bosch_dishwasher_program_progress') }}%{% else %}ℹ️ {{ dw_status }}{% endif %}{% else %}⚠️ Проверь соль!{% endif %}
+ 👔: {% if is_state('binary_sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_error_state', 'on') %}❗ Ошибка стиралки ❗{% else %}{% set wm_state = states('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_run_state') %}{% if wm_state in ['Стирка', 'Ополаскивание', 'Отжим', 'Сушка'] %}Осталось: {{ state_attr('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi','remain_time') }}{% elif wm_state == 'Охлаждение' %}❗ Достань бельё❗{% endif %}{% endif %}
+ 🌀: {% set vac = states('sensor.dreame_mc1808_044c_status') %}{% if vac == 'сухая уборка' %}Уборка: {{ state_attr('vacuum.stytj01zhm','cleaning_time') or 0 }} мин{% elif vac == 'ошибка' %}❗ Ошибка пылесоса ❗{% else %}{{ vac | capitalize }} 🔋{{ states('sensor.dreame_mc1808_044c_battery_level') }}%{% endif %}{% if is_state('sensor.vacuum_water_box', '1') %} ❗ Убери бак с водой ❗{% endif %}
+ {{ weather_text }}
+ inline_keyboard:
+ - '🌍 Proxmox:/prxmx_control, 🌈 Погода:/wthr_control'
+ - '🌀 Пылесос:/vcm_control, 🌊 Посудомойка:/dw_control'
+ - '🏢 Квартира:/kv_control, 🎮 SteamDeck {% if is_state("binary_sensor.steamdeck", "off") %}🔴{% else %}🟢{% endif %}:/sd_control'
+ - '💡 Выкл весь свет:/toggle_off_lght'
+ - '📍 gps:/gps_control, 🛴 Самокат:/sc_control'
+ - '⬇️ Торренты:/tr_control, ⚙️ Автоматизация:/au_control'
+ - '🔔 Домофон:/intercom_menu'
+ - '🔄 Обновить:/menu_back, 🗑 Прочитано:/menu_hide'
+
+ # --- МЕНЮ: PROXMOX ---
+ - conditions: "{{ trigger.event.data.command == '/prxmx_control' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🔄 Обновляю статус Proxmox..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: >-
+ 🌍 Состояние Proxmox:
+
+ 📈 CPU: {{ states('sensor.node_pr_cpu_used') | round(2) }} %
+ 🌡️ {{ states('sensor.proxmox_cpu_temperature') }} ℃
+ 📝 RAM: {{ states('sensor.node_pr_memory_used_percentage') | round(2) }} %
+ 💾 Disk: {{ states('sensor.node_pr_disk_used_percentage') | round(2) }} %
+ 🔄 Обновления: {% if is_state('binary_sensor.node_pr_updates_packages', 'on') %} есть {% else %} нет {% endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '💽 HA - {% if is_state("binary_sensor.qemu_haos10_5_100_status", "off") %}🔴{% else %}🟢{% endif %}:/prxmx_ha_control'
+ - '💽 Samba - {% if is_state("binary_sensor.lxc_docker_101_status", "off") %}🔴{% else %}🟢{% endif %}:/prxmx_smb_control, 📺 Plex - {% if is_state("binary_sensor.lxc_plex_104_status", "off") %}🔴{% else %}🟢{% endif %}:/prxmx_plx_control'
+ - '🪟 Winjob - {% if is_state("binary_sensor.qemu_wni10forjob_105_status", "off") %}🔴{% else %}🟢{% endif %}:/prxmx_winjob_control'
+ - '🔄 Перезагрузить сервер:/toggle_prxm_rstr'
+ - '🔙 Назад:/menu_back, 🔄 Обновить:/prxmx_control'
+
+ # --- МЕНЮ: WINJOB ---
+ - conditions: "{{ trigger.event.data.command == '/prxmx_winjob_control' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🔄 Обновляю статус Winjob..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: >-
+ 🪟 Состояние Winjob:
+
+ 📈 CPU: {{ states('sensor.qemu_wni10forjob_105_cpu_used') | round(2) }} %
+ 📝 RAM: {{ states('sensor.qemu_wni10forjob_105_memory_used_percentage') | round(2) }} %
+ 💾 Disk: {{ states('sensor.qemu_wni10forjob_105_disk_used_percentage') | round(2) }} %
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '▶️ Старт:/toggle_prxm_winjob_strt, 🔄 Рестарт:/toggle_prxm_winjob_rstrt'
+ - '🛑 Выключить:/toggle_prxm_winjob_off'
+ - '🔙 Назад:/prxmx_control, 🔄 Обновить:/prxmx_winjob_control'
+
+ # --- КНОПКИ УПРАВЛЕНИЯ WINJOB (С плавным обновлением) ---
+ - conditions: "{{ trigger.event.data.command == '/toggle_prxm_winjob_strt' }}"
+ sequence:
+ - service: button.press
+ target:
+ entity_id: button.qemu_wni10forjob_105_start
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "▶️ Winjob запускается..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: >-
+ 🪟 Состояние Winjob:
+
+ 📈 CPU: {{ states('sensor.qemu_wni10forjob_105_cpu_used') | round(2) }} %
+ 📝 RAM: {{ states('sensor.qemu_wni10forjob_105_memory_used_percentage') | round(2) }} %
+ 💾 Disk: {{ states('sensor.qemu_wni10forjob_105_disk_used_percentage') | round(2) }} %
+
+ ⏳ Команда отправлена: Запуск
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '▶️ Старт:/toggle_prxm_winjob_strt, 🔄 Рестарт:/toggle_prxm_winjob_rstrt'
+ - '🛑 Выключить:/toggle_prxm_winjob_off'
+ - '🔙 Назад:/prxmx_control, 🔄 Обновить:/prxmx_winjob_control'
+
+ - conditions: "{{ trigger.event.data.command == '/toggle_prxm_winjob_rstrt' }}"
+ sequence:
+ - service: button.press
+ target:
+ entity_id: button.qemu_wni10forjob_105_reboot
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🔄 Winjob ушел в рестарт..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: >-
+ 🪟 Состояние Winjob:
+
+ 📈 CPU: {{ states('sensor.qemu_wni10forjob_105_cpu_used') | round(2) }} %
+ 📝 RAM: {{ states('sensor.qemu_wni10forjob_105_memory_used_percentage') | round(2) }} %
+ 💾 Disk: {{ states('sensor.qemu_wni10forjob_105_disk_used_percentage') | round(2) }} %
+
+ ⏳ Команда отправлена: Рестарт
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '▶️ Старт:/toggle_prxm_winjob_strt, 🔄 Рестарт:/toggle_prxm_winjob_rstrt'
+ - '🛑 Выключить:/toggle_prxm_winjob_off'
+ - '🔙 Назад:/prxmx_control, 🔄 Обновить:/prxmx_winjob_control'
+
+ - conditions: "{{ trigger.event.data.command == '/toggle_prxm_winjob_off' }}"
+ sequence:
+ - service: button.press
+ target:
+ entity_id: button.qemu_wni10forjob_105_shutdown
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🛑 Winjob выключается..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: >-
+ 🪟 Состояние Winjob:
+
+ 📈 CPU: {{ states('sensor.qemu_wni10forjob_105_cpu_used') | round(2) }} %
+ 📝 RAM: {{ states('sensor.qemu_wni10forjob_105_memory_used_percentage') | round(2) }} %
+ 💾 Disk: {{ states('sensor.qemu_wni10forjob_105_disk_used_percentage') | round(2) }} %
+
+ ⏳ Команда отправлена: Выключение
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '▶️ Старт:/toggle_prxm_winjob_strt, 🔄 Рестарт:/toggle_prxm_winjob_rstrt'
+ - '🛑 Выключить:/toggle_prxm_winjob_off'
+ - '🔙 Назад:/prxmx_control, 🔄 Обновить:/prxmx_winjob_control'
+
+ # --- МЕНЮ: ПОГОДА (ГЛАВНОЕ) ---
+ - conditions: "{{ trigger.event.data.command == '/wthr_control' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🌤 Обновляю погоду..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: >-
+ 🌈 Текущая погода:
+
+ 🌡️ Температура: {{ state_attr('weather.yandex_pogoda', 'temperature') }} °C
+ 💨 Ветер: {{ state_attr('weather.yandex_pogoda', 'wind_speed') }} км/ч
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '🕒 Почасовой прогноз:/wthr_h_control'
+ - '📆 Прогноз на неделю:/wthr_d_control'
+ - '🔙 Назад:/menu_back, 🔄 Обновить:/wthr_control'
+
+ # --- МЕНЮ: ПОГОДА (ПОЧАСОВОЙ ПРОГНОЗ) ---
+ - conditions: "{{ trigger.event.data.command == '/wthr_h_control' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🕒 Загружаю прогноз..."
+ - service: weather.get_forecasts
+ data:
+ type: hourly
+ target:
+ entity_id: weather.yandex_pogoda
+ response_variable: hourly_data
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ 🕒 Прогноз на 12 часов:
+ {% set forecast = hourly_data['weather.yandex_pogoda'].forecast[:12] -%}
+ {%- if forecast -%}
+ {% for hour in forecast %}
+ 🕒 {{ hour.datetime.strftime("%H:%M") }}: {{ hour.temperature }}°C, Ветер: {{ hour.wind_speed }} км/ч
+ {%- endfor %}
+ {%- else %}
+ ⚠️ Прогноз недоступен
+ {%- endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '📆 Ежедневный прогноз:/wthr_d_control'
+ - '🔙 Назад:/wthr_control, 🔄 Обновить:/wthr_h_control'
+ - '🏠 Главное меню:/menu_back'
+
+ # --- МЕНЮ: ПОГОДА (ЕЖЕДНЕВНЫЙ ПРОГНОЗ) ---
+ - conditions: "{{ trigger.event.data.command == '/wthr_d_control' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "📆 Загружаю прогноз..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ {%- set condition_icons = {
+ 'clear': '☀️', 'partlycloudy': '🌤', 'cloudy': '☁️',
+ 'overcast': '🌫', 'rainy': '🌧', 'pouring': '🌧',
+ 'lightrain': '🌦', 'snowy': '🌨', 'snowyrainy': '🌨🌧',
+ 'exceptional': '❗', 'hail': '🌨', 'lightning': '⛈',
+ 'lightning-rainy': '⛈', 'fog': '🌫', 'windy': '💨',
+ 'windy-variant': '💨', 'partly-cloudy-day': '🌤',
+ 'partly-cloudy-night': '🌤', 'clear-night': '🌙', 'none': '❓'
+ } -%}
+ {%- set weekdays = ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс'] -%}
+ {%- macro wind_description(speed_kmh) -%}
+ {%- if speed_kmh < 1 %}Штиль
+ {%- elif speed_kmh < 5 %}Тихий
+ {%- elif speed_kmh < 11 %}Лёгкий
+ {%- elif speed_kmh < 19 %}Слабый
+ {%- elif speed_kmh < 28 %}Умеренный
+ {%- elif speed_kmh < 38 %}Свежий
+ {%- elif speed_kmh < 49 %}Сильный
+ {%- elif speed_kmh < 61 %}Крепкий
+ {%- elif speed_kmh < 74 %}Очень крепкий
+ {%- elif speed_kmh < 88 %}Шторм
+ {%- elif speed_kmh < 102 %}Сильный шторм
+ {%- elif speed_kmh < 117 %}Жестокий шторм
+ {%- else %}Ураган
+ {%- endif %}
+ {%- endmacro -%}
+ 📆 Прогноз на 6 дней:
+ {% for i in range(1, 7) %}
+ {%- set cond = states('sensor.home_assistant_condition_forecast_' ~ i ~ 'd')|lower -%}
+ {%- set temp = states('sensor.home_assistant_temperature_forecast_' ~ i ~ 'd') -%}
+ {%- set wind_ms = states('sensor.home_assistant_wind_speed_forecast_' ~ i ~ 'd')|float(0) -%}
+ {%- set wind_kmh = (wind_ms * 3.6)|round(1) -%}
+ {%- set wind_text = wind_description(wind_kmh) -%}
+ {%- set date_obj = now() + timedelta(days=i) -%}
+ {%- set weekday = weekdays[date_obj.weekday()] -%}
+ {%- set date = date_obj.strftime('%d.%m') %}
+ 🔹 {{ weekday }}, {{ date }}: {{ temp }}°C {{ condition_icons.get(cond, '❓') }}, Ветер — {{ wind_text }}
+ {%- endfor %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '🕒 Почасовой прогноз:/wthr_h_control'
+ - '🔙 Назад:/wthr_control, 🔄 Обновить:/wthr_d_control'
+ - '🏠 Главное меню:/menu_back'
+
+ # ==========================================
+ # --- МЕНЮ: ПЫЛЕСОС (ГЛАВНОЕ) ---
+ # ==========================================
+ - conditions: "{{ trigger.event.data.command == '/vcm_control' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🔄 Загружаю меню пылесоса..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ 🌀 Пылесос: {{ state_attr('vacuum.dreame_mc1808_044c_robot_cleaner_2', 'vacuum.status_desc') | default('Нет данных') }}
+ 🌪️ Сила всасывания: {{ state_attr('vacuum.dreame_mc1808_044c_robot_cleaner_2', 'fan_speed') | default('Нет данных') }}
+ 🌊 Сила полива: {% set water = state_attr('vacuum.stytj01zhm', 'water_level') %}{% if water == 'High' %}Полная{% elif water == 'Med' %}Средняя{% elif water == 'Low' %}Низкая{% else %}Нет данных{% endif %}
+ 💧 Бак с водой: {% if state_attr('vacuum.dreame_mc1808_044c_robot_cleaner_2','clean.water_box') | int(0) == 1 %}❗Установлен❗{% else %}Снят{% endif %}
+ 🔋 Заряд: {{ state_attr('vacuum.dreame_mc1808_044c_robot_cleaner_2','battery_level') | default(0) }}%
+
+ {% set status = states("group.all_rooms_for_vac_clean") %}
+ {%- if status == "off" %}
+ ▶️ Запустите уборку всей квартиры,
+ 🔴 либо выберите комнаты:
+ {%- elif status == "on" %}
+ ▶️ Запустите уборку выбранных комнат,
+ 🟢 либо отмените комнаты для уборки всей квартиры:
+ {%- else %}
+ Нет данных
+ {%- endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '▶️ {% set status = states("group.all_rooms_for_vac_clean") %}{% if status == "off" %}Уборка всей квартиры{% elif status == "on" %}Уборка выбранных комнат{% else %}Нет данных{% endif %} :/toggle_vcm_start'
+ - "{% if is_state('input_boolean.room_vacuum', 'off') %}🔴{% else %}🟢{% endif %} Убрать комнату:/toggle_vcm_rm, {% if is_state('input_boolean.lobby_vacuum', 'off') %}🔴{% else %}🟢{% endif %} Убрать прихожую:/toggle_vcm_lb"
+ - "{% if is_state('input_boolean.hallway_vacuum', 'off') %}🔴{% else %}🟢{% endif %} Убрать коридор:/toggle_vcm_hl, {% if is_state('input_boolean.bathroom_vacuum', 'off') %}🔴{% else %}🟢{% endif %} Убрать ванную:/toggle_vcm_br"
+ - "{% if is_state('input_boolean.kitchen_vacuum', 'off') %}🔴{% else %}🟢{% endif %} Убрать кухню:/toggle_vcm_kc"
+ - '🏠 Вернуться на базу:/toggle_vcm_stop'
+ - '🌪️ Сила всасывания:/toggle_vcm_wnd, 🌊 Сила полива:/toggle_vcm_wtr'
+ - '🔙 Назад:/menu_back, 🔄 Обновить:/vcm_control'
+
+ # --- КНОПКА: ЗАПУСК УБОРКИ ---
+ - conditions: "{{ trigger.event.data.command == '/toggle_vcm_start' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🧹 Запускаю уборку..."
+ # Логика запуска
+ - choose:
+ - conditions: "{{ is_state('group.all_rooms_for_vac_clean', 'off') }}"
+ sequence:
+ - service: vacuum.start
+ target:
+ device_id: 885672257bd73c7492a4ba8b72b83699
+ - conditions: "{{ is_state('group.all_rooms_for_vac_clean', 'on') }}"
+ sequence:
+ - service: xiaomi_miot.call_action
+ data:
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ siid: 18
+ aiid: 1
+ params:
+ - piid: 1
+ value: 18
+ - >-
+ {{ {'piid':21, 'value': states('sensor.select_rooms_for_clean')} }}
+ force_params: true
+ # Логика настройки силы всасывания
+ - choose:
+ - conditions: "{{ is_state('sensor.select_vacuum_fan_speed', 'Турбо') }}"
+ sequence:
+ - service: script.set_fanspeed_vacum_turbo
+ - conditions: "{{ is_state('sensor.select_vacuum_fan_speed', 'Средний') }}"
+ sequence:
+ - service: script.set_fanspeed_vacum_strong
+ - conditions: "{{ is_state('sensor.select_vacuum_fan_speed', 'Стандартный') }}"
+ sequence:
+ - service: script.set_fanspeed_vacum_standart
+ - conditions: "{{ is_state('sensor.select_vacuum_fan_speed', 'Тихий') }}"
+ sequence:
+ - service: script.set_fanspeed_vacum_silent
+ # Логика настройки полива
+ - choose:
+ - conditions: "{{ is_state('sensor.select_water_vacum', 'Low') }}"
+ sequence:
+ - service: script.set_water_vacum_low
+ - conditions: "{{ is_state('sensor.select_water_vacum', 'Med') }}"
+ sequence:
+ - service: script.set_water_vacum_middle
+ - conditions: "{{ is_state('sensor.select_water_vacum', 'High') }}"
+ sequence:
+ - service: script.set_water_vacum_hight
+
+ # --- КНОПКА: ВЕРНУТЬ НА БАЗУ ---
+ - conditions: "{{ trigger.event.data.command == '/toggle_vcm_stop' }}"
+ sequence:
+ - service: vacuum.return_to_base
+ target:
+ device_id: 885672257bd73c7492a4ba8b72b83699
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🏠 Пылесос возвращается на базу..."
+
+ # ==========================================
+ # --- КНОПКИ ВЫБОРА КОМНАТ ---
+ # ==========================================
+ - conditions: >
+ {{ trigger.event.data.command in [
+ '/toggle_vcm_rm', '/toggle_vcm_lb', '/toggle_vcm_hl',
+ '/toggle_vcm_br', '/toggle_vcm_kc'
+ ] }}
+ sequence:
+ - choose:
+ - conditions: "{{ trigger.event.data.command == '/toggle_vcm_rm' }}"
+ sequence:
+ - service: input_boolean.toggle
+ target: { entity_id: input_boolean.room_vacuum }
+ - conditions: "{{ trigger.event.data.command == '/toggle_vcm_lb' }}"
+ sequence:
+ - service: input_boolean.toggle
+ target: { entity_id: input_boolean.lobby_vacuum }
+ - conditions: "{{ trigger.event.data.command == '/toggle_vcm_hl' }}"
+ sequence:
+ - service: input_boolean.toggle
+ target: { entity_id: input_boolean.hallway_vacuum }
+ - conditions: "{{ trigger.event.data.command == '/toggle_vcm_br' }}"
+ sequence:
+ - service: input_boolean.toggle
+ target: { entity_id: input_boolean.bathroom_vacuum }
+ - conditions: "{{ trigger.event.data.command == '/toggle_vcm_kc' }}"
+ sequence:
+ - service: input_boolean.toggle
+ target: { entity_id: input_boolean.kitchen_vacuum }
+
+ - delay:
+ milliseconds: 200
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "✅ Выбор комнат обновлен"
+ # Плавно перерисовываем меню пылесоса с новыми зелеными/красными кружками
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ 🌀 Пылесос: {{ state_attr('vacuum.dreame_mc1808_044c_robot_cleaner_2', 'vacuum.status_desc') | default('Нет данных') }}
+ 🌪️ Сила всасывания: {{ state_attr('vacuum.dreame_mc1808_044c_robot_cleaner_2', 'fan_speed') | default('Нет данных') }}
+ 🌊 Сила полива: {% set water = state_attr('vacuum.stytj01zhm', 'water_level') %}{% if water == 'High' %}Полная{% elif water == 'Med' %}Средняя{% elif water == 'Low' %}Низкая{% else %}Нет данных{% endif %}
+ 💧 Бак с водой: {% if state_attr('vacuum.dreame_mc1808_044c_robot_cleaner_2','clean.water_box') | int(0) == 1 %}❗Установлен❗{% else %}Снят{% endif %}
+ 🔋 Заряд: {{ state_attr('vacuum.dreame_mc1808_044c_robot_cleaner_2','battery_level') | default(0) }}%
+
+ {% set status = states("group.all_rooms_for_vac_clean") %}
+ {%- if status == "off" %}
+ ▶️ Запустите уборку всей квартиры,
+ 🔴 либо выберите комнаты:
+ {%- elif status == "on" %}
+ ▶️ Запустите уборку выбранных комнат,
+ 🟢 либо отмените комнаты для уборки всей квартиры:
+ {%- else %}
+ Нет данных
+ {%- endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '▶️ {% set status = states("group.all_rooms_for_vac_clean") %}{% if status == "off" %}Уборка всей квартиры{% elif status == "on" %}Уборка выбранных комнат{% else %}Нет данных{% endif %} :/toggle_vcm_start'
+ - "{% if is_state('input_boolean.room_vacuum', 'off') %}🔴{% else %}🟢{% endif %} Убрать комнату:/toggle_vcm_rm, {% if is_state('input_boolean.lobby_vacuum', 'off') %}🔴{% else %}🟢{% endif %} Убрать прихожую:/toggle_vcm_lb"
+ - "{% if is_state('input_boolean.hallway_vacuum', 'off') %}🔴{% else %}🟢{% endif %} Убрать коридор:/toggle_vcm_hl, {% if is_state('input_boolean.bathroom_vacuum', 'off') %}🔴{% else %}🟢{% endif %} Убрать ванную:/toggle_vcm_br"
+ - "{% if is_state('input_boolean.kitchen_vacuum', 'off') %}🔴{% else %}🟢{% endif %} Убрать кухню:/toggle_vcm_kc"
+ - '🏠 Вернуться на базу:/toggle_vcm_stop'
+ - '🌪️ Сила всасывания:/toggle_vcm_wnd, 🌊 Сила полива:/toggle_vcm_wtr'
+ - '🔙 Назад:/menu_back, 🔄 Обновить:/vcm_control'
+
+ # ==========================================
+ # --- ПОДМЕНЮ: СИЛА ВСАСЫВАНИЯ ---
+ # ==========================================
+ - conditions: "{{ trigger.event.data.command == '/toggle_vcm_wnd' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🌪️ Меню мощности всасывания..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: >-
+ 🌪️ Текущая сила всасывания: {{ state_attr('vacuum.dreame_mc1808_044c_robot_cleaner_2', 'fan_speed') | default('Нет данных') }}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - "1️⃣ Тихий:/toggle_vcm_wnd_sl, 2️⃣ Стандартный:/toggle_vcm_wnd_st"
+ - "3️⃣ Средний:/toggle_vcm_wnd_md, 4️⃣ Турбо:/toggle_vcm_wnd_tr"
+ - '🔙 Назад:/vcm_control, 🔄 Обновить:/toggle_vcm_wnd'
+
+ # Кнопки выбора силы всасывания
+ - conditions: >
+ {{ trigger.event.data.command in [
+ '/toggle_vcm_wnd_sl', '/toggle_vcm_wnd_st',
+ '/toggle_vcm_wnd_md', '/toggle_vcm_wnd_tr'
+ ] }}
+ sequence:
+ - service: xiaomi_miot.set_miot_property
+ data:
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ siid: 18
+ piid: 6
+ value: >-
+ {% if trigger.event.data.command == '/toggle_vcm_wnd_sl' %}0
+ {% elif trigger.event.data.command == '/toggle_vcm_wnd_st' %}1
+ {% elif trigger.event.data.command == '/toggle_vcm_wnd_md' %}2
+ {% else %}3{% endif %}
+ - delay:
+ milliseconds: 1000
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "✅ Мощность изменена"
+ # Обновляем подменю
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: >-
+ 🌪️ Текущая сила всасывания: {{ state_attr('vacuum.dreame_mc1808_044c_robot_cleaner_2', 'fan_speed') | default('Обновляется...') }}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - "1️⃣ Тихий:/toggle_vcm_wnd_sl, 2️⃣ Стандартный:/toggle_vcm_wnd_st"
+ - "3️⃣ Средний:/toggle_vcm_wnd_md, 4️⃣ Турбо:/toggle_vcm_wnd_tr"
+ - '🔙 Назад:/vcm_control, 🔄 Обновить:/toggle_vcm_wnd'
+
+ # ==========================================
+ # --- ПОДМЕНЮ: СИЛА ПОЛИВА ---
+ # ==========================================
+ - conditions: "{{ trigger.event.data.command == '/toggle_vcm_wtr' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🌊 Меню силы полива..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: >-
+ 🌊 Текущая сила полива: {% set water = state_attr('vacuum.stytj01zhm', 'water_level') %} {% if water == 'High' %}Полный {% elif water == 'Med' %}Средний {% elif water == 'Low' %}Низкий {% else %} Нет данных {% endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - "1️⃣ Низкий:/toggle_vcm_wtr_l"
+ - "2️⃣ Средний:/toggle_vcm_wtr_m"
+ - "3️⃣ Полный:/toggle_vcm_wtr_h"
+ - '🔙 Назад:/vcm_control, 🔄 Обновить:/toggle_vcm_wtr'
+
+ # Кнопки выбора силы полива
+ - conditions: >
+ {{ trigger.event.data.command in [
+ '/toggle_vcm_wtr_l', '/toggle_vcm_wtr_m', '/toggle_vcm_wtr_h'
+ ] }}
+ sequence:
+ - service: xiaomi_miot.set_miot_property
+ data:
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ siid: 18
+ piid: 20
+ value: >-
+ {% if trigger.event.data.command == '/toggle_vcm_wtr_l' %}1
+ {% elif trigger.event.data.command == '/toggle_vcm_wtr_m' %}2
+ {% else %}3{% endif %}
+ - delay:
+ milliseconds: 2000
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "✅ Режим полива изменен"
+ # Обновляем подменю
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: >-
+ 🌊 Текущая сила полива: {% set water = state_attr('vacuum.stytj01zhm', 'water_level') %} {% if water == 'High' %}Полный {% elif water == 'Med' %}Средний {% elif water == 'Low' %}Низкий {% else %} Обновляется... {% endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - "1️⃣ Низкий:/toggle_vcm_wtr_l"
+ - "2️⃣ Средний:/toggle_vcm_wtr_m"
+ - "3️⃣ Полный:/toggle_vcm_wtr_h"
+ - '🔙 Назад:/vcm_control, 🔄 Обновить:/toggle_vcm_wtr'
+
+ # ==========================================
+ # --- МЕНЮ: ПОСУДОМОЙКА (ГЛАВНОЕ) ---
+ # ==========================================
+ - conditions: "{{ trigger.event.data.command == '/dw_control' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🔄 Загружаю статус посудомойки..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ 🌊 Посудомойка:
+
+ 🔖 Состояние: {% set status = states('sensor.bosch_dishwasher_operation_state') %}{% if status == 'Ready' %}Ожидание{% elif status == 'Run' %}Мойка{% elif status == 'Aborting' %}Отмена программы{% elif status == 'DelayedStart' %}Отложенный запуск{% else %}Нет данных{% endif %}
+ 📋 Программа: {% set prog = states('select.bosch_dishwasher_selected_program') %}{% if prog in ['unavailable', 'unknown'] %}{% set prog = states('sensor.bosch_dishwasher_active_program') %}{% endif %}{% if prog == 'dishcare_dishwasher_program_auto2' %}Авто 45–65℃{% elif prog == 'dishcare_dishwasher_program_quick65' %}Экспресс 65℃{% elif prog == 'dishcare_dishwasher_program_eco50' %}Эко 50℃{% elif prog == 'dishcare_dishwasher_program_intensiv70' %}Интенсивная 70℃{% elif prog == 'dishcare_dishwasher_program_prerinse' %}Предв. ополаскивание{% elif prog == 'dishcare_dishwasher_program_nightwash' %}Ночная{% elif prog == 'dishcare_dishwasher_program_machinecare' %}Мойка машины{% else %}Нет данных{% endif %}
+ 🌡️ Доп.сушка: {% set s = states('switch.bosch_dishwasher_extra_dry') %}{% if s == 'on' %}Включена{% elif s == 'off' %}Выключена{% else %}Нет данных{% endif %}
+ 🧂 Соль: {% set salt = states('sensor.bosch_dishwasher_salt') %}{% if salt == 'nearly_empty' %}⚠️ Почти закончилась{% elif salt == 'full' %}✅ В порядке{% elif salt == 'empty' %}❌ Закончилась{% else %}❓ Неизвестно{% endif %}
+ 🚪 Дверца: {% set door = states('binary_sensor.bosch_dishwasher_door') %}{% if door == 'on' %}Открыта{% elif door == 'off' %}Закрыта{% else %}Нет данных{% endif %}
+
+ 🕒 Окончание: {% set input_dt = state_attr('input_datetime.dishwasher_startinrelative', 'timestamp') | int(0) %}{% set start_in = states('sensor.bosch_dishwasher_start_in') | float(0) %}{% set remaining = states('sensor.bosch_dishwasher_remaining_program_time') | float(0) %}{% set total_delay = input_dt + (start_in * 3600) + (remaining * 3600) %}{{ (now().timestamp() + total_delay) | timestamp_custom('%H:%M:%S') }}
+ {% set delay = states('input_datetime.dishwasher_startinrelative') %}{% set progress = states('sensor.bosch_dishwasher_program_progress') %}{% set start_in_raw = states('sensor.bosch_dishwasher_start_in') | float(0) %}{% set start_in_h = (start_in_raw // 1) | int %}{% set start_in_m = ((start_in_raw % 1) * 60) | round(0) %}{% if status == 'Ready' %}⏳ Отложенный запуск: {% if delay == '00:00:00' %}Не установлено{% else %}{{ delay }}{% endif %}{% elif status == 'DelayedStart' %}🚀 Запуск через: {{ start_in_h }} ч {{ start_in_m }} мин{% elif status == 'Run' %}✅ Прогресс: {{ progress }}%{% endif %}
+ {%- if states('switch.bosch_dishwasher_silence_on_demand') == 'on' %}
+ 🔇 Тихий режим: Включен{% endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - "▶️ Старт выбранной программы:/toggle_dw_start"
+ - "1️⃣ Экспресс 65:/toggle_dw_on_quick65, 2️⃣ Авто 45-65:/toggle_dw_on_auto4565"
+ - "3️⃣ Чистка посудомойки:/toggle_dw_on_care"
+ - "{% set quiet = states('switch.401090521617010964_dishcare_dishwasher_option_silenceondemand') %}{{ '🟢' if quiet == 'on' else '🔴' }} Тихий режим:/toggle_dw_on_silence"
+ - "⏳ Отлож.пуск:/dw_control_dl, ❌ Сброс отлож.пуска:/toggle_dw_delay_clear"
+ - "⏹️ Отменить мойку:/toggle_dw_stop"
+ - "🔙 Назад:/menu_back, 🔄 Обновить:/dw_control"
+
+ # --- КНОПКИ УПРАВЛЕНИЯ ПОСУДОМОЙКОЙ ---
+ - conditions: "{{ trigger.event.data.command == '/toggle_dw_start' }}"
+ sequence:
+ - service: script.dw_start_select_program
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "▶️ Запущена мойка"
+
+ - conditions: "{{ trigger.event.data.command == '/toggle_dw_on_off' }}"
+ sequence:
+ - service: switch.toggle
+ target: { entity_id: switch.401090521617010964_bsh_common_setting_powerstate }
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🔌 Питание переключено"
+
+ - conditions: "{{ trigger.event.data.command == '/toggle_dw_on_quick65' }}"
+ sequence:
+ - service: script.dw_install_quick_65_extradry_extrarinse
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "✅ Выбрана программа Экспресс 65"
+
+ - conditions: "{{ trigger.event.data.command == '/toggle_dw_on_auto4565' }}"
+ sequence:
+ - service: script.dw_install_auto_45_65_extradry_extrarinse
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "✅ Выбрана программа Авто 45-65"
+
+ - conditions: "{{ trigger.event.data.command == '/toggle_dw_on_care' }}"
+ sequence:
+ - service: script.dw_install_care
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "✅ Выбрана Чистка посудомойки"
+
+ - conditions: "{{ trigger.event.data.command == '/toggle_dw_on_silence' }}"
+ sequence:
+ - service: switch.toggle
+ target: { entity_id: switch.bosch_dishwasher_silence_on_demand }
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🤫 Тихий режим переключен"
+
+ - conditions: "{{ trigger.event.data.command == '/toggle_dw_stop' }}"
+ sequence:
+ - service: input_datetime.set_datetime
+ target: { entity_id: input_datetime.dishwasher_startinrelative }
+ data: { time: "00:00:00" }
+ - service: script.dw_stop_program
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "⏹️ Мойка отменена"
+
+ # ==========================================
+ # --- МЕНЮ: ОТЛОЖЕННЫЙ СТАРТ ---
+ # ==========================================
+ - conditions: "{{ trigger.event.data.command == '/dw_control_dl' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "⏳ Меню отложенного старта..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ 🌊 Настройки отложенного запуска:
+
+ {% set status = states('sensor.bosch_dishwasher_operation_state') %}{% set delay = states('input_datetime.dishwasher_startinrelative') %}{% set start_in_raw = states('sensor.bosch_dishwasher_start_in') | float(0) %}{% set start_in_h = (start_in_raw // 1) | int %}{% set start_in_m = ((start_in_raw % 1) * 60) | round(0) %}{% if status == 'Ready' %}Текущая задержка: {% if delay == '00:00:00' %}Не установлено{% else %}{{ delay }}{% endif %}{% elif status == 'DelayedStart' %}Машина уже ждет запуска. Старт через: {{ start_in_h }} ч {{ start_in_m }} мин{% else %}Машина сейчас в работе или недоступна.{% endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '🕐 1:00:/toggle_dw_delay_1, 🕑 2:00:/toggle_dw_delay_2'
+ - '🕒 3:00:/toggle_dw_delay_3, 🕓 4:00:/toggle_dw_delay_4'
+ - '🕔 5:00:/toggle_dw_delay_5, 🕕 6:00:/toggle_dw_delay_6'
+ - '🕖 7:00:/toggle_dw_delay_7, 🕗 8:00:/toggle_dw_delay_8'
+ - '🕘 9:00:/toggle_dw_delay_9, 🕙 10:00:/toggle_dw_delay_10'
+ - '❌ Сброс времени:/toggle_dw_delay_clear'
+ - '🔙 Назад:/dw_control, 🔄 Обновить:/dw_control_dl'
+
+ # --- КНОПКА: СБРОС ТАЙМЕРА ---
+ - conditions: "{{ trigger.event.data.command == '/toggle_dw_delay_clear' }}"
+ sequence:
+ - service: input_datetime.set_datetime
+ target: { entity_id: input_datetime.dishwasher_startinrelative }
+ data: { time: "00:00:00" }
+ - delay:
+ milliseconds: 500
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "❌ Время сброшено"
+ # Обновляем меню отложенного старта сразу после сброса
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ 🌊 Настройки отложенного запуска:
+
+ {% set status = states('sensor.bosch_dishwasher_operation_state') %}{% set delay = states('input_datetime.dishwasher_startinrelative') %}{% set start_in_raw = states('sensor.bosch_dishwasher_start_in') | float(0) %}{% set start_in_h = (start_in_raw // 1) | int %}{% set start_in_m = ((start_in_raw % 1) * 60) | round(0) %}{% if status == 'Ready' %}Текущая задержка: {% if delay == '00:00:00' %}Не установлено{% else %}{{ delay }}{% endif %}{% elif status == 'DelayedStart' %}Машина уже ждет запуска. Старт через: {{ start_in_h }} ч {{ start_in_m }} мин{% else %}Машина сейчас в работе или недоступна.{% endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '🕐 1:00:/toggle_dw_delay_1, 🕑 2:00:/toggle_dw_delay_2'
+ - '🕒 3:00:/toggle_dw_delay_3, 🕓 4:00:/toggle_dw_delay_4'
+ - '🕔 5:00:/toggle_dw_delay_5, 🕕 6:00:/toggle_dw_delay_6'
+ - '🕖 7:00:/toggle_dw_delay_7, 🕗 8:00:/toggle_dw_delay_8'
+ - '🕘 9:00:/toggle_dw_delay_9, 🕙 10:00:/toggle_dw_delay_10'
+ - '❌ Сброс времени:/toggle_dw_delay_clear'
+ - '🔙 Назад:/dw_control, 🔄 Обновить:/dw_control_dl'
+
+ # --- КНОПКИ: УСТАНОВКА ВРЕМЕНИ ---
+ - conditions: >
+ {{ trigger.event.data.command.startswith('/toggle_dw_delay_') and
+ trigger.event.data.command != '/toggle_dw_delay_clear' }}
+ sequence:
+ - service: input_datetime.set_datetime
+ target:
+ entity_id: input_datetime.dishwasher_startinrelative
+ data:
+ # Берем цифру из команды и превращаем в часы
+ time: "{{ '%02d:00:00' | format(trigger.event.data.command.split('_')[-1] | int) }}"
+ - delay:
+ milliseconds: 500
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "✅ Время установлено на {{ trigger.event.data.command.split('_')[-1] }}:00"
+ # Обновляем меню отложенного старта сразу после выбора времени
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ 🌊 Настройки отложенного запуска:
+
+ {% set status = states('sensor.bosch_dishwasher_operation_state') %}{% set delay = states('input_datetime.dishwasher_startinrelative') %}{% set start_in_raw = states('sensor.bosch_dishwasher_start_in') | float(0) %}{% set start_in_h = (start_in_raw // 1) | int %}{% set start_in_m = ((start_in_raw % 1) * 60) | round(0) %}{% if status == 'Ready' %}Текущая задержка: {% if delay == '00:00:00' %}Не установлено{% else %}{{ delay }}{% endif %}{% elif status == 'DelayedStart' %}Машина уже ждет запуска. Старт через: {{ start_in_h }} ч {{ start_in_m }} мин{% else %}Машина сейчас в работе или недоступна.{% endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '🕐 1:00:/toggle_dw_delay_1, 🕑 2:00:/toggle_dw_delay_2'
+ - '🕒 3:00:/toggle_dw_delay_3, 🕓 4:00:/toggle_dw_delay_4'
+ - '🕔 5:00:/toggle_dw_delay_5, 🕕 6:00:/toggle_dw_delay_6'
+ - '🕖 7:00:/toggle_dw_delay_7, 🕗 8:00:/toggle_dw_delay_8'
+ - '🕘 9:00:/toggle_dw_delay_9, 🕙 10:00:/toggle_dw_delay_10'
+ - '❌ Сброс времени:/toggle_dw_delay_clear'
+ - '🔙 Назад:/dw_control, 🔄 Обновить:/dw_control_dl'
+
+ # ==========================================
+ # --- МЕНЮ: КВАРТИРА ---
+ # ==========================================
+ - conditions: "{{ trigger.event.data.command == '/kv_control' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🔄 Загружаю меню квартиры..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ 🏢 Управление: Квартира
+
+ 🛋️ Комната
+ 🌡️ {{ states('sensor.a4c1387695b9_temperature') | replace('unavailable', '—') | replace('unknown', '—') }}°C • 💡 {% if is_state('binary_sensor.lighton_room', 'on') %}Вкл{% else %}Выкл{% endif %} • 🚶 {% if is_state('sensor.room_motion', 'True') %}Движение{% else %}Тихо{% endif %}
+
+ 🛁 Ванная
+ 🌡️ {{ states('sensor.0x00158d0007984db7_temperature') | replace('unavailable', '—') | replace('unknown', '—') }}°C • 💡 {% if is_state('binary_sensor.lighton_bathroom', 'on') or is_state('switch.0x00158d00054e8e41_l1', 'on') %}Вкл{% else %}Выкл{% endif %} • 🌊 {% if is_state('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi', 'on') %}{{ states('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_run_state') | capitalize }}{% else %}Выкл{% endif %}
+
+ 🍽️ Кухня
+ 🌡️ {{ states('sensor.a4c138eb5c2a_temperature') | replace('unavailable', '—') | replace('unknown', '—') }}°C • 💡 {% if is_state('binary_sensor.lighton_kitchen', 'on') %}Вкл{% else %}Выкл{% endif %} • 🍽️ {% if is_state('switch.posudomoechnaia_mashina_power', 'on') %}Вкл{% else %}Выкл{% endif %}
+
+ 🚪 Прихожая
+ 🚪 {% if is_state('binary_sensor.e4aaec3747b2_contact', 'off') %}Закрыта{% else %}Открыта{% endif %} • 💡 {% if is_state('switch.0x54ef4410003aa472_right', 'on') or is_state('switch.0x54ef4410003aa472_left', 'on') %}Вкл{% else %}Выкл{% endif %} • 🚶 {% if is_state('binary_sensor.0x00158d000707efdf_motion', 'on') %}Движение{% else %}Тихо{% endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '🏠 Комната:/rm_control, 🛁 Ванная:/bt_control'
+ - '🍽️ Кухня:/kn_control, 🚪 Прихожая:/lb_control'
+ - '🔙 Назад:/menu_back, 🔄 Обновить:/kv_control'
+
+ # ==========================================
+ # --- МЕНЮ: КОМНАТА ---
+ # ==========================================
+ - conditions: "{{ trigger.event.data.command == '/rm_control' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🔄 Загружаю меню комнаты..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ 🏠 Управление: Комната
+
+ 🌡️ Температура: {{ states('sensor.a4c1387695b9_temperature') }} °C | 💧 Влажность: {{ states('sensor.a4c1387695b9_humidity') }} %
+ 🚶 Присутствие: {% if is_state('sensor.room_motion', 'True') %}Движение{% else %}Нет движения{% endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '💡 Свет {% if is_state("binary_sensor.lighton_room", "off") %}🔴{% else %}🟢{% endif %}:/toggle_rm_ceiling_light'
+ - '☀️ Дневной свет:/toggle_rm_light_day, 🌙 Ночной свет:/toggle_rm_light_night'
+ - '📺 Свет для ТВ:/toggle_rm_light_tv, 💞 Романтика:/toggle_rm_light_lv'
+ - '🔌 Розетка тел. {% if is_state("switch.0xa4c138a1b1cd2be1", "off") %}🔴{% else %}🟢{% endif %}:/toggle_rm_tl'
+ - '🔙 Назад:/kv_control, 🔄 Обновить:/rm_control'
+
+ # --- КНОПКИ УПРАВЛЕНИЯ КОМНАТОЙ ---
+ - conditions: >
+ {{ trigger.event.data.command in [
+ '/toggle_rm_ceiling_light', '/toggle_rm_light_day',
+ '/toggle_rm_light_night', '/toggle_rm_light_tv',
+ '/toggle_rm_light_lv', '/toggle_rm_tl'
+ ] }}
+ sequence:
+ - choose:
+ - conditions: "{{ trigger.event.data.command == '/toggle_rm_ceiling_light' }}"
+ sequence:
+ - if:
+ - condition: state
+ entity_id: binary_sensor.lighton_room
+ state: "off"
+ then:
+ - service: scene.turn_on
+ target: { entity_id: scene.komnata_osveshchenie_standart }
+ else:
+ - service: scene.turn_on
+ target: { entity_id: scene.komnata_vykl_svet }
+ - conditions: "{{ trigger.event.data.command == '/toggle_rm_light_day' }}"
+ sequence:
+ - service: scene.turn_on
+ target: { entity_id: scene.komnata_osveshchenie_standart }
+ - conditions: "{{ trigger.event.data.command == '/toggle_rm_light_night' }}"
+ sequence:
+ - service: scene.turn_on
+ target: { entity_id: scene.lght_room_night_on }
+ - conditions: "{{ trigger.event.data.command == '/toggle_rm_light_tv' }}"
+ sequence:
+ - service: scene.turn_on
+ target: { entity_id: scene.komnata_ambilight_sinii }
+ - conditions: "{{ trigger.event.data.command == '/toggle_rm_light_lv' }}"
+ sequence:
+ - service: scene.turn_on
+ target: { entity_id: scene.novaia_stsena }
+ - conditions: "{{ trigger.event.data.command == '/toggle_rm_tl' }}"
+ sequence:
+ - service: switch.toggle
+ target: { entity_id: switch.0xa4c138a1b1cd2be1 }
+ - delay:
+ milliseconds: 500
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "✅ Команда выполнена"
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ 🏠 Управление: Комната
+
+ 🌡️ Температура: {{ states('sensor.a4c1387695b9_temperature') }} °C | 💧 Влажность: {{ states('sensor.a4c1387695b9_humidity') }} %
+ 🚶 Присутствие: {% if is_state('sensor.room_motion', 'True') %}Движение{% else %}Нет движения{% endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '💡 Свет {% if is_state("binary_sensor.lighton_room", "off") %}🔴{% else %}🟢{% endif %}:/toggle_rm_ceiling_light'
+ - '☀️ Дневной свет:/toggle_rm_light_day, 🌙 Ночной свет:/toggle_rm_light_night'
+ - '📺 Свет для ТВ:/toggle_rm_light_tv, 💞 Романтика:/toggle_rm_light_lv'
+ - '🔌 Розетка тел. {% if is_state("switch.0xa4c138a1b1cd2be1", "off") %}🔴{% else %}🟢{% endif %}:/toggle_rm_tl'
+ - '🔙 Назад:/kv_control, 🔄 Обновить:/rm_control'
+
+ # ==========================================
+ # --- МЕНЮ: ВАННАЯ ---
+ # ==========================================
+ - conditions: "{{ trigger.event.data.command == '/bt_control' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🔄 Загружаю меню ванной..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ 🛁 Управление: Ванная
+
+ 🌡️ Температура: {{ states('sensor.0x00158d0007984db7_temperature') }} °C | 💧 Влажность: {{ states('sensor.0x00158d0007984db7_humidity') }} %
+ 🚶 Присутствие: {% if is_state('binary_sensor.datchik_prisutstviia_vannaia_presence', 'on') %}Движение{% else %}Нет движения{% endif %}
+
+ 🌊 Стиральная машина:
+ {%- if is_state('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi', 'on') %}
+ ▶️ Статус: {{ states('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_run_state') }}
+ ⏳ Осталось: {{ state_attr('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi','remain_time') }}
+ {%- else %}
+ ⏹️ Выключена
+ {%- endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '💡 Свет {% if is_state("binary_sensor.lighton_bathroom", "off") %}🔴{% else %}🟢{% endif %}:/toggle_bt_ceiling_light, 🔲 Зеркало {% if is_state("switch.0x00158d00054e8e41_l1", "off") %}🔴{% else %}🟢{% endif %}:/toggle_bt_mirror'
+ - '☀️ Дневной свет:/toggle_bt_light_day, 🌙 Ночной свет:/toggle_bt_light_night'
+ - '🌊 Стиральная машина:/bt_wh_control'
+ - '🔙 Назад:/kv_control, 🔄 Обновить:/bt_control'
+
+ # --- КНОПКИ УПРАВЛЕНИЯ ВАННОЙ ---
+ - conditions: >
+ {{ trigger.event.data.command in [
+ '/toggle_bt_ceiling_light', '/toggle_bt_mirror',
+ '/toggle_bt_light_day', '/toggle_bt_light_night'
+ ] }}
+ sequence:
+ - choose:
+ - conditions: "{{ trigger.event.data.command == '/toggle_bt_ceiling_light' }}"
+ sequence:
+ - if:
+ - condition: state
+ entity_id: binary_sensor.lighton_bathroom
+ state: "off"
+ then:
+ - service: scene.turn_on
+ target: { entity_id: scene.vannaia_standartnyi_svet }
+ else:
+ - service: scene.turn_on
+ target: { entity_id: scene.vannaia_vykl_svet }
+ - conditions: "{{ trigger.event.data.command == '/toggle_bt_mirror' }}"
+ sequence:
+ - service: switch.toggle
+ target: { entity_id: switch.0x00158d00054e8e41_l1 }
+ - conditions: "{{ trigger.event.data.command == '/toggle_bt_light_day' }}"
+ sequence:
+ - service: scene.turn_on
+ target: { entity_id: scene.vannaia_standartnyi_svet }
+ - conditions: "{{ trigger.event.data.command == '/toggle_bt_light_night' }}"
+ sequence:
+ - service: scene.turn_on
+ target: { entity_id: scene.vannaia_nochnik_1 }
+ - delay:
+ milliseconds: 500
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "✅ Команда выполнена"
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ 🛁 Управление: Ванная
+
+ 🌡️ Температура: {{ states('sensor.0x00158d0007984db7_temperature') }} °C | 💧 Влажность: {{ states('sensor.0x00158d0007984db7_humidity') }} %
+ 🚶 Присутствие: {% if is_state('binary_sensor.datchik_prisutstviia_vannaia_presence', 'on') %}Движение{% else %}Нет движения{% endif %}
+
+ 🌊 Стиральная машина:
+ {%- if is_state('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi', 'on') %}
+ ▶️ Статус: {{ states('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_run_state') }}
+ ⏳ Осталось: {{ state_attr('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi','remain_time') }}
+ {%- else %}
+ ⏹️ Выключена
+ {%- endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '💡 Свет {% if is_state("binary_sensor.lighton_bathroom", "off") %}🔴{% else %}🟢{% endif %}:/toggle_bt_ceiling_light, 🔲 Зеркало {% if is_state("switch.0x00158d00054e8e41_l1", "off") %}🔴{% else %}🟢{% endif %}:/toggle_bt_mirror'
+ - '☀️ Дневной свет:/toggle_bt_light_day, 🌙 Ночной свет:/toggle_bt_light_night'
+ - '🌊 Стиральная машина:/bt_wh_control'
+ - '🔙 Назад:/kv_control, 🔄 Обновить:/bt_control'
+
+ # ==========================================
+ # --- ПОДМЕНЮ: СТИРАЛЬНАЯ МАШИНА ---
+ # ==========================================
+ - conditions: "{{ trigger.event.data.command == '/bt_wh_control' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🔄 Загружаю данные стиралки..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ 🌊 Стиральная машина:
+
+ {% if is_state('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi', 'on') %}
+ ▶️ Состояние: {{ states('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_run_state') }}
+ 📋 Программа: {{ states('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_current_course') }}
+ ♻️ Обороты: {{ states('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_spin_speed') }}
+ 🌡️ Температура: {{ states('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_water_temp') }}
+ 👕 Тип сушки: {{ states('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_dry_level') }}
+ 💧 Пред. стирка: {{ state_attr('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi', 'pre_wash') }}
+ 🌊 Доп. полоскание: {{ states('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_rinse_mode') }}
+ ⏳ Осталось времени: {{ state_attr('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi','remain_time') }}
+ ⏱️ Время окончания: {% if state_attr('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi','end_time') %}{{ as_timestamp(state_attr('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi','end_time')) | timestamp_custom('%H:%M:%S') }}{% else %}Нет данных{% endif %}
+ {% else %}
+ ⏹️ В данный момент стиральная машина выключена
+ {% endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '🔌 Питание {% if is_state("switch.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_power", "unavailable") %}🔴{% else %}🟢{% endif %}:/toggle_bt_washing'
+ - '🔙 Назад:/bt_control, 🔄 Обновить:/bt_wh_control'
+
+ # --- КНОПКА: ВКЛ/ВЫКЛ СТИРАЛКУ ---
+ - conditions: "{{ trigger.event.data.command == '/toggle_bt_washing' }}"
+ sequence:
+ - service: switch.toggle
+ target: { entity_id: switch.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_power }
+ - delay:
+ milliseconds: 500
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🔌 Питание переключено"
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ 🌊 Стиральная машина:
+
+ {% if is_state('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi', 'on') %}
+ ▶️ Состояние: {{ states('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_run_state') }}
+ 📋 Программа: {{ states('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_current_course') }}
+ ♻️ Обороты: {{ states('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_spin_speed') }}
+ 🌡️ Температура: {{ states('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_water_temp') }}
+ 👕 Тип сушки: {{ states('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_dry_level') }}
+ 💧 Пред. стирка: {{ state_attr('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi', 'pre_wash') }}
+ 🌊 Доп. полоскание: {{ states('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_rinse_mode') }}
+ ⏳ Осталось времени: {{ state_attr('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi','remain_time') }}
+ ⏱️ Время окончания: {% if state_attr('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi','end_time') %}{{ as_timestamp(state_attr('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi','end_time')) | timestamp_custom('%H:%M:%S') }}{% else %}Нет данных{% endif %}
+ {% else %}
+ ⏹️ В данный момент стиральная машина выключена
+ {% endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '🔌 Питание {% if is_state("switch.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_power", "unavailable") %}🔴{% else %}🟢{% endif %}:/toggle_bt_washing'
+ - '🔙 Назад:/bt_control, 🔄 Обновить:/bt_wh_control'
+
+ # ==========================================
+ # --- МЕНЮ: КУХНЯ ---
+ # ==========================================
+ - conditions: "{{ trigger.event.data.command == '/kn_control' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🔄 Загружаю меню кухни..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ 🍽️ Управление: Кухня
+
+ 🌡️ Температура: {{ states('sensor.a4c138eb5c2a_temperature') }} °C | 💧 Влажность: {{ states('sensor.a4c138eb5c2a_humidity') }} %
+ 🚶 Присутствие: {% if is_state('binary_sensor.datchik_prisutstviia_kukhnia_presence', 'on') %}Движение{% else %}Нет движения{% endif %}
+ {%- if is_state('switch.posudomoechnaia_mashina_power', 'on') %}
+ 🌊 Мойка посуды: {{ states('sensor.401090521617010964_bsh_common_option_programprogress') }}%
+ {%- endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '💡 Свет {% if is_state("binary_sensor.lighton_kitchen", "off") %}🔴{% else %}🟢{% endif %}:/toggle_kn_ceiling_light'
+ - '☀️ Дневной свет:/toggle_kn_light_day, 🌙 Ночной свет:/toggle_kn_light_night'
+ - '🌊 Посудомойка {% if is_state("switch.posudomoechnaia_mashina_power", "off") %}🔴{% else %}🟢{% endif %}:/dw_control'
+ - '🍵 Термопот {% if is_state("switch.0x54ef4410000783c6", "off") %}🔴{% else %}🟢{% endif %}:/toggle_kn_tp'
+ - '🔙 Назад:/kv_control, 🔄 Обновить:/kn_control'
+
+ # --- КНОПКИ УПРАВЛЕНИЯ КУХНЕЙ ---
+ - conditions: >
+ {{ trigger.event.data.command in [
+ '/toggle_kn_ceiling_light', '/toggle_kn_light_day',
+ '/toggle_kn_light_night', '/toggle_kn_tp'
+ ] }}
+ sequence:
+ - choose:
+ - conditions: "{{ trigger.event.data.command == '/toggle_kn_ceiling_light' }}"
+ sequence:
+ - service: light.toggle
+ target: { entity_id: light.yeelink_ceilc_ff3a_light }
+ - conditions: "{{ trigger.event.data.command == '/toggle_kn_light_day' }}"
+ sequence:
+ - service: scene.turn_on
+ target: { entity_id: scene.svet_v_kukhne_100 }
+ - conditions: "{{ trigger.event.data.command == '/toggle_kn_light_night' }}"
+ sequence:
+ - service: scene.turn_on
+ target: { entity_id: scene.kukhnia_noch }
+ - conditions: "{{ trigger.event.data.command == '/toggle_kn_tp' }}"
+ sequence:
+ - service: switch.toggle
+ target: { entity_id: switch.0x54ef4410000783c6 }
+ - delay:
+ milliseconds: 500
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "✅ Команда выполнена"
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ 🍽️ Управление: Кухня
+
+ 🌡️ Температура: {{ states('sensor.a4c138eb5c2a_temperature') }} °C | 💧 Влажность: {{ states('sensor.a4c138eb5c2a_humidity') }} %
+ 🚶 Присутствие: {% if is_state('binary_sensor.datchik_prisutstviia_kukhnia_presence', 'on') %}Движение{% else %}Нет движения{% endif %}
+ {%- if is_state('switch.posudomoechnaia_mashina_power', 'on') %}
+ 🌊 Мойка посуды: {{ states('sensor.401090521617010964_bsh_common_option_programprogress') }}%
+ {%- endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '💡 Свет {% if is_state("binary_sensor.lighton_kitchen", "off") %}🔴{% else %}🟢{% endif %}:/toggle_kn_ceiling_light'
+ - '☀️ Дневной свет:/toggle_kn_light_day, 🌙 Ночной свет:/toggle_kn_light_night'
+ - '🌊 Посудомойка {% if is_state("switch.posudomoechnaia_mashina_power", "off") %}🔴{% else %}🟢{% endif %}:/dw_control'
+ - '🍵 Термопот {% if is_state("switch.0x54ef4410000783c6", "off") %}🔴{% else %}🟢{% endif %}:/toggle_kn_tp'
+ - '🔙 Назад:/kv_control, 🔄 Обновить:/kn_control'
+
+ # ==========================================
+ # --- МЕНЮ: ПРИХОЖАЯ ---
+ # ==========================================
+ - conditions: "{{ trigger.event.data.command == '/lb_control' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🔄 Загружаю меню прихожей..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ 🚪 Управление: Прихожая
+
+ 🚪 Входная дверь: {% if is_state ('binary_sensor.e4aaec3747b2_contact', 'off') %}Закрыта{% else %}Открыта{% endif %}
+ 🚶 Присутствие: {% if is_state('binary_sensor.0x00158d000707efdf_motion', 'on') %}Движение{% else %}Нет движения{% endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '💡 Свет день {% if is_state("switch.0x54ef4410003aa472_right", "off") %}🔴{% else %}🟢{% endif %}:/toggle_lb_d_ceiling_light'
+ - '💡 Свет ночь {% if is_state("switch.0x54ef4410003aa472_left", "off") %}🔴{% else %}🟢{% endif %}:/toggle_lb_n_ceiling_light'
+ - '🔙 Назад:/kv_control, 🔄 Обновить:/lb_control'
+
+ # --- КНОПКИ УПРАВЛЕНИЯ ПРИХОЖЕЙ ---
+ - conditions: >
+ {{ trigger.event.data.command in [
+ '/toggle_lb_d_ceiling_light', '/toggle_lb_n_ceiling_light', '/toggle_lb_off_door'
+ ] }}
+ sequence:
+ - choose:
+ - conditions: "{{ trigger.event.data.command == '/toggle_lb_d_ceiling_light' }}"
+ sequence:
+ - service: switch.toggle
+ target: { entity_id: switch.0x54ef4410003aa472_right }
+ - conditions: "{{ trigger.event.data.command == '/toggle_lb_n_ceiling_light' }}"
+ sequence:
+ - service: switch.toggle
+ target: { entity_id: switch.0x54ef4410003aa472_left }
+ - conditions: "{{ trigger.event.data.command == '/toggle_lb_off_door' }}"
+ sequence:
+ - service: automation.turn_off
+ target: { entity_id: automation.ntf_door_open_5min }
+ data: { stop_actions: true }
+ - service: automation.turn_on
+ target: { entity_id: automation.ntf_door_open_5min }
+ - delay:
+ milliseconds: 500
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "✅ Команда выполнена"
+ - choose:
+ - conditions: "{{ trigger.event.data.command != '/toggle_lb_off_door' }}"
+ sequence:
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ 🚪 Управление: Прихожая
+
+ 🚪 Входная дверь: {% if is_state ('binary_sensor.e4aaec3747b2_contact', 'off') %}Закрыта{% else %}Открыта{% endif %}
+ 🚶 Присутствие: {% if is_state('binary_sensor.0x00158d000707efdf_motion', 'on') %}Движение{% else %}Нет движения{% endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '💡 Свет день {% if is_state("switch.0x54ef4410003aa472_right", "off") %}🔴{% else %}🟢{% endif %}:/toggle_lb_d_ceiling_light'
+ - '💡 Свет ночь {% if is_state("switch.0x54ef4410003aa472_left", "off") %}🔴{% else %}🟢{% endif %}:/toggle_lb_n_ceiling_light'
+ - '🔙 Назад:/kv_control, 🔄 Обновить:/lb_control'
+
+ # ==========================================
+ # --- МЕНЮ: GPS И ГЕОЛОКАЦИЯ (ГЛАВНОЕ) ---
+ # ==========================================
+ - conditions: "{{ trigger.event.data.command == '/gps_control' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🔄 Обновляю локации..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ {%- macro get_loc(entity) -%}
+ {%- set s = states(entity) -%}
+ {%- if s == 'home' %}Дома{% elif s == 'not_home' %}Не дома{% elif s == 'Родители Лены' %}Родители Лены{% elif s == 'Работа Денис' %}Работа Денис{% elif s in ['unknown', 'unavailable'] %}Нет данных{% else %}{{ s | capitalize }}{% endif -%}
+ {%- endmacro -%}
+
+ 🌐 Кто? Где?
+
+ 👩 Лена: {{ get_loc('device_tracker.google_maps_118311730364158481019') }}
+ 🔋 Телефон: {{ states('sensor.iphone_13_pro_max_battery') | default('—', true) }}% ({% set ch = state_attr('sensor.iphone_13_pro_max_battery', 'battery_status') %}{% if ch == 'NotCharging' %}не заряжается{% elif ch == 'Charging' %}идет заряд{% else %}нет данных{% endif %})
+ 📍 Адрес: {{ state_attr('device_tracker.google_maps_118311730364158481019', 'address') | default('Нет данных', true) }}
+
+ 👨 Денис: {{ get_loc('device_tracker.google_maps_108918666344169166438') }}
+ 🔋 Телефон: {{ state_attr('device_tracker.google_maps_108918666344169166438', 'battery_level') | default('—', true) }}%
+ 📍 Адрес: {{ state_attr('device_tracker.google_maps_108918666344169166438', 'address') | default('Нет данных', true) }}
+
+ 🛴 Самокат: {{ get_loc('device_tracker.samokat_dddennnisss') }}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '🗺️ Где Денис:/gps_send_loc_d, 🗺️ Где Лена:/gps_send_loc_e, 🗺️ Где Мама:/gps_send_loc_m'
+ - '🛴 Где самокат:/gps_send_loc_s'
+ - '✉️ Уведомления: Денис:/gps_control_d, ✉️ Уведомления: Лена:/gps_control_e'
+ - '🔙 Назад:/menu_back, 🔄 Обновить:/gps_control'
+
+ # ==========================================
+ # --- ОТПРАВКА ГЕОЛОКАЦИИ (ОДИН БЛОК ДЛЯ ВСЕХ) ---
+ # ==========================================
+ - conditions: >
+ {{ trigger.event.data.command in [
+ '/gps_send_loc_d', '/gps_send_loc_e', '/gps_send_loc_m', '/gps_send_loc_s'
+ ] }}
+ sequence:
+ # 1. Задаем словарь с нужными трекерами
+ - variables:
+ tracker: >
+ {% if trigger.event.data.command == '/gps_send_loc_d' %}device_tracker.google_maps_108918666344169166438
+ {% elif trigger.event.data.command == '/gps_send_loc_e' %}device_tracker.google_maps_118311730364158481019
+ {% elif trigger.event.data.command == '/gps_send_loc_m' %}device_tracker.google_maps_101930139594365808950
+ {% else %}device_tracker.samokat_dddennnisss{% endif %}
+ person_name: >
+ {% if trigger.event.data.command == '/gps_send_loc_d' %}Дениса
+ {% elif trigger.event.data.command == '/gps_send_loc_e' %}Лены
+ {% elif trigger.event.data.command == '/gps_send_loc_m' %}Мамы
+ {% else %}самоката{% endif %}
+
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "📍 Отправляю локацию {{ person_name }}..."
+
+ # 2. Проверяем, есть ли координаты
+ - choose:
+ - conditions: "{{ state_attr(tracker, 'latitude') is not none and state_attr(tracker, 'longitude') is not none }}"
+ sequence:
+ - service: telegram_bot.delete_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ # Отправляем карту
+ - service: telegram_bot.send_location
+ data:
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ latitude: "{{ state_attr(tracker, 'latitude') }}"
+ longitude: "{{ state_attr(tracker, 'longitude') }}"
+ # Прикрепляем меню
+ - service: telegram_bot.send_message
+ data:
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ 📍 Местоположение {{ person_name }}:
+ {% if trigger.event.data.command != '/gps_send_loc_s' %}{{ state_attr(tracker, 'address') | default('Адрес не определен') }}{% endif %}
+ inline_keyboard:
+ - '🗺️ Где Денис:/gps_send_loc_d, 🗺️ Где Лена:/gps_send_loc_e, 🗺️ Где Мама:/gps_send_loc_m'
+ - '🛴 Где самокат:/gps_send_loc_s'
+ - '✉️ Уведомления: Денис:/gps_control_d, ✉️ Уведомления: Лена:/gps_control_e'
+ - '🔙 Назад:/menu_back, 🔄 Обновить:/gps_control'
+ default:
+ # Координат нет
+ - service: telegram_bot.send_message
+ data:
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: "⚠️ Не удалось получить координаты {{ person_name }}. Устройство не в сети."
+
+ # ==========================================
+ # --- МЕНЮ: УВЕДОМЛЕНИЯ ДЕНИС ---
+ # ==========================================
+ - conditions: "{{ trigger.event.data.command == '/gps_control_d' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🔄 Загружаю меню уведомлений..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ ✉️ Настройка уведомлений: Денис
+ Выберите, о каких перемещениях получать сообщения:
+ inline_keyboard:
+ - "{% if is_state('automation.gps_denis_on_home', 'off')%}🔴{% else %}🟢{% endif %} Дома:/toggle_gps_d_hm_on, {% if is_state('automation.gps_denis_off_home', 'off')%}🔴{% else %}🟢{% endif %} Не дома:/toggle_gps_d_hm_off"
+ - "{% if is_state('automation.gps_denis_on_mama', 'off')%}🔴{% else %}🟢{% endif %} У мамы:/toggle_gps_d_mm_on, {% if is_state('automation.gps_denis_off_mama', 'off')%}🔴{% else %}🟢{% endif %} Не у мамы:/toggle_gps_d_mm_off"
+ - "{% if is_state('automation.gps_denis_on_raduga', 'off')%}🔴{% else %}🟢{% endif %} На радуге:/toggle_gps_d_rd_on, {% if is_state('automation.gps_denis_off_raduga', 'off')%}🔴{% else %}🟢{% endif %} Не на радуге:/toggle_gps_d_rd_off"
+ - "{% if is_state('automation.gps_denis_on_job', 'off')%}🔴{% else %}🟢{% endif %} На работе:/toggle_gps_d_jb_on, {% if is_state('automation.gps_denis_off_job', 'off')%}🔴{% else %}🟢{% endif %} Не на работе:/toggle_gps_d_jb_off"
+ - "{% if is_state('automation.gps_denis_on_ya', 'off')%}🔴{% else %}🟢{% endif %} У яшки:/toggle_gps_d_ya_on"
+ - "{% if is_state('automation.gps_denis_on_center', 'off')%}🔴{% else %}🟢{% endif %} В центре:/toggle_gps_d_c_on, {% if is_state('automation.gps_denis_off_center', 'off')%}🔴{% else %}🟢{% endif %} Не в центре:/toggle_gps_d_c_off"
+ - "{% if is_state('automation.gps_denis_on_len', 'off')%}🔴{% else %}🟢{% endif %} В Ленинском:/toggle_gps_d_len_on, {% if is_state('automation.gps_denis_off_len', 'off')%}🔴{% else %}🟢{% endif %} Не в ленинском:/toggle_gps_d_len_off"
+ - "{% if is_state('automation.gps_denis_on_kem', 'off')%}🔴{% else %}🟢{% endif %} В Кемерово:/toggle_gps_d_kem_on, {% if is_state('automation.gps_denis_off_kem', 'off')%}🔴{% else %}🟢{% endif %} Не в Кемерово:/toggle_gps_d_kem_off"
+ - "🔙 Назад:/gps_control, 🔄 Обновить:/gps_control_d"
+
+ # ==========================================
+ # --- МЕНЮ: УВЕДОМЛЕНИЯ ЛЕНА ---
+ # ==========================================
+ - conditions: "{{ trigger.event.data.command == '/gps_control_e' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🔄 Загружаю меню уведомлений..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ ✉️ Настройка уведомлений: Лена
+ Выберите, о каких перемещениях получать сообщения:
+ inline_keyboard:
+ - "{% if is_state('automation.gps_lena_on_home', 'off')%}🔴{% else %}🟢{% endif %} Дома:/toggle_gps_e_hm_on, {% if is_state('automation.gps_lena_off_home', 'off')%}🔴{% else %}🟢{% endif %} Не дома:/toggle_gps_e_hm_off"
+ - "{% if is_state('automation.gps_lena_on_mama', 'off')%}🔴{% else %}🟢{% endif %} У мамы:/toggle_gps_e_mm_on, {% if is_state('automation.gps_lena_off_mama', 'off')%}🔴{% else %}🟢{% endif %} Не у мамы:/toggle_gps_e_mm_off"
+ - "{% if is_state('automation.gps_lena_on_raduga', 'off')%}🔴{% else %}🟢{% endif %} На радуге:/toggle_gps_e_rd_on, {% if is_state('automation.gps_lena_off_raduga', 'off')%}🔴{% else %}🟢{% endif %} Не на радуге:/toggle_gps_e_rd_off"
+ - "{% if is_state('automation.gps_lena_on_job', 'off')%}🔴{% else %}🟢{% endif %} На работе:/toggle_gps_e_jb_on, {% if is_state('automation.gps_lena_off_job', 'off')%}🔴{% else %}🟢{% endif %} Не на работе:/toggle_gps_e_jb_off"
+ - "{% if is_state('automation.gps_lena_on_ya', 'off')%}🔴{% else %}🟢{% endif %} У яшки:/toggle_gps_e_ya_on"
+ - "{% if is_state('automation.gps_lena_on_familyr', 'off')%}🔴{% else %}🟢{% endif %} У родителей:/toggle_gps_e_fm_on, {% if is_state('automation.gps_lena_off_familyr', 'off')%}🔴{% else %}🟢{% endif %} Не у родителей:/toggle_gps_e_fm_off"
+ - "{% if is_state('automation.gps_lena_on_center', 'off')%}🔴{% else %}🟢{% endif %} В центре:/toggle_gps_e_c_on, {% if is_state('automation.gps_lena_off_center', 'off')%}🔴{% else %}🟢{% endif %} Не в центре:/toggle_gps_e_c_off"
+ - "{% if is_state('automation.gps_elena_on_len', 'off')%}🔴{% else %}🟢{% endif %} В Ленинском:/toggle_gps_e_len_on, {% if is_state('automation.gps_elena_off_len', 'off')%}🔴{% else %}🟢{% endif %} Не в ленинском:/toggle_gps_e_len_off"
+ - "{% if is_state('automation.gps_elena_on_kem', 'off')%}🔴{% else %}🟢{% endif %} В Кемерово:/toggle_gps_e_kem_on, {% if is_state('automation.gps_elena_off_kem', 'off')%}🔴{% else %}🟢{% endif %} Не в Кемерово:/toggle_gps_e_kem_off"
+ - "🔙 Назад:/gps_control, 🔄 Обновить:/gps_control_e"
+
+# ==========================================
+ # --- УМНЫЙ БЛОК ПЕРЕКЛЮЧЕНИЯ ВСЕХ УВЕДОМЛЕНИЙ ---
+ # ==========================================
+ - conditions: "{{ trigger.event.data.command.startswith('/toggle_gps_') }}"
+ sequence:
+ - variables:
+ # Словарь-маппинг: Команда -> Название автоматизации
+ auto_map:
+ '/toggle_gps_d_hm_on': 'automation.gps_denis_on_home'
+ '/toggle_gps_d_hm_off': 'automation.gps_denis_off_home'
+ '/toggle_gps_d_mm_on': 'automation.gps_denis_on_mama'
+ '/toggle_gps_d_mm_off': 'automation.gps_denis_off_mama'
+ '/toggle_gps_d_rd_on': 'automation.gps_denis_on_raduga'
+ '/toggle_gps_d_rd_off': 'automation.gps_denis_off_raduga'
+ '/toggle_gps_d_jb_on': 'automation.gps_denis_on_job'
+ '/toggle_gps_d_jb_off': 'automation.gps_denis_off_job'
+ '/toggle_gps_d_ya_on': 'automation.gps_denis_on_ya'
+ '/toggle_gps_d_c_on': 'automation.gps_denis_on_center'
+ '/toggle_gps_d_c_off': 'automation.gps_denis_off_center'
+ '/toggle_gps_d_len_on': 'automation.gps_denis_on_len'
+ '/toggle_gps_d_len_off': 'automation.gps_denis_off_len'
+ '/toggle_gps_d_kem_on': 'automation.gps_denis_on_kem'
+ '/toggle_gps_d_kem_off': 'automation.gps_denis_off_kem'
+ '/toggle_gps_e_hm_on': 'automation.gps_lena_on_home'
+ '/toggle_gps_e_hm_off': 'automation.gps_lena_off_home'
+ '/toggle_gps_e_mm_on': 'automation.gps_lena_on_mama'
+ '/toggle_gps_e_mm_off': 'automation.gps_lena_off_mama'
+ '/toggle_gps_e_rd_on': 'automation.gps_lena_on_raduga'
+ '/toggle_gps_e_rd_off': 'automation.gps_lena_off_raduga'
+ '/toggle_gps_e_jb_on': 'automation.gps_lena_on_job'
+ '/toggle_gps_e_jb_off': 'automation.gps_lena_off_job'
+ '/toggle_gps_e_ya_on': 'automation.gps_lena_on_ya'
+ '/toggle_gps_e_fm_on': 'automation.gps_lena_on_familyr'
+ '/toggle_gps_e_fm_off': 'automation.gps_lena_off_familyr'
+ '/toggle_gps_e_c_on': 'automation.gps_lena_on_center'
+ '/toggle_gps_e_c_off': 'automation.gps_lena_off_center'
+ '/toggle_gps_e_len_on': 'automation.gps_elena_on_len'
+ '/toggle_gps_e_len_off': 'automation.gps_elena_off_len'
+ '/toggle_gps_e_kem_on': 'automation.gps_elena_on_kem'
+ '/toggle_gps_e_kem_off': 'automation.gps_elena_off_kem'
+ target_auto: "{{ auto_map.get(trigger.event.data.command) }}"
+
+ # Дергаем нужную автоматизацию
+ - service: automation.toggle
+ target:
+ entity_id: "{{ target_auto }}"
+ - delay:
+ milliseconds: 300
+
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "✅ Настройка изменена"
+
+ # Обновляем менюшку в зависимости от того, чьи настройки меняли
+ - choose:
+ # Ветка Дениса
+ - conditions: "{{ '_d_' in trigger.event.data.command }}"
+ sequence:
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ ✉️ Настройка уведомлений: Денис
+ Выберите, о каких перемещениях получать сообщения:
+ inline_keyboard:
+ - "{% if is_state('automation.gps_denis_on_home', 'off')%}🔴{% else %}🟢{% endif %} Дома:/toggle_gps_d_hm_on, {% if is_state('automation.gps_denis_off_home', 'off')%}🔴{% else %}🟢{% endif %} Не дома:/toggle_gps_d_hm_off"
+ - "{% if is_state('automation.gps_denis_on_mama', 'off')%}🔴{% else %}🟢{% endif %} У мамы:/toggle_gps_d_mm_on, {% if is_state('automation.gps_denis_off_mama', 'off')%}🔴{% else %}🟢{% endif %} Не у мамы:/toggle_gps_d_mm_off"
+ - "{% if is_state('automation.gps_denis_on_raduga', 'off')%}🔴{% else %}🟢{% endif %} На радуге:/toggle_gps_d_rd_on, {% if is_state('automation.gps_denis_off_raduga', 'off')%}🔴{% else %}🟢{% endif %} Не на радуге:/toggle_gps_d_rd_off"
+ - "{% if is_state('automation.gps_denis_on_job', 'off')%}🔴{% else %}🟢{% endif %} На работе:/toggle_gps_d_jb_on, {% if is_state('automation.gps_denis_off_job', 'off')%}🔴{% else %}🟢{% endif %} Не на работе:/toggle_gps_d_jb_off"
+ - "{% if is_state('automation.gps_denis_on_ya', 'off')%}🔴{% else %}🟢{% endif %} У яшки:/toggle_gps_d_ya_on"
+ - "{% if is_state('automation.gps_denis_on_center', 'off')%}🔴{% else %}🟢{% endif %} В центре:/toggle_gps_d_c_on, {% if is_state('automation.gps_denis_off_center', 'off')%}🔴{% else %}🟢{% endif %} Не в центре:/toggle_gps_d_c_off"
+ - "{% if is_state('automation.gps_denis_on_len', 'off')%}🔴{% else %}🟢{% endif %} В Ленинском:/toggle_gps_d_len_on, {% if is_state('automation.gps_denis_off_len', 'off')%}🔴{% else %}🟢{% endif %} Не в ленинском:/toggle_gps_d_len_off"
+ - "{% if is_state('automation.gps_denis_on_kem', 'off')%}🔴{% else %}🟢{% endif %} В Кемерово:/toggle_gps_d_kem_on, {% if is_state('automation.gps_denis_off_kem', 'off')%}🔴{% else %}🟢{% endif %} Не в Кемерово:/toggle_gps_d_kem_off"
+ - "🔙 Назад:/gps_control, 🔄 Обновить:/gps_control_d"
+
+ # Ветка Лены
+ - conditions: "{{ '_e_' in trigger.event.data.command }}"
+ sequence:
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ message: |
+ ✉️ Настройка уведомлений: Лена
+ Выберите, о каких перемещениях получать сообщения:
+ inline_keyboard:
+ - "{% if is_state('automation.gps_lena_on_home', 'off')%}🔴{% else %}🟢{% endif %} Дома:/toggle_gps_e_hm_on, {% if is_state('automation.gps_lena_off_home', 'off')%}🔴{% else %}🟢{% endif %} Не дома:/toggle_gps_e_hm_off"
+ - "{% if is_state('automation.gps_lena_on_mama', 'off')%}🔴{% else %}🟢{% endif %} У мамы:/toggle_gps_e_mm_on, {% if is_state('automation.gps_lena_off_mama', 'off')%}🔴{% else %}🟢{% endif %} Не у мамы:/toggle_gps_e_mm_off"
+ - "{% if is_state('automation.gps_lena_on_raduga', 'off')%}🔴{% else %}🟢{% endif %} На радуге:/toggle_gps_e_rd_on, {% if is_state('automation.gps_lena_off_raduga', 'off')%}🔴{% else %}🟢{% endif %} Не на радуге:/toggle_gps_e_rd_off"
+ - "{% if is_state('automation.gps_lena_on_job', 'off')%}🔴{% else %}🟢{% endif %} На работе:/toggle_gps_e_jb_on, {% if is_state('automation.gps_lena_off_job', 'off')%}🔴{% else %}🟢{% endif %} Не на работе:/toggle_gps_e_jb_off"
+ - "{% if is_state('automation.gps_lena_on_ya', 'off')%}🔴{% else %}🟢{% endif %} У яшки:/toggle_gps_e_ya_on"
+ - "{% if is_state('automation.gps_lena_on_familyr', 'off')%}🔴{% else %}🟢{% endif %} У родителей:/toggle_gps_e_fm_on, {% if is_state('automation.gps_lena_off_familyr', 'off')%}🔴{% else %}🟢{% endif %} Не у родителей:/toggle_gps_e_fm_off"
+ - "{% if is_state('automation.gps_lena_on_center', 'off')%}🔴{% else %}🟢{% endif %} В центре:/toggle_gps_e_c_on, {% if is_state('automation.gps_lena_off_center', 'off')%}🔴{% else %}🟢{% endif %} Не в центре:/toggle_gps_e_c_off"
+ - "{% if is_state('automation.gps_elena_on_len', 'off')%}🔴{% else %}🟢{% endif %} В Ленинском:/toggle_gps_e_len_on, {% if is_state('automation.gps_elena_off_len', 'off')%}🔴{% else %}🟢{% endif %} Не в ленинском:/toggle_gps_e_len_off"
+ - "{% if is_state('automation.gps_elena_on_kem', 'off')%}🔴{% else %}🟢{% endif %} В Кемерово:/toggle_gps_e_kem_on, {% if is_state('automation.gps_elena_off_kem', 'off')%}🔴{% else %}🟢{% endif %} Не в Кемерово:/toggle_gps_e_kem_off"
+ - "🔙 Назад:/gps_control, 🔄 Обновить:/gps_control_e"
+
+ # ==========================================
+ # --- МЕНЮ: ТОРРЕНТЫ ---
+ # ==========================================
+ - conditions: "{{ trigger.event.data.command == '/tr_control' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🔄 Обновляю список торрентов..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ parse_mode: html
+ message: |
+ 📝 Управление: Торренты
+
+ {% set payload = state_attr('sensor.transmission_total_torrents_2', 'torrent_info') %}
+ {%- if payload -%}
+ {%- set status_icons = {
+ 'downloading': '⬇️',
+ 'seeding': '🚀',
+ 'paused': '⏸',
+ 'stopped': '⏹',
+ 'checking': '🔍',
+ 'error': '⚠️',
+ 'waiting': '⏳',
+ 'queued': '🕓'
+ } -%}
+ {%- for name, data in payload.items() %}
+ {{ status_icons.get(data.status, '❓') }} {{ name | truncate(35, true, '...') }}
+ └ 📈 {{ data.percent_done }}% | ℹ️ {{ data.status }}
+ {% endfor -%}
+ {%- else %}
+ ⚠️ Нет активных загрузок или нет данных от Transmission.
+ {%- endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - '🔙 Назад:/menu_back, 🔄 Обновить:/tr_control'
+
+ # ==========================================
+ # --- МЕНЮ: УПРАВЛЕНИЕ АВТОМАТИЗАЦИЕЙ ---
+ # ==========================================
+ - conditions: "{{ trigger.event.data.command == '/au_control' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🔄 Загружаю меню автоматизаций..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ parse_mode: html
+ message: |
+ ⚙️ Управление автоматизацией:
+ inline_keyboard:
+ - '🔦 Автоматизация света:/au_l_control'
+ - '🔙 Назад:/menu_back, 🔄 Обновить:/au_control'
+
+ # ==========================================
+ # --- ПОДМЕНЮ: АВТОМАТИЗАЦИЯ СВЕТА ---
+ # ==========================================
+ - conditions: "{{ trigger.event.data.command == '/au_l_control' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🔄 Загружаю автоматизации света..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ parse_mode: html
+ message: |
+ 🔦 Управление автоматизацией света:
+ inline_keyboard:
+ - '💡 Свет кухня {% if is_state("automation.lght_kitchen_on_lght_50", "off") %}🔴{% else %}🟢{% endif %}:/toggle_au_light_kn'
+ - '💡 Свет ванная {% if is_state("automation.lght_bathroom_on_standart_light", "off") %}🔴{% else %}🟢{% endif %}:/toggle_au_light_bt'
+ - '💡 Свет прихожая {% if is_state("automation.lght_lobby_light_on_day_motion", "off") %}🔴{% else %}🟢{% endif %}:/toggle_au_light_lb'
+ - '🔙 Назад:/au_control, 🔄 Обновить:/au_l_control'
+
+ # ==========================================
+ # --- КНОПКИ: ПЕРЕКЛЮЧЕНИЕ СВЕТА ---
+ # ==========================================
+ - conditions: >
+ {{ trigger.event.data.command in [
+ '/toggle_au_light_kn', '/toggle_au_light_bt', '/toggle_au_light_lb'
+ ] }}
+ sequence:
+ - choose:
+ - conditions: "{{ trigger.event.data.command == '/toggle_au_light_kn' }}"
+ sequence:
+ - service: automation.toggle
+ target:
+ entity_id: automation.lght_kitchen_on_lght_50
+ - conditions: "{{ trigger.event.data.command == '/toggle_au_light_bt' }}"
+ sequence:
+ - service: automation.toggle
+ target:
+ entity_id:
+ - automation.lght_bathroom_on_standart_light
+ - automation.lght_bathroom_on_night_light
+ - conditions: "{{ trigger.event.data.command == '/toggle_au_light_lb' }}"
+ sequence:
+ - service: automation.toggle
+ target:
+ entity_id:
+ - automation.lght_lobby_light_on_day_motion
+ - automation.lght_lobby_light_on_night_motion
+
+ - delay:
+ milliseconds: 500
+
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "✅ Статус автоматизации изменён"
+
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ parse_mode: html
+ message: |
+ 🔦 Управление автоматизацией света:
+ inline_keyboard:
+ - '💡 Свет кухня {% if is_state("automation.lght_kitchen_on_lght_50", "off") %}🔴{% else %}🟢{% endif %}:/toggle_au_light_kn'
+ - '💡 Свет ванная {% if is_state("automation.lght_bathroom_on_standart_light", "off") %}🔴{% else %}🟢{% endif %}:/toggle_au_light_bt'
+ - '💡 Свет прихожая {% if is_state("automation.lght_lobby_light_on_day_motion", "off") %}🔴{% else %}🟢{% endif %}:/toggle_au_light_lb'
+ - '🔙 Назад:/au_control, 🔄 Обновить:/au_l_control'
+
+ # ==========================================
+ # --- МЕНЮ: УПРАВЛЕНИЕ САМОКАТОМ ---
+ # ==========================================
+ - conditions: "{{ trigger.event.data.command == '/sc_control' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🔄 Обновляю данные самоката..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ parse_mode: html
+ message: |
+ 🛴 Управление самокатом:
+
+ 📈 Скорость: {{ states('sensor.samokat_dddennnisss_speed') }} км/ч
+ 🏃♂️ Движение: {% if is_state('binary_sensor.samokat_dddennnisss_motion', 'on') %}Да{% else %}Нет{% endif %}
+ {% if is_state('input_boolean.scooter_protection_active', 'on') %}🔐 Защита включена{% else %}🔓 Защита отключена{% endif %}
+
+ 🛰️ GPS свежий: {% if is_state('binary_sensor.scooter_gps_data_fresh', 'on') %}Да ✅{% else %}Нет ❌{% endif %}
+ ⏳ Возраст (самокат): {{ (state_attr('binary_sensor.scooter_gps_data_fresh', 'scooter_age_seconds') or 0) | int }} сек
+ ⏳ Возраст (Денис): {{ (state_attr('binary_sensor.scooter_gps_data_fresh', 'dddennnisss_age_seconds') or 0) | int }} сек
+ 📍 Расстояние: {{ distance(
+ state_attr('device_tracker.google_maps_108918666344169166438', 'latitude'),
+ state_attr('device_tracker.google_maps_108918666344169166438', 'longitude'),
+ state_attr('device_tracker.samokat_dddennnisss', 'latitude'),
+ state_attr('device_tracker.samokat_dddennnisss', 'longitude')
+ ) | round(2) }} км
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - "{% if is_state('input_boolean.scooter_protection_active', 'on') %}🔓 Снять защиту:/sc_r_unlocked{% else %}🔐 Включить защиту:/sc_r_locked{% endif %}"
+ - '🗺️ Где самокат:/gps_send_loc_s'
+ - '🔙 Назад:/menu_back, 🔄 Обновить:/sc_control'
+
+ # ==========================================
+ # --- КНОПКИ: БЛОКИРОВКА САМОКАТА ---
+ # ==========================================
+ - conditions: "{{ trigger.event.data.command in ['/sc_r_locked', '/sc_r_unlocked'] }}"
+ sequence:
+ - service: >-
+ {% if trigger.event.data.command == '/sc_r_locked' %}input_boolean.turn_on{% else %}input_boolean.turn_off{% endif %}
+ target:
+ entity_id: input_boolean.scooter_protection_active
+
+ - delay:
+ milliseconds: 500
+
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "✅ Статус защиты изменён"
+
+ # Возвращаемся в меню самоката для обновления статуса
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ parse_mode: html
+ message: |
+ 🛴 Управление самокатом:
+
+ 📈 Скорость: {{ states('sensor.samokat_dddennnisss_speed') }} км/ч
+ 🏃♂️ Движение: {% if is_state('binary_sensor.samokat_dddennnisss_motion', 'on') %}Да{% else %}Нет{% endif %}
+ {% if is_state('input_boolean.scooter_protection_active', 'on') %}🔐 Защита включена{% else %}🔓 Защита отключена{% endif %}
+
+ 🛰️ GPS свежий: {% if is_state('binary_sensor.scooter_gps_data_fresh', 'on') %}Да ✅{% else %}Нет ❌{% endif %}
+ ⏳ Возраст (самокат): {{ (state_attr('binary_sensor.scooter_gps_data_fresh', 'scooter_age_seconds') or 0) | int }} сек
+ ⏳ Возраст (Денис): {{ (state_attr('binary_sensor.scooter_gps_data_fresh', 'dddennnisss_age_seconds') or 0) | int }} сек
+ 📍 Расстояние: {{ distance(
+ state_attr('device_tracker.google_maps_108918666344169166438', 'latitude'),
+ state_attr('device_tracker.google_maps_108918666344169166438', 'longitude'),
+ state_attr('device_tracker.samokat_dddennnisss', 'latitude'),
+ state_attr('device_tracker.samokat_dddennnisss', 'longitude')
+ ) | round(2) }} км
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - "{% if is_state('input_boolean.scooter_protection_active', 'on') %}🔓 Снять защиту:/sc_r_unlocked{% else %}🔐 Включить защиту:/sc_r_locked{% endif %}"
+ - '🗺️ Где самокат:/gps_send_loc_s'
+ - '🔙 Назад:/menu_back, 🔄 Обновить:/sc_control'
+
+ # ==========================================
+ # --- МЕНЮ: УПРАВЛЕНИЕ STEAM DECK ---
+ # ==========================================
+ - conditions: "{{ trigger.event.data.command == '/sd_control' }}"
+ sequence:
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "🔄 Подключаюсь к Steam Deck..."
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ parse_mode: html
+ message: |
+ 🎮 Управление: Steam Deck
+
+ {% if is_state('binary_sensor.steamdeck', 'on') %}
+ 🟢 Статус: В сети
+
+ 🧠 CPU: {{ states('sensor.steamdeck_cpu_usage') }}%
+ 💾 RAM: {{ states('sensor.steamdeck_ram_used') }} ГБ из {{ states('sensor.steamdeck_ram_total') }} ГБ ({{ states('sensor.steamdeck_ram_usage') }}%)
+
+ 📁 Диск:
+ 📦 Внутр.: {{ states('sensor.steamdeck_disk_internal_free') }} своб. ({{ states('sensor.steamdeck_disk_internal_usage') }}%)
+ 💽 SD-карта: {{ states('sensor.steamdeck_disk_sd_free') }} своб. ({{ states('sensor.steamdeck_disk_sd_usage') }}%)
+
+ 🌡 Температура:
+ 🔋 Батарея: {{ states('sensor.steamdeck_temp_battery') }} °C
+ 🧩 Composite: {{ states('sensor.steamdeck_temp_composite') }} °C
+ ♨️ Edge: {{ states('sensor.steamdeck_temp_edge') }} °C
+
+ ⏱ Аптайм: {{ states('sensor.steamdeck_uptime_human') }}
+ {% else %}
+ 🔴 Статус: Недоступен (Выключен или спит)
+ {% endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - "{% if is_state('binary_sensor.steamdeck', 'off') %}💡 Включить:/toggle_sd_wol{% else %}💤 Спящий режим:/toggle_sd_sleep{% endif %}"
+ - "🔄 Перезагрузить:/toggle_sd_reboot"
+ - "🎮 Gamemode:/toggle_sd_gamemode, 💻 Desktop:/toggle_sd_desktop"
+ - "🔙 Назад:/menu_back, 🔄 Обновить:/sd_control"
+
+ # ==========================================
+ # --- КНОПКИ: КОМАНДЫ STEAM DECK ---
+ # ==========================================
+ - conditions: >
+ {{ trigger.event.data.command in [
+ '/toggle_sd_wol', '/toggle_sd_reboot', '/toggle_sd_gamemode',
+ '/toggle_sd_desktop', '/toggle_sd_sleep'
+ ] }}
+ sequence:
+ # 1. Выбираем, какое всплывающее уведомление показать
+ - variables:
+ action_msg: >
+ {% if trigger.event.data.command == '/toggle_sd_wol' %}📡 Steam Deck разбужен!
+ {% elif trigger.event.data.command == '/toggle_sd_reboot' %}🔄 Перезагружается...
+ {% elif trigger.event.data.command == '/toggle_sd_gamemode' %}🎮 Gamemode запущен!
+ {% elif trigger.event.data.command == '/toggle_sd_desktop' %}🔌 Desktop запущен!
+ {% elif trigger.event.data.command == '/toggle_sd_sleep' %}💤 Включен спящий режим
+ {% endif %}
+
+ # 2. Выполняем нужную shell-команду
+ - choose:
+ - conditions: "{{ trigger.event.data.command == '/toggle_sd_wol' }}"
+ sequence:
+ - service: shell_command.wrt_wol_sd
+ - conditions: "{{ trigger.event.data.command == '/toggle_sd_reboot' }}"
+ sequence:
+ - service: shell_command.steamdeck_reboot
+ - conditions: "{{ trigger.event.data.command == '/toggle_sd_gamemode' }}"
+ sequence:
+ - service: shell_command.steamdeck_gamemode
+ - conditions: "{{ trigger.event.data.command == '/toggle_sd_desktop' }}"
+ sequence:
+ - service: shell_command.steamdeck_desktop
+ - conditions: "{{ trigger.event.data.command == '/toggle_sd_sleep' }}"
+ sequence:
+ - service: shell_command.steamdeck_sleep
+
+ - delay:
+ milliseconds: 500
+
+ # 3. Показываем всплывающее окно
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "{{ action_msg }}"
+
+ # 4. Плавно обновляем меню (перерисовываем текст)
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ parse_mode: html
+ message: |
+ 🎮 Управление: Steam Deck
+
+ {% if is_state('binary_sensor.steamdeck', 'on') %}
+ 🟢 Статус: В сети
+
+ 🧠 CPU: {{ states('sensor.steamdeck_cpu_usage') }}%
+ 💾 RAM: {{ states('sensor.steamdeck_ram_used') }} ГБ из {{ states('sensor.steamdeck_ram_total') }} ГБ ({{ states('sensor.steamdeck_ram_usage') }}%)
+
+ 📁 Диск:
+ 📦 Внутр.: {{ states('sensor.steamdeck_disk_internal_free') }} своб. ({{ states('sensor.steamdeck_disk_internal_usage') }}%)
+ 💽 SD-карта: {{ states('sensor.steamdeck_disk_sd_free') }} своб. ({{ states('sensor.steamdeck_disk_sd_usage') }}%)
+
+ 🌡 Температура:
+ 🔋 Батарея: {{ states('sensor.steamdeck_temp_battery') }} °C
+ 🧩 Composite: {{ states('sensor.steamdeck_temp_composite') }} °C
+ ♨️ Edge: {{ states('sensor.steamdeck_temp_edge') }} °C
+
+ ⏱ Аптайм: {{ states('sensor.steamdeck_uptime_human') }}
+ {% else %}
+ 🔴 Статус: Недоступен (Выключен или спит)
+ {% endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - "{% if is_state('binary_sensor.steamdeck', 'off') %}💡 Включить:/toggle_sd_wol{% else %}💤 Спящий режим:/toggle_sd_sleep{% endif %}"
+ - "🔄 Перезагрузить:/toggle_sd_reboot"
+ - "🎮 Gamemode:/toggle_sd_gamemode, 💻 Desktop:/toggle_sd_desktop"
+ - "🔙 Назад:/menu_back, 🔄 Обновить:/sd_control"
+
+ # ==========================================
+ # --- КНОПКИ: МЕНЮ ДОМОФОНА ---
+ # ==========================================
+ - conditions: >
+ {{ trigger.event.data.command in [
+ '/intercom_menu', '/open_door_now', '/toggle_intercom_auto', '/cmd_loc_acc'
+ ] }}
+ sequence:
+ # 1. Задаем сообщение ЗАРАНЕЕ, чтобы оно не потерялось
+ - variables:
+ action_msg: >
+ {% if trigger.event.data.command == '/open_door_now' %}🚪 Дверь открыта!
+ {% elif trigger.event.data.command == '/toggle_intercom_auto' %}🔄 Режим автооткрытия изменен
+ {% elif trigger.event.data.command == '/cmd_loc_acc' %}
+ {% if is_state('binary_sensor.oneplus12_high_accuracy_mode', 'on') %}📍 Локация: ВЫКЛЮЧАЮ ❌
+ {% else %}📍 Локация: ВКЛЮЧАЮ ✅
+ {% endif %}
+ {% else %}🔔 Открыто меню домофона
+ {% endif %}
+
+ # 2. Выполняем действия
+ - choose:
+ - conditions: "{{ trigger.event.data.command == '/open_door_now' }}"
+ sequence:
+ - service: shell_command.open_goodline_door
+
+ - conditions: "{{ trigger.event.data.command == '/toggle_intercom_auto' }}"
+ sequence:
+ - service: input_boolean.toggle
+ target:
+ entity_id: input_boolean.intercom_auto_open
+
+ # --- ИДЕАЛЬНАЯ КНОПКА GPS ---
+ - conditions: "{{ trigger.event.data.command == '/cmd_loc_acc' }}"
+ sequence:
+ - service: notify.mobile_app_oneplus12
+ data:
+ message: "command_high_accuracy_mode"
+ data:
+ command: "{{ 'turn_off' if is_state('binary_sensor.oneplus12_high_accuracy_mode', 'on') else 'turn_on' }}"
+ ttl: 0
+ priority: high
+
+ # 3. Показываем всплывашку в Телеграме
+ - service: telegram_bot.answer_callback_query
+ data:
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "{{ action_msg }}"
+
+ # 4. Ждем ответа от телефона
+ - delay:
+ seconds: 2
+
+ # 5. Перерисовываем меню с таймерами и зонами
+ - service: telegram_bot.edit_message
+ data:
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ parse_mode: html
+ message: |
+ {%- set maps_upd = states.sensor.rasstoianie_do_podezda.last_updated -%}
+ {%- set maps_sec = (now() - maps_upd).total_seconds() | int if maps_upd else '?' -%}
+ {%- set maps_state = states('device_tracker.google_maps_108918666344169166438') -%}
+ {%- set maps_z = '✅ Да' if maps_state | lower == 'intercom' else '❌ Нет' -%}
+
+ {%- set phone_upd = states.sensor.distantsiia_telefon.last_updated -%}
+ {%- set phone_sec = (now() - phone_upd).total_seconds() | int if phone_upd else '?' -%}
+ {%- set phone_state = states('device_tracker.cph2573_2') -%}
+ {%- set phone_z = '✅ Да' if phone_state | lower == 'intercom' else '❌ Нет' -%}
+
+ 🔔 Управление: Домофон
+
+ 🌍 Maps: {{ states('sensor.rasstoianie_do_podezda') }}м | {{ maps_sec }}с | Зона: {{ maps_z }}
+ 📱 Phone: {{ states('sensor.distantsiia_telefon') }}м | {{ phone_sec }}с | Зона: {{ phone_z }}
+
+ 🤖 Автооткрытие: {% if is_state('input_boolean.intercom_auto_open', 'on') %}✅ ВКЛЮЧЕНО{% else %}❌ ВЫКЛЮЧЕНО{% endif %}
+ 🎯 Точный GPS: {% if is_state('binary_sensor.oneplus12_high_accuracy_mode', 'on') %}✅ ВКЛЮЧЕН{% else %}❌ ВЫКЛЮЧЕН{% endif %}
+
+ 🔄 Обновлено: {{ now().strftime('%H:%M:%S') }}
+ inline_keyboard:
+ - "🚪 Открыть дверь:/open_door_now"
+ - "🤖 Авто: {% if is_state('input_boolean.intercom_auto_open', 'on') %}✅ ВКЛ{% else %}❌ ВЫКЛ{% endif %}:/toggle_intercom_auto"
+ - "🎯 Точный GPS: {% if is_state('binary_sensor.oneplus12_high_accuracy_mode', 'on') %}✅ ВКЛ{% else %}❌ ВЫКЛ{% endif %}:/cmd_loc_acc"
+ - "🔙 Назад:/menu_back, 🔄 Обновить:/intercom_menu"
\ No newline at end of file
diff --git a/includes/packages/timer_off_light.yaml b/includes/packages/timer_off_light.yaml
new file mode 100644
index 0000000..e77021c
--- /dev/null
+++ b/includes/packages/timer_off_light.yaml
@@ -0,0 +1,192 @@
+sensor_chek_lighton_presencenone:
+###################################################################################
+ template:
+
+ # Сенсоры автоотключения света
+ # Сенсор автоотключения света ванна
+ - binary_sensor:
+ - name: "Сенсор вкл свет без движения ванная"
+ unique_id: sensor_vkl_svet_bez_dvizheniia_vannaia
+ icon: >-
+ {% if is_state("binary_sensor.sensor_vkl_svet_bez_dvizheniia_vannaia", "on") %}
+ mdi:timer
+ {% else %}
+ mdi:timer-off
+ {% endif %}
+ state: >-
+ {{ (is_state('light.yeelink_ceilc_cc51_light', 'on') or
+ is_state('light.yeelink_ceilc_cc51_ambient_light', 'on') or
+ is_state('switch.rele_zerkalo_i_ventiliatsiia_l1', 'on')) and
+ states('binary_sensor.datchik_prisutstviia_vannaia_presence') in ['off', 'unavailable', 'unknown'] }}
+
+ # Сенсор автоотключения света кухня
+ - name: "Сенсор вкл свет без движения кухня"
+ unique_id: sensor_vkl_svet_bez_dvizheniia_kukhnia
+ icon: >-
+ {% if is_state("binary_sensor.sensor_vkl_svet_bez_dvizheniia_kukhnia", "on") %}
+ mdi:timer
+ {% else %}
+ mdi:timer-off
+ {% endif %}
+ state: >-
+ {{ (is_state('light.yeelink_ceilc_ff3a_light', 'on') or
+ is_state('light.yeelink_ceilc_ff3a_ambient_light', 'on')) and
+ states('binary_sensor.datchik_prisutstviia_kukhnia_presence') in ['off', 'unavailable', 'unknown'] }}
+
+ # Сенсор автоотключения света коридор
+ - name: "Сенсор вкл свет без движения коридор"
+ unique_id: sensor_vkl_svet_bez_dvizheniia_koridor
+ icon: "{{ 'mdi:timer' if this.state == 'on' else 'mdi:timer-off' }}"
+ state: >-
+ {{ (is_state('switch.glavnyi_vykliuchatel_prikhozhaia_left', 'on') or
+ is_state('switch.glavnyi_vykliuchatel_prikhozhaia_right', 'on')) and
+ states('binary_sensor.datchik_dvizheniia_prikhozhaia_occupancy') in ['off', 'unavailable', 'unknown'] }}
+
+ # Сенсор автоотключения света комната
+ - name: "Сенсор вкл свет без движения комната"
+ unique_id: sensor_vkl_svet_bez_dvizheniia_komnata
+ icon: >-
+ {% if is_state("binary_sensor.sensor_vkl_svet_bez_dvizheniia_komnata", "on") %}
+ mdi:timer
+ {% else %}
+ mdi:timer-off
+ {% endif %}
+ state: >-
+ {{ is_state('light.yeelink_ceiling19_d85c_light', 'on') and
+ states('binary_sensor.54ef44e327ba_motion') in ['off', 'unavailable', 'unknown'] and
+ states('binary_sensor.54ef44e45e59_motion') in ['off', 'unavailable', 'unknown'] and
+ states('binary_sensor.54ef44e32e91_motion') in ['off', 'unavailable', 'unknown'] }}
+###################################################################################
+ timer:
+ timer_lighton_presencenone_bathroom:
+ name: "Таймер вкл свет без движения ванная"
+ duration: '00:05:00'
+ timer_lighton_presencenone_kitchen:
+ name: "Таймер вкл свет без движения кухня"
+ duration: '00:05:00'
+ timer_lighton_presencenone_lobby:
+ name: "Таймер вкл свет без движения коридор"
+ duration: '00:10:00'
+ timer_lighton_presencenone_room:
+ name: "Таймер вкл свет без движения комната"
+ duration: '01:00:00'
+###################################################################################
+ automation:
+
+ # Таймер автоотключения \ /homeassistant/includes/packages/controls_light.yaml
+
+###################################################################################
+ # Сброс таймера при выключении
+
+ # Сброс таймера при выключении ванная
+ - alias: timer_lighton_presencenone_bathroom_off
+ initial_state: true
+ trigger:
+ - platform: state
+ entity_id: binary_sensor.sensor_vkl_svet_bez_dvizheniia_vannaia
+ to: 'off'
+ action:
+ - service: timer.cancel
+ target:
+ entity_id: timer.timer_lighton_presencenone_bathroom
+
+ # Сброс таймера при выключении кухня
+ - alias: timer_lighton_presencenone_kitchen_off
+ initial_state: true
+ trigger:
+ - platform: state
+ entity_id: binary_sensor.sensor_vkl_svet_bez_dvizheniia_kukhnia
+ to: 'off'
+ action:
+ - service: timer.cancel
+ target:
+ entity_id: timer.timer_lighton_presencenone_kitchen
+
+ # Сброс таймера при выключении коридор
+ - alias: timer_lighton_presencenone_lobby_off
+ initial_state: true
+ trigger:
+ - platform: state
+ entity_id: binary_sensor.sensor_vkl_svet_bez_dvizheniia_koridor
+ to: 'off'
+ action:
+ - service: timer.cancel
+ target:
+ entity_id: timer.timer_lighton_presencenone_lobby
+
+ # Сброс таймера при выключении комната
+ - alias: timer_lighton_presencenone_room_off
+ initial_state: true
+ trigger:
+ - platform: state
+ entity_id: binary_sensor.sensor_vkl_svet_bez_dvizheniia_komnata
+ to: 'off'
+ action:
+ - service: timer.cancel
+ target:
+ entity_id: timer.timer_lighton_presencenone_room
+
+###################################################################################
+ # Старт таймеров при старте системы
+
+ # Старт таймеров при старте системы ванна
+ - alias: Старт таймера ванная при старте системы
+ trigger:
+ - platform: homeassistant
+ event: start
+ condition:
+ - condition: state
+ entity_id: binary_sensor.datchik_prisutstviia_vannaia_presence
+ state: "off"
+ action:
+ - service: timer.start
+ target:
+ entity_id: timer.timer_lighton_presencenone_bathroom
+ data: {}
+
+ # Старт таймеров при старте системы кухня
+ - alias: Старт таймера кухня при старте системы
+ trigger:
+ - platform: homeassistant
+ event: start
+ condition:
+ - condition: state
+ entity_id: binary_sensor.datchik_prisutstviia_kukhnia_presence
+ state: "off"
+ action:
+ - service: timer.start
+ target:
+ entity_id: timer.timer_lighton_presencenone_kitchen
+ data: {}
+
+ # Старт таймеров при старте системы коридор
+ - alias: Старт таймера коридор при старте системы
+ trigger:
+ - platform: homeassistant
+ event: start
+ condition:
+ - condition: state
+ entity_id: binary_sensor.datchik_dvizheniia_prikhozhaia_occupancy
+ state: "off"
+ action:
+ - service: timer.start
+ target:
+ entity_id: timer.timer_lighton_presencenone_lobby
+
+ # Старт таймеров при старте системы комната
+ - alias: Старт таймера комната при старте системы
+ trigger:
+ - platform: homeassistant
+ event: start
+ condition:
+ - condition: state
+ entity_id: binary_sensor.54ef44e327ba_motion
+ state: "off"
+ action:
+ - service: timer.start
+ target:
+ entity_id: timer.timer_lighton_presencenone_room
+
+###################################################################################
+
+ # Автоматизация отключения света по таймеру \ /homeassistant/includes/packages/controls_light.yaml
diff --git a/includes/packages/transmissiom.yaml b/includes/packages/transmissiom.yaml
new file mode 100644
index 0000000..140698f
--- /dev/null
+++ b/includes/packages/transmissiom.yaml
@@ -0,0 +1,160 @@
+transmission:
+
+ # ==========================================
+ # --- СЕНСОРЫ ДЛЯ ПАРСИНГА ФАЙЛОВ ---
+ # ==========================================
+ command_line:
+ - sensor:
+ name: tr_file_list
+ # Добавлена поддержка UTF-8 и правильная обработка кириллицы
+ command: >-
+ python3 -c 'import json, os; f="/config/tr_list_files.txt"; data={"file_list": [l.strip() for l in open(f, encoding="utf-8") if l.strip()]} if os.path.exists(f) else {"file_list": []}; print(json.dumps(data, ensure_ascii=False))'
+ value_template: "{{ value_json.file_list | length if value_json is defined else 0 }}"
+ json_attributes:
+ - file_list
+ scan_interval: 60
+
+ automation:
+
+ # Обновление списка файлов в фоне
+ - id: tr_refresh_file_list
+ alias: "tr|refresh_file_list"
+ mode: single
+ trigger:
+ - platform: time_pattern
+ minutes: "/1"
+ action:
+ - service: shell_command.tr_files
+ data: {}
+
+ # ==========================================
+ # --- КОМАНДА: ПОЛУЧИТЬ ФАЙЛЫ (/getfiles) ---
+ # ==========================================
+ - id: ntf_tg_tr_send_url_file_list
+ alias: "ntf|tg|tr|send_url_file_list"
+ trigger:
+ - platform: event
+ event_type: telegram_command
+ event_data:
+ command: '/getfiles'
+ - platform: event
+ event_type: telegram_command
+ event_data:
+ command: '/getfiles@ha_dddennnisss_bot'
+ action:
+ - service: telegram_bot.send_message
+ data:
+ # ИСПРАВЛЕНО: Для send_message нужно использовать target!
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ parse_mode: html
+ disable_web_page_preview: true
+ message: >
+ {% set base_url = "https://smb.dddennnisss.ru/files/share/downloads/" %}
+ {% set files = state_attr('sensor.tr_file_list', 'file_list') %}
+
+ {% if files is none or files | length == 0 %}
+ 😔 Нет файлов для скачивания
+ (Проверьте наличие файлов в /config/tr_list_files.txt)
+ {% else %}
+ 📥 Ссылки для скачивания:
+ {% for file in files | reject('equalto', 'incomplete') | reject('equalto', 'unknown') %}
+ 📄 {{ file }}
+ {{ base_url }}{{ file | urlencode }}
+ {% endfor %}
+ {% endif %}
+ inline_keyboard:
+ - '⬇️ Меню торрентов:/tr_control'
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ # ==========================================
+ # --- УВЕДОМЛЕНИЕ: СТАРТ ЗАГРУЗКИ ---
+ # ==========================================
+ - id: ntf_transm_torrents_start_download
+ alias: "ntf|transm_torrents_start_download"
+ trigger:
+ - platform: event
+ event_type: transmission_started_torrent
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id:
+ - -1002006010424
+ - -1003233671944
+ parse_mode: html
+ message: |
+ ▶️ Старт загрузки торрента!
+
+ 📄 Название: {{ trigger.event.data.name }}
+ inline_keyboard:
+ - '⬇️ Статус торрентов:/tr_control'
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ # ==========================================
+ # --- УВЕДОМЛЕНИЕ: ОКОНЧАНИЕ ЗАГРУЗКИ ---
+ # ==========================================
+ - id: ntf_torrents_complect_download
+ alias: "ntf|torrents_complect_download"
+ trigger:
+ - platform: event
+ event_type: transmission_downloaded_torrent
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id:
+ - -1002006010424
+ - -1003233671944
+ parse_mode: html
+ message: |
+ ✅ Загрузка завершена!
+
+ 📄 Название: {{ trigger.event.data.name }}
+ inline_keyboard:
+ - '📥 Получить ссылки:/getfiles'
+ - '⬇️ Статус торрентов:/tr_control'
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ # ==========================================
+ # --- КОМАНДА: ДОБАВИТЬ ТОРРЕНТ (/add) ---
+ # ==========================================
+ - id: tg_add_torrents_transm_magnet
+ alias: "tg|add_torrents_transm_magnet"
+ initial_state: true
+ trigger:
+ - platform: event
+ event_type: telegram_command
+ event_data:
+ command: '/add'
+ - platform: event
+ event_type: telegram_command
+ event_data:
+ command: '/add@ha_dddennnisss_bot'
+ action:
+ - variables:
+ torrent_link: "{{ trigger.event.data.args | join(' ') }}"
+ - choose:
+ # Если ссылку не передали
+ - conditions: "{{ torrent_link | length == 0 }}"
+ sequence:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ parse_mode: html
+ message: "⚠️ Ошибка: Вы не указали ссылку.\nИспользуйте формат:\n/add magnet:?xt=urn:..."
+
+ default:
+ - service: transmission.add_torrent
+ data:
+ torrent: "{{ torrent_link }}"
+ entry_id: "01JJCHRKJJ0GE2K3N9G4K20CB6"
+ download_path: ""
+ - service: telegram_bot.send_message
+ data:
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ parse_mode: html
+ message: |
+ 🔄 Пытаюсь добавить торрент:
+
+ {{ torrent_link | truncate(100, true, '...') }}
+ inline_keyboard:
+ - '⬇️ Статус торрентов:/tr_control'
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
\ No newline at end of file
diff --git a/includes/packages/vacuum.yaml b/includes/packages/vacuum.yaml
new file mode 100644
index 0000000..61a85dd
--- /dev/null
+++ b/includes/packages/vacuum.yaml
@@ -0,0 +1,437 @@
+# взято тут https://sprut.ai/article/odin-iz-variantov-upravleniya-pylesosom-1c-stytj01zhm-dreame-vacuum-mc1808-iz-home-assistant
+select_vacuum_clean_rooms:
+
+ xiaomi_miot:
+ language: ru
+ translations:
+ # Global dictionary
+ '强劲': 'Турбо'
+ '标准': 'Стандартный'
+ '节能': 'Средний'
+ '关': 'Бесшумный'
+ '低': 'Низкий'
+ '中': 'Средний'
+ '高': 'Высокий'
+ 'Sweep': 'Пылесос'
+ 'Sweep And Mop': 'Пылесос и влажная уборка'
+ 'Mop': 'Влажная уборка'
+ 'Global': 'Авто'
+ 'Edge': 'Очистка углов'
+ 'Point': 'Точечная'
+ 'Remote': 'Дистанционная'
+ 'Mi Robot Vacuum-Mop 2 Lite Robot Cleaner Режим': 'Режим уборки'
+ 'Mi Robot Vacuum-Mop 2 Lite Robot Cleaner Sweep Type': 'Вид уборки'
+ 'Mi Robot Vacuum-Mop 2 Lite sweep water_state': 'Уровень воды'
+ 'starting': 'Начало уборки'
+ 'charger disconnected': 'Зарядное устройство отключено'
+ 'idle': 'Ожидание'
+ 'remote control active': 'Включено управление через пульт'
+ 'cleaning': 'Уборка'
+ 'returning home': 'Возвращение на базу'
+ 'manual mode': 'Ручной режим'
+ 'charging': 'Зарядка'
+ 'charging problem': 'Проблема с зарядкой'
+ 'paused': 'Пауза'
+ 'spot cleaning': 'Уборка точки'
+ 'error': 'Ошибка'
+ 'shutting down': 'Выключение'
+ 'updating': 'Обновление'
+ 'docking': 'Остановка у базы'
+ 'going to target': 'Направление до точки'
+ 'zoned cleaning': 'Уборка зоны'
+ 'segment cleaning': 'Уборка'
+ 'emptying the bin': 'Очистка бака'
+ 'charging complete': 'Зарядка завершена'
+ 'device offline': 'Устройство не в сети'
+ 'Sweeping and Mopping': 'Пылесосит и моет полы'
+
+#======================================================================================================================
+ input_boolean:
+
+ room_vacuum:
+ name: "Комната уборка"
+ lobby_vacuum:
+ name: "Прихожая уборка"
+ hallway_vacuum:
+ name: "Коридор уборка"
+ bathroom_vacuum:
+ name: "Ванная уборка"
+ kitchen_vacuum:
+ name: "Кухня уборка"
+
+#======================================================================================================================
+ group:
+ all_rooms_for_vac_clean:
+ name: All rooms for vacuum clean
+ entities:
+ - input_boolean.room_vacuum
+ - input_boolean.lobby_vacuum
+ - input_boolean.hallway_vacuum
+ - input_boolean.bathroom_vacuum
+ - input_boolean.kitchen_vacuum
+
+#======================================================================================================================
+
+ template:
+ # Сенсор просматривает нашу группу на предмет включенных input boolean,
+ # затем забирает их названия, записывает их в строку, разделяя запятой,
+ # и, наконец, заменяет каждое имя в списке соотвестовующим набором цифр в квадратных скобках.
+ - sensor:
+ - default_entity_id: sensor.select_rooms_for_clean
+ icon: mdi:vacuum
+ name: Выбранные комнаты для пылесоса
+ state: "{% set room = expand('group.all_rooms_for_vac_clean') | selectattr('state',
+ 'eq', 'on') | map(attribute='entity_id') | list | join(',') | replace('input_boolean.room_vacuum','[3,1,3,3,1]')
+ | replace('input_boolean.lobby_vacuum','[2,1,3,3,1]') | replace('input_boolean.hallway_vacuum','[5,1,3,3,1]')
+ | replace('input_boolean.bathroom_vacuum','[1,1,3,3,1]') | replace('input_boolean.kitchen_vacuum','[4,1,3,3,1]')
+ %}\n {\"selects\":[{{room}}]}"
+
+ # Сенсор выаода можности всасывания для обходя ограничения редактора карточки
+ - default_entity_id: sensor.select_vacuum_fan_speed
+ icon: mdi:vacuum
+ name: Выбранная мощность всасывания
+ state: '{{ state_attr(''vacuum.dreame_mc1808_044c_robot_cleaner_2'', ''fan_speed'')}}'
+
+ # Сенсор выаода уровня воды для обходя ограничения редактора карточки
+ - default_entity_id: sensor.select_water_vacum
+ icon: mdi:vacuum
+ name: Выбранный уровень воды
+ state: '{{ state_attr(''vacuum.stytj01zhm'', ''water_level'')}}'
+
+ # Сенсор состояния бака с водой
+ - default_entity_id: sensor.vacuum_water_box
+ icon: mdi:vacuum
+ name: Сенсор состояния бака с водой
+ state: '{{state_attr(''vacuum.dreame_mc1808_044c_robot_cleaner_2'',''clean.water_box'')}}'
+
+#======================================================================================================================
+ #Скрипт запуска уборки
+ script:
+ clean_select_rooms:
+ alias: VCM|Убрать выбранные комнаты
+ sequence:
+ - service: xiaomi_miot.call_action
+ data_template:
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ siid: 18
+ aiid: 1
+ params:
+ - piid: 1
+ value: 18
+ - "{{ {'piid':21, 'value': states('sensor.select_rooms_for_clean') } }}"
+ force_params: true
+ #Условия по кторым утсанавливается мощность всасывания и полива
+ - choose:
+ - conditions:
+ - condition: state
+ entity_id: sensor.select_vacuum_fan_speed
+ state: Турбо
+ sequence:
+ - service: script.set_fanspeed_vacum_turbo
+ metadata: {}
+ data: {}
+ - conditions:
+ - condition: state
+ entity_id: sensor.select_vacuum_fan_speed
+ state: Средний
+ sequence:
+ - service: script.set_fanspeed_vacum_strong
+ data: {}
+ - conditions:
+ - condition: state
+ entity_id: sensor.select_vacuum_fan_speed
+ state: Стандартный
+ sequence:
+ - service: script.set_fanspeed_vacum_standart
+ data: {}
+ - conditions:
+ - condition: state
+ entity_id: sensor.select_vacuum_fan_speed
+ state: Тихий
+ sequence:
+ - service: script.set_fanspeed_vacum_silent
+ data: {}
+ - choose:
+ - conditions:
+ - condition: state
+ entity_id: sensor.select_water_vacum
+ state: Low
+ sequence:
+ - service: script.set_water_vacum_low
+ data: {}
+ - conditions:
+ - condition: state
+ entity_id: sensor.select_water_vacum
+ state: Med
+ sequence:
+ - service: script.set_water_vacum_middle
+ data: {}
+ - conditions:
+ - condition: state
+ entity_id: sensor.select_water_vacum
+ state: High
+ sequence:
+ - service: script.set_water_vacum_hight
+ data: {}
+
+ # Смена уровня воды
+ set_water_vacum_hight:
+ alias: VCM|Смена уровня воды пылесос высокий
+ sequence:
+ - service: xiaomi_miot.set_miot_property
+ metadata: {}
+ data:
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ siid: 18
+ piid: 20
+ value: 3
+
+ set_water_vacum_middle:
+ alias: VCM|Смена уровня воды пылесос средний
+ sequence:
+ - service: xiaomi_miot.set_miot_property
+ metadata: {}
+ data:
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ siid: 18
+ piid: 20
+ value: 2
+
+ set_water_vacum_low:
+ alias: VCM|Смена уровня воды пылесос низкий
+ sequence:
+ - service: xiaomi_miot.set_miot_property
+ metadata: {}
+ data:
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ siid: 18
+ piid: 20
+ value: 1
+
+ # Смена мощности всасывания
+
+ set_fanspeed_vacum_silent:
+ alias: VCM|Смена мощности всасывания пылесос бесшумный
+ sequence:
+ - service: xiaomi_miot.set_miot_property
+ metadata: {}
+ data:
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ siid: 18
+ piid: 6
+ value: 0
+
+ set_fanspeed_vacum_standart:
+ alias: VCM|Смена мощности всасывания пылесос стандартный
+ sequence:
+ - service: xiaomi_miot.set_miot_property
+ metadata: {}
+ data:
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ siid: 18
+ piid: 6
+ value: 1
+
+ set_fanspeed_vacum_strong:
+ alias: VCM|Смена мощности всасывания пылесос интенсивный
+ sequence:
+ - service: xiaomi_miot.set_miot_property
+ metadata: {}
+ data:
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ siid: 18
+ piid: 6
+ value: 2
+
+ set_fanspeed_vacum_turbo:
+ alias: VCM|Смена мощности всасывания пылесос турбо
+ sequence:
+ - service: xiaomi_miot.set_miot_property
+ metadata: {}
+ data:
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ siid: 18
+ piid: 6
+ value: 3
+
+#======================================================================================================================
+# автоматизацию, которая сбрасывает булеаны после окончания уборки
+ automation:
+ - alias: 'VCM|reset_select_rooms'
+ id: Reset select rooms
+ trigger:
+ - platform: state
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ to: 'docked'
+ condition: []
+ action:
+ - service: input_boolean.turn_off
+ entity_id:
+ - input_boolean.room_vacuum
+ - input_boolean.lobby_vacuum
+ - input_boolean.hallway_vacuum
+ - input_boolean.bathroom_vacuum
+ - input_boolean.kitchen_vacuum
+
+ - alias: VCM|button_start_clean
+ description: ""
+ trigger:
+ - platform: device
+ domain: mqtt
+ device_id: 975fb5853727f1fa4279bac09fd7fb6b
+ type: action
+ subtype: hold_right
+ discovery_id: 0x00158d0006c6bca8 action_hold_right
+ condition:
+ - condition: or
+ conditions:
+ - condition: state
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ state: docked
+ - condition: state
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ state: idle
+ action:
+ - device_id: 885672257bd73c7492a4ba8b72b83699
+ domain: vacuum
+ entity_id: f9d147842b81972de04c1be4dfd368f3
+ type: clean
+ mode: single
+
+ - alias: VCM|button_stop_clean
+ description: ""
+ trigger:
+ - platform: device
+ domain: mqtt
+ device_id: 975fb5853727f1fa4279bac09fd7fb6b
+ type: action
+ subtype: hold_right
+ discovery_id: 0x00158d0006c6bca8 action_hold_right
+ condition:
+ - condition: or
+ conditions:
+ - condition: state
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ state: cleaning
+ - condition: state
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ state: error
+ - condition: state
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ state: paused
+ action:
+ - device_id: 885672257bd73c7492a4ba8b72b83699
+ domain: vacuum
+ entity_id: f9d147842b81972de04c1be4dfd368f3
+ type: dock
+ mode: single
+
+#======================================================================================================================
+# Уведомления Telegram
+#======================================================================================================================
+ - alias: "ntf|tg|VCM|clean_water_box_off"
+ id: telegram_ntf_vcm_water_box
+ description: "Напоминание о неснятом баке с водой"
+ mode: single
+ trigger:
+ - platform: state
+ entity_id: sensor.vacuum_water_box
+ to: "1"
+ for:
+ hours: 1
+ minutes: 0
+ seconds: 0
+ action:
+ - repeat:
+ sequence:
+ - service: telegram_bot.send_message
+ data:
+ target: -1002006010424
+ message: |
+ 💧 ❗ Напоминание: Снимите бак с водой с пылесоса!
+ Он установлен уже более часа.
+ inline_keyboard:
+ - '🌀 Управление пылесосом:/vcm_control'
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+ - delay:
+ hours: 3
+ while:
+ - condition: state
+ entity_id: sensor.vacuum_water_box
+ state: "1"
+
+ - alias: "ntf|tg|VCM|vacuum_clean_finish"
+ id: telegram_ntf_vcm_finish
+ description: "Уведомление об окончании уборки"
+ mode: single
+ trigger:
+ - platform: state
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ from: 'cleaning'
+ to: 'returning'
+ action:
+ - service: telegram_bot.send_message
+ data:
+ target: -1002006010424
+ message: |
+ ✅ Пылесос завершил уборку
+
+ 🕒 Завершена в: {{ states('sensor.time') }}
+ ⏱️ Затрачено времени: {{ state_attr('vacuum.stytj01zhm', 'cleaning_time') | default(0) }} мин
+ 🏠 Убрано: {{ state_attr('vacuum.stytj01zhm', 'cleaning_area') | default(0) }} м²
+ 🔋 Заряд: {{ state_attr('vacuum.dreame_mc1808_044c_robot_cleaner_2', 'battery_level') | default(0) }}%
+
+ {% if state_attr('vacuum.dreame_mc1808_044c_robot_cleaner_2', 'clean.water_box') | int(0) == 1 %}
+ 💧 ❗ Внимание: Бак с водой всё ещё установлен!
+ {% else %}
+ 💧 Бак с водой: Снят
+ {% endif %}
+ inline_keyboard:
+ - '🌀 Управление пылесосом:/vcm_control, 🔙 Главное меню:/menu_back'
+ - '🗑️ Прочитано:/menu_hide'
+
+ - alias: "ntf|tg|VCM|vacuum_error"
+ id: telegram_ntf_vcm_error
+ description: "Уведомление об ошибке пылесоса"
+ mode: single
+ trigger:
+ - platform: state
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ to: 'error'
+ action:
+ - service: telegram_bot.send_message
+ data:
+ target: -1002006010424
+ message: |
+ {%- set raw = state_attr('vacuum.dreame_mc1808_044c_robot_cleaner_2', 'vacuum.fault') -%}
+ {%- set code = raw | int(0) if raw not in ['unknown', 'unavailable', None] else 0 -%}
+ {%- set errors = {
+ 0: 'Нет ошибки',
+ 1: 'Пылесос подняли (на весу)',
+ 2: 'Щётка заблокирована',
+ 3: 'Ошибка мотора щётки',
+ 4: 'Колесо заблокировано',
+ 5: 'Ошибка датчиков высоты',
+ 6: 'Ошибка колеса',
+ 7: 'Ошибка контейнера для пыли',
+ 8: 'Ошибка лидара (вращение сенсора)',
+ 9: 'Ошибка бампера (столкновение)',
+ 10: 'Ошибка навигации',
+ 11: 'Ошибка зарядки',
+ 12: 'Что-то намоталось на основную щётку',
+ 13: 'Ошибка батареи',
+ 14: 'Ошибка Wi-Fi модуля',
+ 15: 'Ошибка бака с водой',
+ 16: 'Ошибка привода'
+ } -%}
+
+ {%- if code == 0 -%}
+ ✅ Ошибка пылесоса устранена
+ {%- else -%}
+ ❗ Ошибка пылесоса: {{ errors.get(code, 'Неизвестная ошибка (код ' ~ raw ~ ')') }}
+ {%- endif %}
+ inline_keyboard:
+ - '🌀 Управление пылесосом:/vcm_control, 🔙 Главное меню:/menu_back'
+ - '🗑️ Прочитано:/menu_hide'
+
+
diff --git a/includes/packages/washer.yaml b/includes/packages/washer.yaml
new file mode 100644
index 0000000..a375ce3
--- /dev/null
+++ b/includes/packages/washer.yaml
@@ -0,0 +1,190 @@
+washer:
+
+ automation:
+ # ==========================================
+ # --- УВЕДОМЛЕНИЕ: ОШИБКА СТИРАЛКИ ---
+ # ==========================================
+ - id: ntf_washing_error
+ alias: "ntf|washing_error"
+ mode: single
+ trigger:
+ - platform: state
+ entity_id: binary_sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_error_state
+ to: "on"
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id:
+ - -1002006010424
+ - -1003233671944
+ parse_mode: html
+ message: |
+ {% set err = states("sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_error_message") %}
+ ⚠️ Ошибка стиральной машины!
+
+ {% if err == "dE1" %}🚪 Открыт люк!
+ {% elif err == "UE" %}⚖️ Дисбаланс: бельё плохо распределено. Попробуйте переложить вещи.
+ {% else %}❓ Неизвестная ошибка: {{ err }}{% endif %}
+ inline_keyboard:
+ - '📊 Состояние:/bt_wh_control, 🔙 Меню:/menu_back'
+ - '🗑️ Прочитано:/menu_hide'
+
+ # ==========================================
+ # --- УВЕДОМЛЕНИЕ: НАЧАЛО СТИРКИ ---
+ # ==========================================
+ - id: ntf_wshr_wash_start
+ alias: "ntf|wshr|wash_start"
+ trigger:
+ - platform: state
+ entity_id: sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_run_state
+ to: "Стирка"
+ for:
+ seconds: 30
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id:
+ - -1002006010424
+ - -1003233671944
+ parse_mode: html
+ message: |
+ 🧼 Стирка запущена
+
+ 📋 Программа: {{ states('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_current_course') }}
+ 🌡️ Температура: {{ states('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_water_temp') }}
+ ♻️ Обороты: {{ states('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_spin_speed') }}
+ ⏳ Время: {{ state_attr('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi', 'remain_time') }}
+ 🕒 Завершение в: {{ as_timestamp(state_attr('sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi', 'end_time')) | timestamp_custom('%H:%M:%S') }}
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ # ==========================================
+ # --- УВЕДОМЛЕНИЕ: ЗАВЕРШЕНИЕ СТИРКИ ---
+ # ==========================================
+ - id: ntf_wshr_wash_finish
+ alias: "ntf|wshr|wash_finish"
+ trigger:
+ - platform: state
+ entity_id: sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_run_state
+ from: "Завершено"
+ to: "-"
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id:
+ - -1002006010424
+ - -1003233671944
+ parse_mode: html
+ message: "✅ Стирка успешно завершена!"
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ # ==========================================
+ # --- УВЕДОМЛЕНИЕ: НУЖНО ДОСТАТЬ БЕЛЬЕ ---
+ # ==========================================
+ - id: ntf_wshr_wash_cool_on
+ alias: "ntf|wshr|wash_cool_on"
+ trigger:
+ - platform: state
+ entity_id: sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_run_state
+ from: "Завершено"
+ to: "Охлаждение"
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id:
+ - -1002006010424
+ - -1003233671944
+ parse_mode: html
+ message: "🧺 Сушка завершена! Пора достать бельё."
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ # ==========================================
+ # --- УВЕДОМЛЕНИЕ: ОХЛАЖДЕНИЕ ОСТАНОВЛЕНО ---
+ # ==========================================
+ - id: ntf_wshr_wash_cool_off
+ alias: "ntf|wshr|wash_cool_off"
+ trigger:
+ - platform: state
+ entity_id: sensor.stiralnaia_mashina_s_gorizontalnoi_zagruzkoi_run_state
+ from: "Охлаждение"
+ to: null
+ action:
+ - service: telegram_bot.send_message
+ data:
+ chat_id:
+ - -1002006010424
+ - -1003233671944
+ parse_mode: html
+ message: "✅ Охлаждение белья остановлено"
+ inline_keyboard:
+ - '🔙 Главное меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ # ==========================================
+ # --- ПОВТОРЯЮЩЕЕСЯ НАПОМИНАНИЕ (УМНОЕ) ---
+ # ==========================================
+ - id: ntf_tg_wshr_get_laundry
+ alias: "ntf|tg|wshr|get_laundry"
+ description: "Напоминает достать белье тому, кто дома"
+ mode: single
+ trigger:
+ - platform: state
+ entity_id: timer.timer_cool_washer
+ from: "idle"
+ to: "active"
+ condition:
+ - condition: state
+ entity_id: binary_sensor.day_time
+ state: "on"
+ action:
+ - repeat:
+ while:
+ - condition: state
+ entity_id: timer.timer_cool_washer
+ state: "active"
+ sequence:
+ - variables:
+ denis_home: "{{ is_state('device_tracker.google_maps_108918666344169166438', 'home') }}"
+ lena_home: "{{ is_state('device_tracker.google_maps_118311730364158481019', 'home') }}"
+ finish: "{{ state_attr('timer.timer_cool_washer', 'finishes_at') }}"
+ msg: |
+ 🧺 Напоминание: Бельё в машинке!
+ {% if finish -%}
+ {%- set delta = (as_datetime(finish) - now()).total_seconds() | int -%}
+ {%- if delta > 0 -%}
+ {%- set hours = delta // 3600 -%}
+ {%- set minutes = (delta % 3600) // 60 -%}
+ {%- set seconds = delta % 60 %}
+ ⏳ До автовыключения: {{ '%02d:%02d:%02d' % (hours, minutes, seconds) }}
+ {%- else %}
+ ⏳ До автовыключения: 00:00:00
+ {%- endif -%}
+ {%- else %}
+ ❌ Таймер не активен.
+ {%- endif %}
+
+ # Пишем в группу Дениса, если он дома
+ - if: "{{ denis_home }}"
+ then:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1002006010424
+ parse_mode: html
+ message: "{{ msg }}"
+ inline_keyboard:
+ - '🔙 Меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ # Пишем в группу Лены, если она дома
+ - if: "{{ lena_home }}"
+ then:
+ - service: telegram_bot.send_message
+ data:
+ chat_id: -1003233671944
+ parse_mode: html
+ message: "{{ msg }}"
+ inline_keyboard:
+ - '🔙 Меню:/menu_back, 🗑️ Прочитано:/menu_hide'
+
+ - delay:
+ minutes: 30
\ No newline at end of file
diff --git a/includes/packages/weather.yaml b/includes/packages/weather.yaml
new file mode 100644
index 0000000..e69de29
diff --git a/scripts.yaml b/scripts.yaml
new file mode 100644
index 0000000..8d91bef
--- /dev/null
+++ b/scripts.yaml
@@ -0,0 +1,86 @@
+uborka_koridora:
+ alias: Уборка коридора
+ sequence:
+ - service: xiaomi_miot.call_action
+ data:
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ siid: 18
+ aiid: 1
+ throw: false
+ params:
+ - piid: 1
+ value: 18
+ - piid: 21
+ value: '{"selects":[[5,1,3,3,1]]}'
+ force_params: true
+uborka_prihoj:
+ alias: Уборка прихожей
+ sequence:
+ - service: xiaomi_miot.call_action
+ data:
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ siid: 18
+ aiid: 1
+ throw: false
+ params:
+ - piid: 1
+ value: 18
+ - piid: 21
+ value: '{"selects":[[2,1,3,3,1]]}'
+ force_params: true
+uborka_vanni:
+ alias: Уборка ванны
+ sequence:
+ - service: xiaomi_miot.call_action
+ data:
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ siid: 18
+ aiid: 1
+ throw: false
+ params:
+ - piid: 1
+ value: 18
+ - piid: 21
+ value: '{"selects":[[1,1,3,3,1]]}'
+ force_params: true
+uborka_kuhni:
+ alias: Уборка кухни
+ sequence:
+ - service: xiaomi_miot.call_action
+ data:
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ siid: 18
+ aiid: 1
+ throw: false
+ params:
+ - piid: 1
+ value: 18
+ - piid: 21
+ value: '{"selects":[[3,1,3,3,1]]}'
+ force_params: true
+uborka_zal:
+ alias: Уборка зала
+ sequence:
+ - service: xiaomi_miot.call_action
+ data:
+ entity_id: vacuum.dreame_mc1808_044c_robot_cleaner_2
+ siid: 18
+ aiid: 1
+ throw: false
+ params:
+ - piid: 1
+ value: 18
+ - piid: 21
+ value: '{"selects":[[4,1,3,3,1]]}'
+ force_params: true
+openweather_forecast:
+ alias: openweather_forecast
+ sequence:
+ - service: weather.get_forecasts
+ metadata: {}
+ data:
+ type: hourly
+ target:
+ device_id: 6e9d8372f8fb9df3f377095eea1d932b
+ response_variable: openweather_forecast
+ mode: single
diff --git a/scripts/camera_log.txt b/scripts/camera_log.txt
new file mode 100644
index 0000000..26fcce1
--- /dev/null
+++ b/scripts/camera_log.txt
@@ -0,0 +1 @@
+УСПЕХ! Ссылка: rtsp://vcore-jkh08.video.goodline.info:5...
diff --git a/scripts/get_camera.py* b/scripts/get_camera.py*
new file mode 100644
index 0000000..e17d166
--- /dev/null
+++ b/scripts/get_camera.py*
@@ -0,0 +1,97 @@
+import urllib.request
+import urllib.error
+import json
+import traceback
+import os
+
+def get_token_from_file():
+ # Теперь читаем токен из обычного текстовика, а не из secrets
+ token_path = '/config/scripts/goodline_token.txt'
+ if os.path.exists(token_path):
+ with open(token_path, 'r') as f:
+ return f.read().strip()
+ return None
+
+def request_new_sms(log_file):
+ # Данные твоего бота (замени BOT_TOKEN на свой)
+ bot_token = "8329968936:AAFWZz2RTNKWvnhhKXpEXOC55qoj5Cg4_Kk"
+ chat_id = "-1002006010424" # Твой ID группы из прошлой автоматизации
+
+ url_sms = 'https://api-video.goodline.info/ords/mobile/vc2/auth/phone'
+ payload = {
+ "id_device": "5116c3f1822f08",
+ "id_platform": 3,
+ "phone": "79134374202"
+ }
+
+ data = json.dumps(payload).encode('utf-8')
+ headers = {'Content-Type': 'application/json'}
+
+ try:
+ # 1. Запрос СМС у провайдера
+ req = urllib.request.Request(url_sms, data=data, headers=headers, method='POST')
+ urllib.request.urlopen(req, timeout=10)
+
+ # 2. Уведомление в Телеграм о попытке
+ tg_msg = "🔄 Внимание: Токен камеры протух. Запросил новое СМС с кодом..."
+ tg_url = f"https://api.telegram.org/bot{bot_token}/sendMessage"
+ tg_payload = json.dumps({
+ "chat_id": chat_id,
+ "text": tg_msg,
+ "parse_mode": "HTML"
+ }).encode('utf-8')
+
+ tg_req = urllib.request.Request(tg_url, data=tg_payload, headers=headers, method='POST')
+ urllib.request.urlopen(tg_req, timeout=5)
+
+ with open(log_file, 'a') as f:
+ f.write("СЕРВЕР: Запрошена новая СМС с кодом и отправлено уведомление в TG!\n")
+
+ except Exception as e:
+ with open(log_file, 'a') as f:
+ f.write(f"ОШИБКА в request_new_sms: {e}\n")
+
+def get_url():
+ log_file = '/config/scripts/camera_log.txt'
+ master_token = get_token_from_file()
+
+ if not master_token:
+ with open(log_file, 'w') as f:
+ f.write("ОШИБКА: Файл goodline_token.txt пуст или не существует!\n")
+ request_new_sms(log_file) # Просим СМС, если токена вообще нет
+ return
+
+ url = 'https://api-video.goodline.info/ords/mobile/vc2/v2/cameras/23079'
+ headers = {
+ 'token': master_token,
+ 'origin': 'https://video.online-dozor.ru',
+ 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
+ }
+
+ try:
+ req = urllib.request.Request(url, headers=headers)
+ with urllib.request.urlopen(req, timeout=15) as response:
+ data = json.loads(response.read().decode())
+
+ rtsp = data.get('STREAM_LIVE_RTSP_HD')
+ sig = data.get('SIGNATURE', '').replace('wmsAuthSign=', '')
+
+ if rtsp and sig:
+ final_link = f"{rtsp}?wmsAuthSign={sig}"
+ print(final_link, end='')
+ with open(log_file, 'w') as f:
+ f.write(f"УСПЕХ! Ссылка: {final_link[:40]}...\n")
+
+ except urllib.error.HTTPError as e:
+ error_body = e.read().decode()
+ with open(log_file, 'w') as f:
+ f.write(f"ОШИБКА 401: Токен устарел!\n")
+ # ТОКЕН ПРОТУХ - ЗАПРАШИВАЕМ СМС!
+ request_new_sms(log_file)
+
+ except Exception as e:
+ with open(log_file, 'w') as f:
+ f.write(f"КРИТИЧЕСКАЯ ОШИБКА:\n{traceback.format_exc()}\n")
+
+if __name__ == "__main__":
+ get_url()
diff --git a/scripts/goodline_token.txt b/scripts/goodline_token.txt
new file mode 100644
index 0000000..792cdab
--- /dev/null
+++ b/scripts/goodline_token.txt
@@ -0,0 +1 @@
+566AFC0A-AE12-4F15-E063-2965660ADC25
\ No newline at end of file
diff --git a/scripts/update_goodline_token.py* b/scripts/update_goodline_token.py*
new file mode 100644
index 0000000..3db7c0d
--- /dev/null
+++ b/scripts/update_goodline_token.py*
@@ -0,0 +1,44 @@
+import urllib.request
+import json
+import sys
+
+def verify_code(sms_code):
+ url = 'https://api-video.goodline.info/ords/mobile/vc2/auth/token/sms'
+
+ # Данные из твоего скриншота
+ payload = {
+ "phone": "79134374202",
+ "code": str(sms_code)
+ }
+
+ data = json.dumps(payload).encode('utf-8')
+ headers = {
+ 'Content-Type': 'application/json',
+ 'origin': 'https://video.online-dozor.ru',
+ 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
+ }
+
+ req = urllib.request.Request(url, data=data, headers=headers, method='POST')
+
+ try:
+ with urllib.request.urlopen(req, timeout=10) as response:
+ resp_json = json.loads(response.read().decode('utf-8'))
+ new_token = resp_json.get('TOKEN')
+
+ if new_token:
+ # Записываем свежий токен в текстовый файл
+ with open('/config/scripts/goodline_token.txt', 'w') as f:
+ f.write(new_token)
+ print(f"Успех! Новый токен сохранен: {new_token[:10]}...")
+ else:
+ print("Ошибка: Токен не найден в ответе сервера!")
+
+ except Exception as e:
+ print(f"Ошибка при отправке кода: {e}")
+
+if __name__ == "__main__":
+ # Скрипт принимает код из аргумента командной строки
+ if len(sys.argv) > 1:
+ verify_code(sys.argv[1])
+ else:
+ print("Ошибка: Не передан СМС код!")