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.
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?
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.
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
BREAKING CHANGE! READ BEFORE UPDATE
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_settingsoption, this update should not be a risk for you and you can update safely, but if you useentity_settingskeep reading because you will not be able to use this option anymore.1. Removal of
entity_settingsThe
entity_settingsandignore_entity_settingsoptions 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: trueNeeds 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
Jinjatemplates:Note:
Jinjatemplates need a WebSocket call to be rendered, it is recommended to use theJavaScriptversion because it is rendered straightaway. On top of that,JavaScripttemplates have access to the client, for example, you can use DOM Apis, something thatJinjatemplates 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/JinjatemplatesExcluding
ignore_mobile_settingsandignore_disable_km, all the options can be set as aJavaScriptor aJinjatemplate 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 asfalseand 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_settingswas 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:
JavaScripttemplates use Home Assistant Javascript Templates for theJavaScripttemplating system. To know all the objects, variables and methods available in theJavaScripttemplates, consult the proper section in the repository.
Jinjatemplates will have access to some client side variables that are very useful:
user_name: String with the logged user’s nameuser_is_admin: Bolean value than indicates if the logged user is admin or notuser_is_owner: Bolean value than indicates if the logged user is the owner or notuser_agent: User agent of the browser in which Home Assistant is being executedAdvantages 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: trueCan 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 debugPrints 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_templateUseful to debug the result of a single template without activating the debugmode.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 ![]()
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. ![]()
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. ![]()
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.


