UPDATED: Automating Unifi WiFi SSID password changes and QR code generation

For me its 50/50, I’m learning and having fun and at the same time users benefit and feedback.

got it. thanks for the info i’ll mess around with it and see how it goes! your code is still essential for the automating of changing the guest password so it’s much appreciated.

@Robban is there a way to access the png(or jpg) of the qr from the integration so it can be displayed however we want?

1 Like

I can’t get this custom component to work. I get error in log and don’t know how to find out what is wrong.

Logger: custom_components.unifi_wifi.coordinator
Source: helpers/update_coordinator.py:353
Integration: Unifi Wifi (documentation, issues)
First occurred: 10:52:00 (1 occurrences)
Last logged: 10:52:00

Authentication failed while fetching klubben319 data: {'meta': {'rc': 'error', 'msg': 'api.err.LoginRequired'}, 'data': []}

Posted here as well:

No idea what that is, but it’s not related at all to the topic of this thread.

Please do. I was digging through your integration for this kind of functionality when I came upon this.

EDIT: I did more reading, found out that the Home Assistant user for Unifi must have admin privileges to enable the QR code - not set as view only. That was the modification I had to make to my system to get it to show up.


Can anyone point me in the direction of how to implement this in the Unifi network integration? I can’t seem to find and documentation that really covers implementing the QR code, nor form looking around through the integration either.

If you mean the QR Code for the Wifi Password it’s a disabled image entity, which you first need to enable in the Unifi Integration menu.

Has anybody figured out an easy way to get the password from that QR Code and display it in a helper entity?

What i want to achive is a Wifi Guest Card on my Dashboard displaying the QR Code (-> image entity) + in clear text the wifi password if the QR Code is not working.

Currently i’m doing this with a shell_command, which is triggered after the last Guest is disconnecting and the regenerate password flow is initiated.
But i don’t know if there is an easier approach

shell_command:

#!/bin/sh
TOKEN=
SAVEDIR=/config/www/pictures/camera
FILENAME=guest-qr.jpg
PW=guest-pw.txt


# GET QR Code as JPG
curl -X GET https://hass.local/api/image_proxy/image.qr_code -H "Authorization: Bearer $TOKEN" --output $SAVEDIR/$FILENAME
sleep 2
# Decode QR Code and extract PW
zbarimg $SAVEDIR/$FILENAME | awk -F ":" '{print $6}' | sed 's/;//g' >> $SAVEDIR/$PW
WIFIPW=$(cat $SAVEDIR/$PW)

generate_post_data()
{
        cat <<EOF
{
        "entity_id": "input_text.guest_password",
        "value": "$WIFIPW"
}
EOF
}
# POST to push PW to HASS Service
curl -X POST https://hass.local/api/services/input_text/set_value -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "$(generate_post_data)"

# CleanUp
rm -rf $SAVEDIR/$FILENAME
rm -rf $SAVEDIR/$PW

Automation:

alias: Refresh Wifi Guest Password
description: ""
trigger:
  - platform: numeric_state
    entity_id:
      - sensor.gast
    for:
      hours: 0
      minutes: 15
      seconds: 0
    below: 1
condition: []
action:
  - service: button.press
    target:
      entity_id: button.gast_regenerate_password
    data: {}
  - delay:
      hours: 0
      minutes: 0
      seconds: 30
      milliseconds: 0
  - service: shell_command.guest_qr_decode
    data: {}
mode: single
1 Like

@Robban , Great work with using the attributes. Always amazes me how people can figure out how to get these templates to work. Its like magic to me sometimes.

I have a question about your entity_picture. Is that a helper defined elsewhere of the qr code already displayed in dashboard view or something like that? I assume that including this would make it publicly available to anyone with the link?? If I am misunderstanding here please tell me.

The QR code is generated in memory and only available through home assistant AFAIK

It is relatively easy to get a screenshot of the QR code using automations. Then I store the SS as .png in /config/www.

From there I also use the QR integration to decode the .png and get the SSID and the password. Then I get those from ESPhome for printing on e-paper.

However, I was wondering…

  1. Since creating a WiFi QR is almost equivalent to writing the WiFi password in plaintext, and since decoding a QR is so easy, is it worth it to make the password a 20-char long string?

  2. Would it not make sense to shorten the password to just 8 or so chars, and expose the guest password as an entity that follows the same enabling behavior as the QR code?

The way I see it, the guest password is there just to prevent a total rando from joining the network while it is enabled. It is not there to provide real access security.

Moreover, if my guest has issues reading the code, typing a 20-char string is a pain, so we’ll end up logging into Unifi, copying the password, and sending it to the guest via WhatsApp or something.

If the password was easily available and it was short, I can just write it next to the QR code on my dashboard/e-paper screen and the guest won’t need tech support if they can’t read the QR for some reason.

Win-win for everyone.

You do you, but I for one will never do any of the things you just suggested. In fact, given what you just wrote, I question the need for you to even have a QR code at all.

We had a PR for that before but decided it would be too sensitive so stated with only the QR Code even though its a fine line in difference

Thanks a lot for taking the time to respond the way you did, Robban.

I’m well aware of the tension and understand why you made that decision.

1 Like

Thank you! That is extremely helpful!

I cannot figure out one thing, though - why do you call the URL with “&state=…”? What is the purpose of that additional parameter?

And this is exactly the reason why I came here… I was trying to automate the password changes, only to find out that the “regenerate_password” sets a password that cannot be found anywhere :slight_smile:

On the one hand, thank you, @Freshhat , for the elegant workaround you posted here!

But on the other hand… come on, we shouldn’t have to jump through such hoops to get a password that we have just set ourselves!! There should be a way to get that password directly from the Unifi integration.

I read about the privacy concerns, but…

  1. The QR code contains the same data in clear text anyway
  2. The “clear_text_password” can start out as a disabled entity (just like the QR code) - I assume that its contents will not get populated while it is disabled
  3. The people who will choose to enable the entity are the same people who would jump through the above hoops to populate an input_text with the exact same information :slight_smile:

So I am still hoping that there will be a way to access the password directly some day…

Just get it from the actual application you are controlling with the integration…

You are missing the point - the idea is to have the information accessible to another HomeAssistant automation, that can pick up the data and use it.

Unless you can provide a way to do that from an automation, “just go and click on various pages” is not helpful in the context of… well… automation :slight_smile:

I just forward the link to the message. Your have to ask stroo333

1 Like

There is no reason to continue talking about a sensor from the integration to provide the password in clear text. The decision is taken that is too sensitive.

It is perfectly fine to make a custom component of the integrating that provides this sensor. There is even a PR to copy to achieve it so no coding experience is needed.