QuickBars for Home Assistant - instant HA controls over any app on Android TV

Hi

I just tested quickbars. Its very intuitive and fast. I like it.

Some questions…

I have 3 google home devices.

If i buy it once. Can i use it on all 3 or do i need to buy 3 times?

In quickbars settings i sometimes have to type in qomething. Except i cant use the google remote for that. How do i type in? Can i use my phone for it somehow or perhaps a keyboard on screen?

Also if i put it on 3 devices… can i configure diffferent things on each device? I suppose so?

First off, thanks for a great application and purchased! Looking for some feedback on an issue I can’t seem to address, related to Ring cameras. I have added the entities in QuickBars and I am able to launch the camera entity on the TV (Hisense U8 65" Google TV). The app launches the camera feed fine, but shows a recorded stream and not the live feed. Within HA I can launch the same entity (camera.front_door_live_view) and the live stream works fine. What am I missing and maybe the Ring Cameras are not compatible given they are rtsp://. Any suggestions would be appreciated.

Thanks

@majdzik84
Hey, the custom size settings are part of the new blueprint, as explained thoroughly here.

@megarushing
Hey, I’ll keep it in mind.
I suggest going through the troubleshooting guide inside “Can’t trigger a QuickBar after a while” if you haven’t. It’s not a 100% fix due to the nature of different OEMs, but still helped a lot of people.

@skank
Hey, I replied to your email, but still for other people:

  • QuickBars Plus upgrade is per Google Account, not per device.
  • I’m not sure what you mean with the keyboard.
  • You can definitely configure different things on each device.

@guyp2k
Thank you very much for your support!
I’m guessing you are trying to display MJPEG streams, which are apparently not working correctly with Ring cameras according to some reports.
That’s exactly why I added RTSP streams support using the blueprints.

Please go through the very detailed guides I’ve written on how to set everything up.

  • This is for MJPEG camera entities (which doesn’t work correctly for you)
  • This is for a more general camera stream, with RTSP support and extra customization options.

Let me know if something is unclear!

@Trooped
Hi thx for replying.
I just bought it :wink:

Nice app !
I managed to get a keyboard too, didnt know i had to use google home app > device> remote to put in text :wink:

Will try to make different things now, as in notifications and popup of doorbell live cam view when someones at the door!

Edit: i tried the blueprint for Pip but the script doesnt do anything if i trigger it using quickbar

Same with the doorbell… theres no notification. Not sure what i’m doing wrong
Heres the config of the pip script

variables:
  app_id: ''
  source_type: entity
  camera_entity: camera.deurbel_vloeiend
  camera_alias: ''
  rtsp_url: ''
  mute_audio: true
  position: bottom_left
  size_mode: auto
  size: medium
  custom_width: 640
  custom_height: 360
  auto_hide: 30
  show_title: true
  camera_title: Voordeur
  show_toast: true
sequence:
  - choose:
      - conditions:
          - condition: template
            value_template: >-
              {{ source_type == 'entity' and not (camera_entity | string | trim)
              }}
        sequence:
          - stop: Pick a Camera entity or change Source type.
      - conditions:
          - condition: template
            value_template: >-
              {{ source_type == 'alias' and not (camera_alias | string | trim)
              }}
        sequence:
          - stop: Enter a Camera alias or change Source type.
      - conditions:
          - condition: template
            value_template: '{{ source_type == ''rtsp'' and not (rtsp_url | string | trim) }}'
        sequence:
          - stop: Enter an RTSP URL or change Source type.
  - choose:
      - conditions:
          - condition: template
            value_template: '{{ (app_id | string | trim) | length > 0 }}'
        sequence:
          - choose:
              - conditions:
                  - condition: template
                    value_template: '{{ source_type == ''entity'' and size_mode == ''custom'' }}'
                sequence:
                  - event: quickbars.open
                    event_data:
                      id: '{{ app_id }}'
                      camera_entity: '{{ camera_entity }}'
                      position: '{{ position }}'
                      size_px:
                        w: '{{ (custom_width | int) }}'
                        h: '{{ (custom_height | int) }}'
                      auto_hide: '{{ (auto_hide | int) }}'
                      show_title: '{{ show_title }}'
                      camera_title: >-
                        {{ camera_title if (camera_title | string | trim) else
                        none }}
                      show_toast: '{{ show_toast }}'
              - conditions:
                  - condition: template
                    value_template: '{{ source_type == ''entity'' and size_mode == ''preset'' }}'
                sequence:
                  - event: quickbars.open
                    event_data:
                      id: '{{ app_id }}'
                      camera_entity: '{{ camera_entity }}'
                      position: '{{ position }}'
                      size: '{{ size }}'
                      auto_hide: '{{ (auto_hide | int) }}'
                      show_title: '{{ show_title }}'
                      camera_title: >-
                        {{ camera_title if (camera_title | string | trim) else
                        none }}
                      show_toast: '{{ show_toast }}'
              - conditions:
                  - condition: template
                    value_template: '{{ source_type == ''entity'' and size_mode == ''auto'' }}'
                sequence:
                  - event: quickbars.open
                    event_data:
                      id: '{{ app_id }}'
                      camera_entity: '{{ camera_entity }}'
                      position: '{{ position }}'
                      auto_hide: '{{ (auto_hide | int) }}'
                      show_title: '{{ show_title }}'
                      camera_title: >-
                        {{ camera_title if (camera_title | string | trim) else
                        none }}
                      show_toast: '{{ show_toast }}'
              - conditions:
                  - condition: template
                    value_template: '{{ source_type == ''alias'' and size_mode == ''custom'' }}'
                sequence:
                  - event: quickbars.open
                    event_data:
                      id: '{{ app_id }}'
                      camera_alias: '{{ camera_alias }}'
                      position: '{{ position }}'
                      size_px:
                        w: '{{ (custom_width | int) }}'
                        h: '{{ (custom_height | int) }}'
                      auto_hide: '{{ (auto_hide | int) }}'
                      show_title: '{{ show_title }}'
                      camera_title: >-
                        {{ camera_title if (camera_title | string | trim) else
                        none }}
                      show_toast: '{{ show_toast }}'
              - conditions:
                  - condition: template
                    value_template: '{{ source_type == ''alias'' and size_mode == ''preset'' }}'
                sequence:
                  - event: quickbars.open
                    event_data:
                      id: '{{ app_id }}'
                      camera_alias: '{{ camera_alias }}'
                      position: '{{ position }}'
                      size: '{{ size }}'
                      auto_hide: '{{ (auto_hide | int) }}'
                      show_title: '{{ show_title }}'
                      camera_title: >-
                        {{ camera_title if (camera_title | string | trim) else
                        none }}
                      show_toast: '{{ show_toast }}'
              - conditions:
                  - condition: template
                    value_template: '{{ source_type == ''alias'' and size_mode == ''auto'' }}'
                sequence:
                  - event: quickbars.open
                    event_data:
                      id: '{{ app_id }}'
                      camera_alias: '{{ camera_alias }}'
                      position: '{{ position }}'
                      auto_hide: '{{ (auto_hide | int) }}'
                      show_title: '{{ show_title }}'
                      camera_title: >-
                        {{ camera_title if (camera_title | string | trim) else
                        none }}
                      show_toast: '{{ show_toast }}'
              - conditions:
                  - condition: template
                    value_template: '{{ source_type == ''rtsp'' and size_mode == ''custom'' }}'
                sequence:
                  - event: quickbars.open
                    event_data:
                      id: '{{ app_id }}'
                      rtsp_url: '{{ rtsp_url }}'
                      position: '{{ position }}'
                      size_px:
                        w: '{{ (custom_width | int) }}'
                        h: '{{ (custom_height | int) }}'
                      auto_hide: '{{ (auto_hide | int) }}'
                      show_title: '{{ show_title }}'
                      camera_title: >-
                        {{ camera_title if (camera_title | string | trim) else
                        none }}
                      show_toast: '{{ show_toast }}'
                      mute_audio: '{{ mute_audio }}'
              - conditions:
                  - condition: template
                    value_template: '{{ source_type == ''rtsp'' and size_mode == ''preset'' }}'
                sequence:
                  - event: quickbars.open
                    event_data:
                      id: '{{ app_id }}'
                      rtsp_url: '{{ rtsp_url }}'
                      position: '{{ position }}'
                      size: '{{ size }}'
                      auto_hide: '{{ (auto_hide | int) }}'
                      show_title: '{{ show_title }}'
                      camera_title: >-
                        {{ camera_title if (camera_title | string | trim) else
                        none }}
                      show_toast: '{{ show_toast }}'
                      mute_audio: '{{ mute_audio }}'
              - conditions:
                  - condition: template
                    value_template: '{{ source_type == ''rtsp'' and size_mode == ''auto'' }}'
                sequence:
                  - event: quickbars.open
                    event_data:
                      id: '{{ app_id }}'
                      rtsp_url: '{{ rtsp_url }}'
                      position: '{{ position }}'
                      auto_hide: '{{ (auto_hide | int) }}'
                      show_title: '{{ show_title }}'
                      camera_title: >-
                        {{ camera_title if (camera_title | string | trim) else
                        none }}
                      show_toast: '{{ show_toast }}'
                      mute_audio: '{{ mute_audio }}'
    default:
      - choose:
          - conditions:
              - condition: template
                value_template: '{{ source_type == ''entity'' and size_mode == ''custom'' }}'
            sequence:
              - event: quickbars.open
                event_data:
                  camera_entity: '{{ camera_entity }}'
                  position: '{{ position }}'
                  size_px:
                    w: '{{ (custom_width | int) }}'
                    h: '{{ (custom_height | int) }}'
                  auto_hide: '{{ (auto_hide | int) }}'
                  show_title: '{{ show_title }}'
                  camera_title: >-
                    {{ camera_title if (camera_title | string | trim) else none
                    }}
                  show_toast: '{{ show_toast }}'
          - conditions:
              - condition: template
                value_template: '{{ source_type == ''entity'' and size_mode == ''preset'' }}'
            sequence:
              - event: quickbars.open
                event_data:
                  camera_entity: '{{ camera_entity }}'
                  position: '{{ position }}'
                  size: '{{ size }}'
                  auto_hide: '{{ (auto_hide | int) }}'
                  show_title: '{{ show_title }}'
                  camera_title: >-
                    {{ camera_title if (camera_title | string | trim) else none
                    }}
                  show_toast: '{{ show_toast }}'
          - conditions:
              - condition: template
                value_template: '{{ source_type == ''entity'' and size_mode == ''auto'' }}'
            sequence:
              - event: quickbars.open
                event_data:
                  camera_entity: '{{ camera_entity }}'
                  position: '{{ position }}'
                  auto_hide: '{{ (auto_hide | int) }}'
                  show_title: '{{ show_title }}'
                  camera_title: >-
                    {{ camera_title if (camera_title | string | trim) else none
                    }}
                  show_toast: '{{ show_toast }}'
          - conditions:
              - condition: template
                value_template: '{{ source_type == ''alias'' and size_mode == ''custom'' }}'
            sequence:
              - event: quickbars.open
                event_data:
                  camera_alias: '{{ camera_alias }}'
                  position: '{{ position }}'
                  size_px:
                    w: '{{ (custom_width | int) }}'
                    h: '{{ (custom_height | int) }}'
                  auto_hide: '{{ (auto_hide | int) }}'
                  show_title: '{{ show_title }}'
                  camera_title: >-
                    {{ camera_title if (camera_title | string | trim) else none
                    }}
                  show_toast: '{{ show_toast }}'
          - conditions:
              - condition: template
                value_template: '{{ source_type == ''alias'' and size_mode == ''preset'' }}'
            sequence:
              - event: quickbars.open
                event_data:
                  camera_alias: '{{ camera_alias }}'
                  position: '{{ position }}'
                  size: '{{ size }}'
                  auto_hide: '{{ (auto_hide | int) }}'
                  show_title: '{{ show_title }}'
                  camera_title: >-
                    {{ camera_title if (camera_title | string | trim) else none
                    }}
                  show_toast: '{{ show_toast }}'
          - conditions:
              - condition: template
                value_template: '{{ source_type == ''alias'' and size_mode == ''auto'' }}'
            sequence:
              - event: quickbars.open
                event_data:
                  camera_alias: '{{ camera_alias }}'
                  position: '{{ position }}'
                  auto_hide: '{{ (auto_hide | int) }}'
                  show_title: '{{ show_title }}'
                  camera_title: >-
                    {{ camera_title if (camera_title | string | trim) else none
                    }}
                  show_toast: '{{ show_toast }}'
          - conditions:
              - condition: template
                value_template: '{{ source_type == ''rtsp'' and size_mode == ''custom'' }}'
            sequence:
              - event: quickbars.open
                event_data:
                  rtsp_url: '{{ rtsp_url }}'
                  position: '{{ position }}'
                  size_px:
                    w: '{{ (custom_width | int) }}'
                    h: '{{ (custom_height | int) }}'
                  auto_hide: '{{ (auto_hide | int) }}'
                  show_title: '{{ show_title }}'
                  camera_title: >-
                    {{ camera_title if (camera_title | string | trim) else none
                    }}
                  show_toast: '{{ show_toast }}'
                  mute_audio: '{{ mute_audio }}'
          - conditions:
              - condition: template
                value_template: '{{ source_type == ''rtsp'' and size_mode == ''preset'' }}'
            sequence:
              - event: quickbars.open
                event_data:
                  rtsp_url: '{{ rtsp_url }}'
                  position: '{{ position }}'
                  size: '{{ size }}'
                  auto_hide: '{{ (auto_hide | int) }}'
                  show_title: '{{ show_title }}'
                  camera_title: >-
                    {{ camera_title if (camera_title | string | trim) else none
                    }}
                  show_toast: '{{ show_toast }}'
                  mute_audio: '{{ mute_audio }}'
          - conditions:
              - condition: template
                value_template: '{{ source_type == ''rtsp'' and size_mode == ''auto'' }}'
            sequence:
              - event: quickbars.open
                event_data:
                  rtsp_url: '{{ rtsp_url }}'
                  position: '{{ position }}'
                  auto_hide: '{{ (auto_hide | int) }}'
                  show_title: '{{ show_title }}'
                  camera_title: >-
                    {{ camera_title if (camera_title | string | trim) else none
                    }}
                  show_toast: '{{ show_toast }}'
                  mute_audio: '{{ mute_audio }}'
alias: QuickBars - Voordeur Camera PiP
description: Voegt pip camera toe aan tv

@Trooped. I am so ecstatic over this that I am delirious. I have put it on a number of Android TVs now, and ABVIOUSLY bought it straight away… This app is such a game changer… I have NEVER been able to effectively access HA from my Android TVs. This literally checks EVERY box I ever had…Except support for groups as entities :wink: Thank you for this! I look forward to the things to come.

1 Like

Update:

I am able to load the live view in VLC with the following url:

rtsp://user:[email protected]/80688cf39e6e_live, but will not work in QuickBars, just the camera title pops up and no video. Will continue to work on this…

Has anyone been able to get Ring cameras to work? Everything else works a charm and great app. The developer has suggested some things to try, but thought I would ask if anyone has had success with Ring,

Thanks

Try mute sound this work for me
I use rtsp and only see fixed image i mute sound and it works

Didn’t work for me, maybe a difference in TV, I have a Hisense U8 and the dev is working on a possible fix for TVs that don’t support rtsp.

Just updated to the latest Shield firmware (9.2.2 iirc), and now the Netflix button seems to no longer be able to be used :frowning: (always opens Netflix even)

1 Like

@skank
Hey, thank you for your support!
I don’t really understand what you’re trying to do with this script.
When trying out the official bluescript I released, does itsend the notification/PiP?

@tiaan
Hey, thank you so much!!
I really appreciate the kind words :slight_smile:

@guyp2k
Hey, I also replied to your email - the new update is out. Try it out and let me know if the RTSP works now.

@TimNiceButDim
Hey, I really hope it’s not a block on the OS side that happened due to the update, though I doubt it.
Try to disable and re-enable accessibility for QuickBars in the Android’s settings.

[New Release] QuickBars v1.3.1!

There’s a new QuickBars update: QuickBars v1.3.1.

New in v1.3.1

New Features

  • Auto-close timer for QuickBars – You can now set an auto-close timer per QuickBar (in the QuickBar settings). Options: Never, 15s, 30s, 60s.
  • Fresh camera_proxy images in notifications – When using a camera_proxy as the notification image source (for MJPEG camera entities), the banner now always pulls an updated snapshot from the live stream instead of reusing an old cached frame. Example of using it + a button to show a live view in the GIF in the post.

Improvements

  • Global “Show toast on entity triggers” toggle – There’s now an option in QuickBars Settings → Advanced Settings to globally disable the little “X triggered” toasts when entities or cameras are fired by Trigger Keys. Perfect if those popups were getting on your nerves.
  • RTSP stream reliability across more devices – The RTSP pipeline has been simplified and hardened, and should now work on a wider range of Android TV devices.

NOTE: If RTSP still doesn’t work for you, please make sure to do all of the following:

  • Target 1 QuickBars device (if you have more than one)
  • Make sure that the RTSP URL isn’t used elsewhere in HA or on your local network
  • Try to mute the volume in the script

If it still doesn’t work - I’d really appreciate details (device model, Android/Google TV version, and what you see).

You can check the latest release notes here: https://quickbars.app/release-notes

Thanks everyone for your support, your bug reports and feature requests!

Untitled design


2 Likes

Hi
You’re welcome!
I’m using both of your scripts… but im not sure i set it up correctly.
I’ve split up my config where i include my scripts separately.
And when using blueprints, its trying to add it in configuration instead of scripts.yaml file
So i added myself there:

Like this

quickbars_voordeur_camera_pip:
  alias: QuickBars - Voordeur Camera PiP
  use_blueprint:
    path: Trooped/camera.yaml
    input:
      camera_entity: camera.deurbel_vloeiend
      mute_audio: true
      position: bottom_left
      camera_title: Voordeur
  description: 'Voegt pip camera toe aan tv'

quickbars_notificatie_deurbel:
  alias: QuickBars - Notificatie deurbel
  use_blueprint:
    path: Trooped/notification.yaml
    input:
      title: Er staat iemand aan de voordeur!
      mdi_icon: mdi:door
      message: Open doen?
      image_url: /local/snapshots/deurbel_latest.jpg
      position: bottom_left
      length: 20
      interrupt: true
      action_1_id: show_camera
      action_1_label: Live view
      action_1_action:
      - action: script.quickbars_voordeur_camera_pip
        metadata: {}
        data: {}
  description: 'Toont popup dat deurbel geactiveerd werd'

Both scripts fail, i dont see any popup

@skank
Did you import the blueprints using the “import blueprint” buttons?
Or you’re trying to use the scripts like they appear in the examples without importing the blueprints?

yes i did import them

@skank
Then I don’t really understand.
Does the script fail inside HA when launching it? Or does it run successfully but nothing appears on your TV.
If it fails - have you checked HA’s logs to see why it fails?
If it succeeds - have you made sure that persistent background connection is enabled in the app’s settings?
And what device do you have? and Android version?

Hi
No it doesnt fail, it works but nothing happens
i have google chromecast device
Latest android

edit: Aha !
I didnt know i had to enable persistent backgroudn connection.
(it said, i could disable it in the text) IF its a must , maybe add this automatically in next version?

I now enabled it, and now i do see the notifications ! Superb! thx a lot !

2 more questions (sorry)
Im stold on old version 1.3
How do i update to latest on the google chromecast?
For the doorbell, will the script be triggered automatically or will i have to maken an automation on doorbell pressed, it runs the script?

Some other thing.
I’m about to jump on a new mediaplayer.
Some have dual boot (android + core elec). I wonder, the quickbars wont show up if its booting core elec, wont they?

Thought I would share w/ others that have Ring cameras, the developer suggested I try the following that was suggested from a user review on the Play Store:

“absolutely wonderful! for those that need there ring cameras to feed the video you need to anyway of getting the rtsp link for them then you need to have it in mjpeg format in order for it to work for you to be able to view I use “gotortc” add the ring camera there use the rtsp link and then rtsp to mjpeg docker container, it will be called RTSP to MJPEG for OctoPrint & has a UI, once converted use the new link in the MJPEG addon with in home assistant and bam good to go!”

I spun up the container, created the streams, added the MJPEG IP Camera Addon, added the URLs that were created from the container, and added the camera entities in QuickBars, Success!

I think you have to create an automation, works for me when I manually launch the notify script, but does not when someone rings the doorbell. Hopefully the developer will provide some direction.

yeah im gonna add automation :slight_smile: