My take on a home dashboard running on the Lenovo ThinkSmart View and managing multiple devices running Fully Kiosk

Just completed the instructions using my mac and deploying the EDL server on a virtual environment venv to avoid clutter on my machine. Worked great after pip installing the packages that it error out for.

1 Like

I am able to navigate the main page of the LineageOS recovery menu with the Vol+ and Vol- buttons but when I use the privacy slider to select the option nothing happens. Any ideas or options?

I use BrowserMod to control the device.
It provides an HA action “navigate” you can use to switch to the dashboard. After a fixed delay, I return to the main dashboard/screensaver.

So is there a really good custom mod for them out there somewhere, or is it still kind of pieced together?

Not sure what you mean?

@pgale

Have you implemented these breaking changes for Button-Card and Kiosk Mode? I would love to see how the changes needs to be implemented on those, as I have not so much time to tinker with it at the moment. And I don’t want to break anything as that would be catastrophic for the WAF.

:warning: BREAKING CHANGES

  • tooltips: Tooltips have been migrated to use Home Assistant tooltips (ha-tooltip) and will now show in the standard Home Assistant style. There must be a button action for toolips to show as they fire off pointer events. Review documentation for impact and updated styling options. Requires Home Assistant 2025.10 and greater.

v9.0.0

:warning::warning::warning: BREAKING CHANGE! READ BEFORE UPDATE :warning::warning::warning:

This release is a major refactoring of the plugin and it changes radically the way to react to entity state changes. If you do not use the entity_settings option, this update should not be a risk for you and you can update safely, but if you use entity_settings keep reading because you will not be able to use this option anymore.

1. Removal of entity_settings

The entity_settings and ignore_entity_settings options have been removed. If you have some entity changes configured you need to migrate them. For example the next code:

kiosk_mode:
  entity_settings:
    - entity:
        input_boolean.hide_sidebar: 'on'
      hide_sidebar: true
    - entity:
        sensor.hide_header: 'on'
      hide_header: true
    - entity:
        input_text.kiosk: 'true'
      kiosk: true

Needs to be migrated to this one using templates:

kiosk_mode:
  hide_sidebar: '[[[ is_state("input_boolean.hide_sidebar", "on") ]]]'
  hide_header: '[[[ is_state("sensor.hide_header", "on") ]]]'
  kiosk: '[[[ is_state("input_text.kiosk", "true") ]]]'

Optionally, you can also use Jinja templates:

Note: Jinja templates need a WebSocket call to be rendered, it is recommended to use the JavaScript version because it is rendered straightaway. On top of that, JavaScript templates have access to the client, for example, you can use DOM Apis, something that Jinja templates cannot achieve.

kiosk_mode:
  hide_sidebar: '{{ is_state("input_boolean.hide_sidebar", "on") }}'
  hide_header: '{{ is_state("sensor.hide_header", "on") }}'
  kiosk: '{{ is_state("input_text.kiosk", "true") }}'

2. All the options can be booleans or JavaScript / Jinja templates

Excluding ignore_mobile_settings and ignore_disable_km, all the options can be set as a JavaScript or a Jinja template that returns a boolean. If you set the option as a string but it is not a valid template, the library will throw an error. If you set a template and it doesn’t return a boolean, the option will be set as false and a warning will be thrown.

JavaScript template example:

kiosk_mode:
  hide_header: '[[[ user_name === "ElChiniNet" ]]]'
  hide_sidebar: '[[[ is_state("input_boolean.hide_sidebar", "on") ]]]'

Jinja template example:

kiosk_mode:
  hide_header: '{{ user_name == "ElChiniNet" }}'
  hide_sidebar: '{{ is_state("input_boolean.hide_sidebar", "on") }}'

This solves one of the biggest issues that the plugin has: If one wants to configure entity changes for different users or for admins and non-admins the previous entity_settings was not enough because there was a single place to configure entitites changes and it doesn’t take into account users or admin privileges. With this new change it is possible to make something like this:

kiosk_mode:
  ## By default the sidebar will be hidden 
  hide_sidebar: true
  admin_settings:
    ## If the input_boolean.hide_sidebar is off the sidebar will be visible for admins
    hide_sidebar: '[[[ is_state("input_boolean.hide_sidebar", "on") ]]]'
  user_settings:
    - users:
        - "ryan meek"
        - "maykar"
      ## If the input_boolean.hide_sidebar_for_friends is off the sidebar will be visible for ryan meek and maykar
      hide_sidebar: '[[[ is_state("input_boolean.hide_sidebar_for_friends", "on") ]]]'

Note: JavaScript templates use Home Assistant Javascript Templates for the JavaScript templating system. To know all the objects, variables and methods available in the JavaScript templates, consult the proper section in the repository.

Jinja templates will have access to some client side variables that are very useful:

  • user_name: String with the logged user’s name
  • user_is_admin: Bolean value than indicates if the logged user is admin or not
  • user_is_owner: Bolean value than indicates if the logged user is the owner or not
  • user_agent: User agent of the browser in which Home Assistant is being executed

Advantages of using templates for the options

Using templates for the options gives a lot of flexibility and depending on your objectives you can omit the usage of the conditional configs, so when you start to create conditional configurations, ask yourself if it can be achieved with templates. For example:

kiosk_mode:
  hide_sidebar: false
  hide_header: false
  user_settings:
    - users:
      - "ryan meek"
      - "maykar"
      hide_header: true
  non_admin_settings:
    hide_sidebar: true

Can be transformed into a simpler version:

kiosk_mode:
  hide_header: '[[[ ["maykar", "ryan meek"].includes(user_name) ]]]'
  hide_sidebar: '[[[ !user_is_admin ]]]'

3. New debug options

This release brings two new options:

Config Option Description
debug Prints useful information in the console. The raw config loaded from the Lovelace panel, the resulting final config with all the options, and if a template is rendered, it will print the option that trigerred the template, the template code and the evaluated result of it.
debug_template Useful to debug the result of a single template without activating the debug mode.

debug

Example with a valid template

Example with an invalid template

debug_template

Hey did you get the .local issue sorted? I had the same issue and apparently some Android OS versions cannot use .local, I had to change mine to .lan and/or .internal, I used NGINX add-on for this, but I still get issues, works with other devices not an issue but the TSVs well…?

I know this may be a little old, but did anyone ever get “Double Tap to wake screen” to work? Right now I can only wake via the volume buttons (or hardware switches if set). It sounds like Fully Kiosk Browser might be a way around this for HA, but would be nice if it worked at the OS level

My Wifi keeps disconnecting on LineageOS… doesn’t happen on Mattmon’s OS…
even tried with a 2.4only ssid, but same issue :confused:

Waiting for Network Connection…

Would like to follow this example by @pgale, but AFAICT, to flash anything to the TSV requires the EDL flashing tool and following its installation instructions leads to the use of setup.py for ‘install’ and ‘build’. The problem is…

THERE IS NO setup.py.

I am no python expert so this is an insurmountable hurdle. It matters not that I want to do this on a Mac as I could instead use a linux machine, but makes no difference as that file does not exist in the repository and instructions for both OSs specify the use of setup.py.

I have asked repeatedly in EDL’s github discussion/issues but EDL’s author (bkerler) either doesn’t follow issues involving his own program, or simply cannot be bothered to reply and explain why he doesn’t include that apparently essential piece of the installation process. Why bother to write software and offer it to all, but leave out one vital piece.

So right now, this whole exercise has me completely hacked off with incomplete repositories and apparent total lack of care by the author(s).

However, I do want to get my 2 TSVs running something usable for Home Assistant, be that lineage or some other (probably Android) OS. Hence I would really appreciate it if anyone could please explain how to get past this apparently insurmountable hurdle.

Is there perhaps any other software that could be used to flash a different OS to a TSV?

It appears that setup.py is not actually required and edl.py can be used directly to flash the TSVs, which I have now done.

Shame the EDL author didn’t mention that, instead of stating in the installation instructions that setup.py should be used.

Still, got there in the end. :face_with_diagonal_mouth:

Like @pgale I am using Music Assistant, but since it is currently streaming to only AirPlay devices, I thought I’d see if I could make the TSV into an AP receiver. It’s just Android after all.

Having just installed AirReceiver from the Google Play Store, the first TSV is currently playing radio streamed from my Music Assistant server. :slightly_smiling_face:

I took a chance and bought the paid version, but at less than £3 it was worth a shot and if it worked, avoid the potential faff of switching from the Lite trial version.

I also installed the Home Assistant companion app as that is consistent with some iPad based control panels I’m using and which cannot run Fully Kiosk Browser as that’s not available for iOS.

So all in all, pretty pleased with my TSVs.

1 Like