Hi,
I’ve some automation that triggers when a Twitch Streamer goes online.
It asks me via Android actionable notification if I’d like to start some recording of the stream.
When I answer with “Yes”, a shell_command
will be executed by the automation.
This shell_command
calls a script on a remote PC (on same network) and starts the recording of the desired stream, until the streamer goes offline and then finishes the recording.
My automation is technically working as expected, means the stream will actually be fully and correctly recorded, so no issue with that!
BUT, HA expects to get some “feedback” within 60 sec. after executing that shell_command
. And this feedback doesn’t come so there will be some HA log errors.
I’d like to get rid of that, even though they’re just “cosmetic” errors in my case.
However, they are somewhat annoying.
Question to the Pro’s:
Is there any way to tell HA automatically that the remote script has been executed successfully and this in less than 60 seconds?
This could even be some “fake” notification to HA, just to avoid the log errors.
This is my automation:
alias: >-
[HA Android App][Actionable Notification] Start Twitch Stream Recording of
LangeDJ and boot-up Ubuntu-VM, if off
description: ""
trigger:
- platform: state
entity_id: sensor.langedj
to: streaming
from: offline
condition: []
action:
- alias: Set up variables for the actions
variables:
action_yes: "{{ 'YES_' ~ context.id }}"
action_no: "{{ 'NO_' ~ context.id }}"
- alias: Ask Stefan if a recording shall be started
service: notify.mobile_app_s24_ssp
data:
title: LangeDJ ist jetzt bei Twitch live!
message: Soll eine Stream-Aufnahme gestartet werden?
data:
actions:
- action: "{{ action_yes }}"
title: Ja
- action: "{{ action_no }}"
title: Nein
icon_url: >-
https://static-cdn.jtvnw.net/jtv_user_pictures/73ff9c73-2422-4f7e-a7d9-89df80510b58-profile_image-300x300.png
visibility: public
notification_icon: mdi:twitch
timeout: 600
- alias: Wait for a response
wait_for_trigger:
- platform: event
event_type: mobile_app_notification_action
event_data:
action: "{{ action_yes }}"
- platform: event
event_type: mobile_app_notification_action
event_data:
action: "{{ action_no }}"
continue_on_timeout: false
timeout:
hours: 0
minutes: 10
seconds: 1
milliseconds: 0
- alias: Perform the action
choose:
- conditions:
- condition: template
value_template: |
{{
wait.trigger is not none
and wait.trigger.event.data.action == action_yes
}}
sequence:
- if:
- type: is_not_running
condition: device
device_id: 53da3ba5bc950a0c5e22de307922a792
entity_id: 0129cdc5ac277433956d5efaecd44d71
domain: binary_sensor
then:
- device_id: 53da3ba5bc950a0c5e22de307922a792
domain: button
entity_id: 8aa73c66888de595704ecd44d268e746
type: press
- delay:
hours: 0
minutes: 0
seconds: 25
milliseconds: 0
- service: shell_command.remote_rec_lange
data: {}
else:
- service: shell_command.remote_rec_lange
data: {}
- conditions:
- condition: template
value_template: |
{{
wait.trigger is not none
and wait.trigger.event.data.action == action_no
}}
sequence:
- service: notify.mobile_app_s24_ssp
data:
title: Es wird keine Stream-Aufnahme gestartet...
message: ... da die Abfrage mit <b>Nein</b> beantwortet wurde!
data:
visibility: public
notification_icon: mdi:twitch
timeout: 60
mode: single
Thanks in advance!
Shell commands still running after 60 seconds will timeout and will be terminated. This is by design and there is no way to prevent this.
The approach needs to be to adjust the command to complete sooner. You didn’t share what shell_command.remote_rec_lange
actually does, but surely it can just send the notification to the remove PC and stop?
This is the related shell cmd
:
remote_rec_lange: ssh -p xxx -o UserKnownHostsFile=/config/.ssh/known_hosts [email protected] -i /config/.ssh/id_ed25519 '/bin/bash /home/stefan/Musik/streamlink/lange_rec.sh'
So the shell cmd
calls another script on the remote-pc, which then does the job of the recording.
Like I mentioned previously, the (remote) execution of that script works and it runs well.
would probably some webhook do the trick and when I extend my shell_command
, for example like:
remote_rec_lange: ssh -p xxx -o UserKnownHostsFile=/config/.ssh/known_hosts [email protected] -i /config/.ssh/id_ed25519 '/bin/bash /home/stefan/Musik/streamlink/lange_rec.sh && curl -X POST http://<HA-IP>:<HA-Port>/api/webhook/webhook_lange'
?
However, it’s not yet clear to me how to make my automation listen to such webhook and that it would “interpret” that the shell_command
got executed successfully.
Thanks.
I think you should update /home/stefan/Musik/streamlink/lange_rec.sh
such that it starts whatever long running task it runs in the background. You may have to use nohup
(“no hangup”) as well which will prevent the task from being terminated when the ssh session closes.
So, for example if your lange_rec.sh
has a line that starts the long recording like:
start_record.sh --SOME_ARG1 --SOME_ARG2
then change this to
nohup start_record.sh --SOME_ARG1 --SOME_ARG2 &
my remote script lange_rec.sh
gets executed by the related shell_command
without any issue and even runs (and finishes) completely - even after several hours of stream recording. That’s actually not the issue.
The only thing which is annoying is that a HA log error will be written because HA gets no feedback that the script got executed/finished successfully because of a timeout of 60 seconds related to shell_command
.
So all I want, if somehow possible, is to tell my HA automation that triggers the related shell_command
gets some feedback after the command has been executed.
If this would happen within those 60 sec., it should result in no HA log errors related to my automation / the shell_command
.
There’s no way to “tell” HA that, your only option is to get the ssh
command to complete within the 60 second window. Hence, my suggestion to background the long running task. This will allow the lang_rec.sh
process to end, which will allow the ssh
process to end immediately.
ok, thanks. here’s my script. Would you say that nohup
is set correctly?
#!/bin/bash
# Telegram-Bot Token and Chat-ID
telegram_bot_token="********************"
telegram_chat_id="******************"
# Dir for recorded WAV files and logs
output_directory="/home/stefan/Musik/streamlink/Lange"
# Twitch-Streamer
twitch_streamer="langedj"
# Set a file name incl. time stamp
output_filename="twitch_stream_$twitch_streamer-$(date +'%Y%m%d_%H%M%S').wav"
# Audio file incl. path
audio_file="$output_directory/$output_filename"
# Log file with timestamp in its file name
log_filename="record_log_$(date +'%Y%m%d_%H%M%S').txt"
log_file="$output_directory/$log_filename"
# Function to send Telegram notifications
send_telegram_notification() {
local message="$1"
curl -s -X POST "https://api.telegram.org/bot$telegram_bot_token/sendMessage" \
-d "chat_id=$telegram_chat_id" \
-d "text=$message"
}
# Write the start time stamp of the recording into log file
start_message="Twitch-Aufnahme von Lange gestartet um: $(date +'%Y-%m-%d %H:%M:%S')"
echo "$start_message" >> "$log_file"
send_telegram_notification "$start_message"
# Recording of Twitch-Stream with streamlink and conversion to WAV
nohup sh -c "streamlink twitch.tv/$twitch_streamer audio_only --twitch-disable-ads -o - | \
ffmpeg -i pipe: -acodec pcm_s16le -ar 48000 -ac 2 $audio_file" > /dev/null 2>&1 &
# Signal-Handler to cancel the recording before its end
cleanup() {
echo "Aufnahme wird gestoppt..."
pkill -f "streamlink.*$twitch_streamer"
pkill -f "ffmpeg.*$audio_file"
# Write end time stamp into log file
echo "Aufnahme beendet um: $(date +'%Y-%m-%d %H:%M:%S')" >> "$log_file"
send_telegram_notification "Aufnahme beendet."
# Shutdown the system after 1 min w/o user interaction
sudo shutdown -h 1
}
# Set Trap to call Signal-Handler at SIGTERM (kill)
trap cleanup SIGTERM
# Write the end time stamp of the recording into log file
end_message="Twitch-Aufnahme von Lange beendet um: $(date +'%Y-%m-%d %H:%M:%S')"
echo "$end_message" >> "$log_file"
send_telegram_notification "$end_message"
# Send a Telegram Notification before shutdown of the system
shutdown_message="Ubuntu-VM wird nun in ca. 1 Min. heruntergefahren."
send_telegram_notification "$shutdown_message"
# Shutdown the system after 1 min w/o user interaction
sudo shutdown -h 1
I think I’ve lead you down the wrong path. After seeing your script, I was concerned that the cancel part and the telegram part wouldn’t run correctly if you nohup the part that starts recording. Then I considered if you could have a second script on the remote host which all it would do is nohup your lang_rec.sh
script and start it in the background.
Before responding, I did some simple tests, and to my surprise the ssh client blocked despite the fact that the task was backgrounded. It turns out, this is by design.
At that link, they suggest using -n -f
flags on the ssh client to accomplish the same thing. In my tests, this seems to produce the desired result.
So, I think the suggestion is to leave your lang_rec.sh
script alone (no backgrounding or nohup) and just add -n -f
flags to your ssh command_line config in HA.
alright, thanks for the clarification and the useful link!
so then, like this?
remote_rec_lange: ssh -p xxx -n -f -o UserKnownHostsFile=/config/.ssh/known_hosts [email protected] -i /config/.ssh/id_ed25519 '/bin/bash /home/stefan/Musik/streamlink/lange_rec.sh > /dev/null 2>&1 &'
This would be my best guess Hopefully this will eliminate the error in the log for you.
Ok, we’ll see once I have a chance to record another stream
Thanks a lot so far
Edit:
It actually works perfectly this way - no more log errors after automation trigger!
Many thanks again @atlflyer