commit 7639a125de75428306ebb34533c2f0872cab0fd0 Author: dddennnisss Date: Tue Jul 21 13:17:00 2026 +0700 fix(bus.yaml): add default to value_json.time to prevent errors when API returns no data diff --git a/bus.yaml b/bus.yaml new file mode 100644 index 0000000..0dc7e81 --- /dev/null +++ b/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 | default('нет данных', true) }}" + 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 | default('нет данных', true) }}" + 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 | default('нет данных', true) }}" + 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 | default('нет данных', true) }}" + 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 | default('нет данных', true) }}" + 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 | default('нет данных', true) }}" + 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 | default('нет данных', true) }}" + 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 | default('нет данных', true) }}" + 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 | default('нет данных', true) }}" + 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 | default('нет данных', true) }}" + 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 | default('нет данных', true) }}" + 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 | default('нет данных', true) }}" + 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 проехал кемдор + + + +