Ubo main app, running on device initialization. A platform for running other apps.
Project description
🚀 Ubo App
🌟 Overview
Ubo App is a Python application for managing Raspberry Pi utilities and Ubo-specific features.
Example screenshots:
🚧 Disclaimer
Be aware that at the moment, Ubo app sends crash reports to Sentry. Soon we will limit this to beta versions only.
⚙️ Notable Features
- Headless WiFi on-boarding with QR code
- Easy headless remote access with SSH and VS Code tunnel
- Install and run Docker apps headlessly
- Access and control basic RPi utilities and settings
- gRPC API for remote control - find sample clients here
📋 Requirements
Ubo app is developed to run on Raspberry Pi 4 and 5. The experience is optimized around Ubo Pod which offers
- a minimal LCD display and GUI with a keypad
- stereo microphone and speakers,
- camera
- LED ring
- sensors
The app functions even if some of these hardware elements are not provided, however some of the features that rely on these hardware components may not function. For example, WiFi onboarding with QR code requires a camera onboard.
📦 Installation
Pre-packaged image
Ubo Pod ships with a pre-flashed MicroSD card that has the app installed on it by default.
If you don't have it, or you just want to set up a fresh device, then:
- download one of the images from the release section
- Use Raspberry Pi Images and choose
custom image
to provide the download image file. - Write to the image
- Use the image to boot your Ubo Pod or Raspberry Pi
This is the fastest, easiest, and recommended way to get started with Ubo App.
Install on existing OS
If you want to install the image on an existing operating system, then read on. Otherwise, skip this section.
⚠️ Executing scripts directly from the internet with root privileges poses a significant security risk. It's generally a good practice to ensure you understand the script's content before running it. You can check the content of this particular script here before running it.
To install ubo, run this command in a terminal shell:
curl -sSL https://raw.githubusercontent.com/ubopod/ubo-app/main/ubo_app/system/install.sh\
| sudo bash
If you want to install docker service and configure ubo to be able to use it run this:
curl -sSL https://raw.githubusercontent.com/ubopod/ubo-app/main/ubo_app/system/install.sh\
| sudo WITH_DOCKER=true bash
To allow the installer to install the latest alpha version of ubo run this:
curl -sSL https://raw.githubusercontent.com/ubopod/ubo-app/main/ubo_app/system/install.sh\
| sudo ALPHA=true bash
# or
curl -sSL https://raw.githubusercontent.com/ubopod/ubo-app/main/ubo_app/system/install.sh\
| sudo ALPHA=true WITH_DOCKER=true bash
Note that as part of the installation process, these debian packages are installed:
- accountsservice
- dhcpcd
- dnsmasq
- git
- hostapd
- i2c-tools
- libasound2-dev
- libcap-dev
- libegl1
- libgl1
- libmtdev1
- libzbar0
- python3-alsaaudio
- python3-apt
- python3-dev
- python3-gpiozero
- python3-libcamera
- python3-picamera2
- python3-pip
- python3-virtualenv
- rpi-lgpio
Also be aware that ubo-app only installs in /opt/ubo
and it is not customizable
at the moment.
🤝 Contributing
Contributions following Python best practices are welcome.
ℹ️️ Conventions
- Use
UBO_
prefix for environment variables. - Use
ubo:
prefix for notification ids used in ubo core and<service_name>:
prefix for notification ids used in services. - Use
ubo:
prefix for icon ids used in ubo core and<service_name>:
prefix for icon ids used in services.
Development
Setting up the development environment
To set up the development environment, you need to have uv
installed.
First, clone the repository (you need to have git-lfs installed):
git clone https://github.com/ubopod/ubo_app.git
git lfs install
git lfs pull
Then, navigate to the project directory and install the dependencies:
uv sync --dev
Now you can run the app with:
HEADLESS_KIVY_DEBUG=true uv run ubo
Run the app on the physical device
Add ubo-development-pod
host in your ssh config at ~/.ssh/config
:
Host ubo-development-pod
HostName <ubopod IP here>
User pi
⚠️Note: You may want to add the ssh public key to the device's authorized keys (~/.ssh/authorized_keys
) so that you don't need to enter the password each time you ssh into the device. If you decide to use password instead, you need to reset the password for Pi user first using the GUI on the device by going to Hamburger Menu -> Settings -> System -> Users and select pi user
Then you need to run this command once to set up the pod for development:
uv run poe device:deploy:complete
After that, you can deploy the app to the device with:
uv run poe device:deploy
To run the app on the device, you can use either of these commands:
uv run poe device:deploy:restart # gracefully restart the app with systemctl
uv run poe device:deploy:kill # kill the process, which will be restarted by systemd if the service is not stopped
Running tests on desktop
Easiest way to run tests is to use the provided Dockerfile
s. To run the tests in a container, you first need to create the development images by running:
uv run poe build-docker-images
Then you can run the tests with:
docker run --rm -it --name ubo-app-test -v .:/ubo-app -v ubo-app-dev-uv-cache:/root/.cache/uv ubo-app-test
You can add arguments to the pytest
command to run specific tests like this:
docker run --rm -it --name ubo-app-test -v .:/ubo-app -v ubo-app-dev-uv-cache:/root/.cache/uv ubo-app-test -- <pytest-args>
For example, to run only the tests in the tests/integration/test_core.py
file, you can run:
docker run --rm -it -v .:/ubo-app -v ubo-app-dev-uv-cache:/root/.cache/uv -v uvo-app-dev-uv-local:/root/.local/share/uv -v ubo-app-dev-uv-venv:/ubo-app/.venv ubo-app-test
To pass it command line options add a double-dash before the options:
docker run --rm -it -v .:/ubo-app -v ubo-app-dev-uv-cache:/root/.cache/uv -v uvo-app-dev-uv-local:/root/.local/share/uv -v ubo-app-dev-uv-venv:/ubo-app/.venv ubo-app-test -- -svv --make-screenshots --override-store-snapshots --override-window-snapshots
You can also run the tests in your local environment by running:
uv run poe test
⚠️Note: When running the tests in your local environment, the window snapshots produced by tests may mismatch the expected snapshots. This is because the snapshots are taken with a certain DPI and some environments may have different DPI settings. For example, we are aware that the snapshots taken in macOS have different DPI settings. If you encounter this issue, you should run the tests in a Docker container as described above.
Running tests on the device
You need to install dependencies with this command once:
uv run poe device:test:deps
Then you can use the following command each time you want to run the tests:
uv run poe device:test
Running linter
To run the linter run the following command:
uv run poe lint
To automatically fix the linting issues run:
uv run poe lint --fix
Running type checker
To run the type checker run the following command:
uv run poe type-check
QR code
In development environment, the camera is probably not working, as it is relying on picamera2
, so it may become challenging to test the flows relying on QR code input.
To address this, the camera module, in not-RPi environments, will try reading from /tmp/qrcode_input.txt
and /tmp/qrcode_input.png
too. So, whenever you encounter a QR code input, you can write the content of the QR code in the text file path or put the qrcode image itself in the image file path and the application will read it from there and continue the flow.
Alternatively you may be able to provide the input in the web-ui (needs refresh at the moment) or provide it by InputProvideAction
in grpc channel.
🔒 License
This project is released under the Apache-2.0 License. See the LICENSE file for more details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file ubo_app-1.2.2.tar.gz
.
File metadata
- Download URL: ubo_app-1.2.2.tar.gz
- Upload date:
- Size: 58.7 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0c440b2b4a096502968deccef3883a19b414fd263e117ad284d1a97a2fc3dda3 |
|
MD5 | b160522136436b011b226beef0983497 |
|
BLAKE2b-256 | b8fce4db089b8466219e7eee9fb6f81e229f87afe359b9e419979247546c8f96 |
Provenance
The following attestation bundles were made for ubo_app-1.2.2.tar.gz
:
Publisher:
integration_delivery.yml
on ubopod/ubo_app
-
Statement:
- Statement type:
https://in-toto.io/Statement/v1
- Predicate type:
https://docs.pypi.org/attestations/publish/v1
- Subject name:
ubo_app-1.2.2.tar.gz
- Subject digest:
0c440b2b4a096502968deccef3883a19b414fd263e117ad284d1a97a2fc3dda3
- Sigstore transparency entry: 174278885
- Sigstore integration time:
- Permalink:
ubopod/ubo_app@3a87f44d648a8e7d72ef12720ea5228a283b4c49
- Branch / Tag:
refs/tags/v1.2.2
- Owner: https://github.com/ubopod
- Access:
public
- Token Issuer:
https://token.actions.githubusercontent.com
- Runner Environment:
github-hosted
- Publication workflow:
integration_delivery.yml@3a87f44d648a8e7d72ef12720ea5228a283b4c49
- Trigger Event:
push
- Statement type:
File details
Details for the file ubo_app-1.2.2-py3-none-any.whl
.
File metadata
- Download URL: ubo_app-1.2.2-py3-none-any.whl
- Upload date:
- Size: 58.8 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | e55c4428f9f8a3cbb014fd313409f3698a0771d777bfd93ee023ccaecaf725fb |
|
MD5 | 0014a41da98c4b488328d6b1a73dff29 |
|
BLAKE2b-256 | 30d5af7ae4a6f164ec9087d1ef4d4716785b15317ad77f276a5b766127aa5335 |
Provenance
The following attestation bundles were made for ubo_app-1.2.2-py3-none-any.whl
:
Publisher:
integration_delivery.yml
on ubopod/ubo_app
-
Statement:
- Statement type:
https://in-toto.io/Statement/v1
- Predicate type:
https://docs.pypi.org/attestations/publish/v1
- Subject name:
ubo_app-1.2.2-py3-none-any.whl
- Subject digest:
e55c4428f9f8a3cbb014fd313409f3698a0771d777bfd93ee023ccaecaf725fb
- Sigstore transparency entry: 174278888
- Sigstore integration time:
- Permalink:
ubopod/ubo_app@3a87f44d648a8e7d72ef12720ea5228a283b4c49
- Branch / Tag:
refs/tags/v1.2.2
- Owner: https://github.com/ubopod
- Access:
public
- Token Issuer:
https://token.actions.githubusercontent.com
- Runner Environment:
github-hosted
- Publication workflow:
integration_delivery.yml@3a87f44d648a8e7d72ef12720ea5228a283b4c49
- Trigger Event:
push
- Statement type: