Releases: ubopod/ubo_app
v1.7.0
PyPI package: https://pypi.org/project/ubo-app/1.7.0
Changes:
- feat(audio): add audio sample recorder and player, it can be used to quickly test audio input/output devices
- fix(system): make sure dnsmasq is stopped and disabled when not needed
- refactor(web-ui): request a redraw when connected (previously we were rendering a notification to force a redraw)
- feat(core): add raw image viewer
- fix(core): autorun objects when called directly, wait for the result of the function to be ready in the runner thread before returning it
- feat(file-system): open image files using the image viewer
- refactor(assistant): move constants of assistant service to a separate file
- chore: open app in macos with as an always-on-top window to have terminal behind it by default when stage manager is on and streamline development
- chore: fix minor issues in deploy script
- feat(assistant): enable video_out in our pipecat transport and implement image generation
- refactor(assistant): move rgb reactions to the is_listening changes to the reducer, previously implemented via autorun
- fix(audio): fix audio playback cut off when using pyaudio on non-rpi platforms
- feat(assistant): store state, actions and events as well use ui for selecting assistant engines
- refactor(assistant): implement
UboImageGeneratorServicewhich is a switch service to switch between available image generator services - fix(assistant): improve pipecat service switch mechanism
- refactor(assistant): move selected service sync autorun functions from main.py to
UboSwitch - fix(core): improve force redraw mechanism to guarantee an immediate redraw
- feat(assistant): the assistant can now see the screen content of the pod's display on user demand
- chore(deploy): add deploy script to the ubo-assistant service
- fix(rpc): fix
get_classnot being able to find class names having acronyms in them like,QRCodeInputDescription - refactor(rpc): introduce
AvailableInputDescriptionso that rpc clients can send actions with different types ofInputDescription, previosuly they could only impossibly send abstractInputDescriptionitself - feat(camera): make camera service constantly report its input to the redux bus when viewfinder is open
- feat(assistant): implement tool call for providing camera-feed/display-content-feed to the llm
- refactor(assistant): improve the mechanism of applying
is_listeningchanges to the input transport of the assistant client - feat(keypad): add hold and unhold actions and use them to run assistant anywhere by holding the home key in
- chore: update to pipecat 0.0.84, fixing an issue in image generation flow
- fix(tests): disable external processes in
test_menuas grpc does not load in it - feat(assistant): add support for eleventh lab TTS
- fix(assistant): custom audio resampling to handle multiple input rates
- fix(assistant): move audio event subscriptions to start() to ensure task_manager is initialized
- feat(assistant): add secrets file monitoring to update providers on API key changes
- feat(assistant): add support for Deepgram STT engine
- feat(assistant): add Cerebras LLM integration
- chore(assistant): update wake word handling and visual indicators
- feat(assistant): add AssemblyAI STT engine
- feat(assistant): add Rime TTS engine support
- fix(keypad): fix KeyError issue of microphone mute button
- chore(assistant): seperate tool message from system prompt
- feat(camera): add camera backend with OpenCV and PiCamera2 for MacOS
- feat(camera): add UI for selecting camera index
- feat(assistant): add MCP server management with GUI
- chore(infrared): update codes for small remote
- chore(assistant): code clean up
- refactor(assistant): address lint and typecheck issues
- fix(assistant): bug related to mcp enable status sync
- fix(test): increase MAX_EXPECTED_EVENT_HANDLERS to 70
- fix(test): pyaudio and cv2 mocking issues
- chore(test): update test on device script
- feat(assistant): dynamically update MCP tools used by LLms
- feat(assistant): add support for on-premise Ollama with URL
- refactor(assistant): reduce initialization complexity to address lint issues
- feat(docker): add compose presets and registery path bug fixes
- feat(assistant): update UI after ollama, vosk, piper models are download
- fix(docker): path issues and duplicate monitoring events
- fix(assistant): add type hint for _services in UboSwitchService
- fix(lint): disable complexity check for fetch_image function
- fix(docker): check if composition directory exists for preset installs
- feat(assistant): show mic mute notification when triggered
- feat(assistant): add toggle listening action
- feat(infrared): add SKIP remote assistant toggle key
- fix(docker): improve docker status updates and sync
- fix(envoy): use configurable host for gRPC server in Envoy template
- fix(build): let latest ubo raw bindings package be used.
- feat(boostrap): add PCIe configuration to device setup
- fix(tests): update Docker service initialization flow
- refactor(assistant): migrate to universal LLM context and improve logging
- fix(assistant): improve service switching and tools management
- chore(assistant): update image request handling for pipecat 0.0.92
- fix(wifi): Address WiFi availability at first add action - closes #324
- chore(logging): add debug logging for hardware detection
- feat(docker): show progress for Docker image & composition pulls
- feat(assistant): optimize audio streaming with conditional subscription and zero-frame keepalive
- chore(audio): do not emit audio event when mic is muted
- fix(hotspot): ensure dhcpcd service is properly managed during boot and hotspot configuration
- chore(uv): update uv lock file
- fix(assistant): add back missing icon in speech recognition title
- fix(tests): increase initial wait in test_all_services_register
- docs(readme): update Kickstarter URL and add setup instructions for protobuf and web app
- feat(install): add audio system dependencies for PipeWire and PortAudio
- refactor(docker): replace get_full_image_path helper with full_path property
- refactor(docker): unify container and compose operations
- fix(tests): increase initial wait in test_all_services_register from 3 to 6 seconds
- refactor(docker): pass ContainerEntry object instead of ID to prepare_app and update_composition_metadata
- fix(update_manager): handle missing installation path in get_installed_versions
- fix(docker): enhance progress tracking with service-segmented calculation
- chore(assistant): use generic
dataparam name when multiple items are provided by the selector - fix(grpc): unsubscribe from event handler when grpc stream is closed to prevent memory leak
- fix(assistant): fix issue related to UI not being updated after vosk, piper, ollama models download
- chore(tests): improve pyaudio mocking
- chore(bootstrap): add comment lines for PCIe overlays
- chore(docker): refine Docker container image name matching logic.
- chore(assistant): remove anthropic from packages as it is not yet used
- fix(tests): increase stability retry attempts and wait in test_services
- fix(scripts): address dependency issue with test on device
- fix(docker): unified compositions added by webUI import or compose hardcoded presets
- chore(notification): change dismiss icon and background color
- fix(docker): remove composition directory with elevated privilege special send_command on Pi and double confirm with user.
- fix(ip): restart ping process if it dies
- fix(tests): increase stability wait parameters in test_root_menu_bad_state
- fix(tests): add Docker service readiness checks in test_all_services_register
- feat(display): add screen blanking with backlight control and inactivity timeout
- fix(display): change render skip condition from is_paused to is_blanked and remove unnecessary array copy
- fix(display): replace display-level blanking with Kivy overlay widget
- fix(display): disable screen blanking monitor during tests to prevent interference with screenshots
- fix(tests): set UBO_TEST_ENV environment variable for device tests and improve test result handling
- fix(display): replace time.time() with timezone-aware datetime for activity tracking and update test expectations
- refactor(display): move blank timeout constant from state to constants module
- feat(display): add configurable screen blank timeout with settings menu
- fix(tests): update test snapshots for display settings menu and state changes
- fix(display): wake screen and update activity on assistant voice actions
- fix(display): remove incorrect and redundant keypad wake handler in favor of existing reducer logic
- chore(typecheck): use specific Kivy graphics imports and add keypad state to type hints
- fix(ci): add GitHub API token to Packer build environment to prevent rate limiting
- fix(tests): add unique IDs to update manager notifications
- chore(snapshots): update docker combine_reducers_id in integration test result files
- chore(redux): pin redux version to 0.24.0
- fix(core): interleave action and event processing
- fix(system-manager): add users to sudo group which are created via GUI
- fix(speech-recognition): update UI after VOSK model is downloaded
- refactor(display): avoid inactivity checks when display is already blank
- feat(core): Add scheduler freeze detection and monitoring, enabled by
DEBUG_SCHEDULER - chore(ignore): add Claude-related files and directories to .gitignore
- fix(docker): prevent crash when selecting port items in app menu
- fix(ci): increase lite image size to 6.5GB
- feat(camera): add Arducam IMX519 driver install/uninstall and camera type persistence
- chore(snapshots): update store snapshots for camera driver install menu items and icons changes
- chore(uv): upgrade python-redux and piper-tts packages to the latest version
- chore(assistant): upgrade piper-tts for ubo-assistant
- fix(lint): addressing some lint issues
- fix(redux): use no binary package to include redux_pytest
- feat(eeprom): add FORCE_HARDWARE constant wi...
v1.6.0
PyPI package: https://pypi.org/project/ubo-app/1.6.0
Changes:
- refactor(docker): improve pihole config so that it works out of the box
- refactor(core:rpc): rename
generatedtoubo_bindings, we want to reuse that directory to create a separate python package for the rpc bindings, so that other services can use it without depending on the wholeubo_apppackage - chore(web-ui): add lint command in
package.jsonscripts - build(bindings): add raw-bindings package
- fix(docker): use
127.0.0.1instead ofGRPC_SERVER_HOSTas the docker container sometimes could not connect to the host ip - feat(services): add a mechanism to run external processes as part of ubo services, these processes are supposed to communicate to the ubo-app via gRPC, they have their own installation script (
ubo-setup.shfile in the service directory) and run in a separate virtualenv - refactor(rpc): several improvements in rpc and store types, most importantly, avoid marking all fields as optional in proto files and remove
itemsfromUboPageWidget's constructor - refactor(audio): encapsulate audio sample data in the new
AudioSampledata structure, better support playing streaming sequence of audio sample by guaranteeing sequential playback and reporting when playback is done - feat(assistant): add pipecat in a separate process
- feat(rpc): add secrets rpc service for querying secrets
- feat(core): add a mechanism for services to provide environment variables for their binaries
- refactor(assistant): use the new secret querying service to query google and openai credentials/api-key
- chore: run lint and typecheck for all sub-projects, fix lint issues in rpc and assistant sub-projects
- chore(assistant): move switch services for stt, llm and tts from
main.pyto their respective service files for the sake of better organization - fix(audio): bug causing samples to have wrong number of channels in non-rpi environments
- refactor(assistant): add
UboOutputTransport, a pipecat transport responsible for passing audio output chunks to ubo app to be played, compared to the old method of passing audio chunks inUboTTSServiceit has the benefit of aggregating messages and making sure they are played in the right order - feat(rpc): add
subscribe_storerpc to the grpc api for subscribing to store changes andautoruntoubo_bindingsclient as a convenience method for subscribing to store changes for clients like theautorunin the store of the main app - feat(assistant): add openai setup logic
- feat(assistant): add segmented google stt pipecat service, to avoid paying for silence, normal google stt is still an option user can switch to in
UboSTTService - chore: migrate reducers to
match/casesyntax - feat(assistant): introduce
AssistantStartListeningActionandAssistantStopListeningActionfor explicit control over pipecat listening state, assign keyboard's "v" key press/release to these actions - docs: improve
README.mdwith more details about installing web app dependencies - feat: return unsubscribe function from streaming grpcs
autorunandsubscribe_eventmethods and use it inubo_input_transportto unsubscribe from the audio events stream when it should not be listening instead of getting them and ignoring them - refactor(audio): use an open
alsaaudio.PCMfor streaming audio inplay_sequence - fix(wifi): extend regex pattern to fix compatibility with some codes
- fix(infrared): set ir receiver device index correctly
- feat(rgb-led): add support for
rgb-ledring on Pi 5 - fix(web-ui): bug related to
fileMapin docker compose form - fix(docs): correct wrong doc strings
- feat(infrared): trigger voice assistant with ir remote
- feat(assistant): show rainbow pattern on led ring when listening
- feat(keypad): make assistat listen when back key is pressed down on home
- feat(deploy): install service wheels after
scpinto device - chore(assistant): updating
piperandpipecatversions - chore(docs): update
README.md
Note than GitHub doesn't allow assets bigger than 2GB in a release. Due to this, the files bigger than 2GB have been split into 2GB chunks. You can join them using the following command:
cat [[filename]]_* > [[filename]]v1.5.0
PyPI package: https://pypi.org/project/ubo-app/1.5.0
Changes:
- refactor(core): use the latest version of
python-reduxand override the_create_taskmethod of our customAutorunclass to make sure async autorun tasks run in service threads of their respective services - feat(speech-recognition): add assistant logic, report voice and text recorded since
ASSISTANT_WAKE_WORDwas detected until theASSISTANT_END_WORDis detected, and add a menu item to enable/disable the assistant - closes #304 - feat(assistant): add assistnat service
- feat(speech-recognition): add intents for creating wifi connections and activating/deactivating the assistant
- fix(tests):
stabilitynot passingattemptstowait_for, making it basically wait forever - refactor(core): do not default the log level of services to the
get_log_level, useINFOas the default log level for services - fix(core): logger not logging repeated primitive type instances in extra
- refactor(core): add optional
namefield tocreate_task,coroutine_runnerand friends - fix(core): fix some issues in rpc serialization of enums and lists in ubo-store objects
- refactor(web-ui): use rpc serialization instead of json for transferring data from web-ui server to its client, and add regular-expression to file inputs
- feat(core): add
AsyncEvictingQueue, a queue that evicts the oldest item when it reaches its maximum size, it is to be used in sound processing for buffering - refactor(audio): add
sample_speech_recognitiontoAudioReportSampleEvent(renamed fromAudioReportAudioEvent) to report audio samples in a format appropriate to be consumed by speech recognition engines - refactor(speech-recognition): abstract the speech recognition engine interface with
voskas the first implementation of it - close #310 - refactor(speech-recognition): understand the assistant end phrase even when it is stated right after and in continuation of the speech
- refactor(core): add
ToThreadOptionsfor the purpose of passingcallback,nameandcorountine_runnertoubo_app.async_.to_thread, removeubo_app.async_.to_thread_with_coroutine_runneras it is no longer needed - refactor: reorganize secret keys and the name of constants holding them to be more consistent
- feat(speech-recognition): add google cloud as a speech recognition engine, add a menu item to select the speech recognition engine, and add a menu item to set the google cloud credentials - closes #311
- refactor(ci): drop dependencies jobs and put
uv syncwherever needed, sinceuvis so fast compared to our old dependency managerpoetry, it is not worth the effort to have a separate job for it - fix(system-manager): better handle
Noneoutput of handlers in response tosend_command - refactor: replace
default_factorywithdefaultwhenever possible so thatdefault_providercan be used - refactor(core): improve importing modules in service threads, making it almost identical to python environment, at the cost of patching
importlib._bootstrap._find_and_load_unlocked - refactor(speech-recognition): move the
BackgroundRunningMixinandNeedsSetupMixinabstractions to the core as other modules can use them too - refactor(core): add
mappertoread_from_persistent_storeto map the read string into the object, add support for enums inUboStore.load_object - fix(core): switch to
packaging.versionfor parsing Python package versions to ensure PEP 440 compliance instead of usingsemver - refactor(assistant): add abstractions for assistant module extending engine abstractions in the core and reimplement the service based on these abstract base classes
- feat(assistant): implement google engine for assistant service using google cloud vertexai - closes #312
- feat(notifications): support unlimited notification actions with a "more" button for overflow
- refactor(core:input): generalize
ubo_input's api to allow more input methods - feat(file-system): add
InputMethod.PathSelectoras a new input method, showing a file navigation menu to select a file or directory - closes #301 - feat(file-system): add file system operations copy, move, and remove - closes #300
- fix(wifi): hotspot initialization issue on bare Raspberry Pi, not able to interact with the pod to select the input method
- fix(web-ui): show a notification when web ui is connected, this is a workaround to emulate a redraw in the display render stream events in the bus
Note than GitHub doesn't allow assets bigger than 2GB in a release. Due to this, the files bigger than 2GB have been split into 2GB chunks. You can join them using the following command:
cat [[filename]]_* > [[filename]]v1.4.0
PyPI package: https://pypi.org/project/ubo-app/1.4.0
Changes:
- test: improve test logs in the ci
- refactor(docker): since service setup functions are now run after reducers are initialized, we don't need to pass the signal for loading docker applications through the docker reducer
- refactor(voice): make the menu
Itemparameters like icon and background color, used to show it's selectable and selected/unselected reusable by putting them inubo_app/utils/gui.py - feat(services): add log level selection sub menu to each service menu and sync it with persistent storage - closes #164
- test(services): set limits for the number of registered listeners and event handlers after all services are loaded in
test_all_services_register - refactor(core): wait for all service threads to join before running cleanup functions for dbus connections and the logger
- feat(services): apply log levels set in service settings for each service using
logging.Filter - feat(ci): make the build job fail if grpc bindings are not up to date with code
- refactor(core): move pod-id generation logic to
set_pod_idand "unseed" the seeded random after generating pod id - refactor(services): make sure services do not do anything, including importing their
setup.pywhich can potentially run code in its module scope, by movingregister_reducer(reducer)write after reducer import, beforeinit_serviceis imported - chore(scripts): add
--indexfordevice:poe scripts, allowing deployment and tests on multiple devices without the need to constantly changeubo-development-pod - chore: housekeeping, update dependencies, remove unused code, etc
- feat(infrared): add infrared service with settings menu to enable/disable propagating keypad actions as ir commands and receiving ir commands and translating them to keypad actions - closes #160
- refactor(speech-synthesis): rename
voiceservice tospeech_synthesisto make room for a separatespeech_recognitionservice - refactor(core): make
log_processreport errors for the service usingreport_service_errorand some general housekeeping - refactor(vscode): use data dir as reported by
platformdirs.user_data_pathto store downloaded assets like vscode binary - feat(speech-recognition): add
speech-recognitionservice with settings menu to download the vosk model and activate/deactivate the listener - closes #284 - refactor(rgb-ring): add
RgbRingSequenceAction, addas_commandto allRgbRingCommandActions - feat(speech-recognition): implement wake word detection, the wake word can be set with
UBO_WAKE_WORDenvironment variable, the default ishey pod- closes #284 - chore(rpc): remove protobuf files and generated code from the repository, they are now generated in ci/cd pipeline and added to the package and iso files.
- refactor(speech-recognition): support multiple actions in an intent
- fix(core): update headless_kivy to the latest version, it should fix the glitches on the display and the web-ui - closes #275
- refactor(infrared): replace
adafruit-ir-remotewithir-keytableto lower CPU usage and improve code compatibility - fix(web-ui): add the missing read command for the file input values in html forms
- docs: update README.md to add instructions for generating protobufs, web static assets, and running typecheck
- refactor(core): use the new
StoreOptions.autorun_classofpython-reduxto make sure they run in the service thread they were defined in - closes #286 - fix(audio): use
tenacityfor retry logic and add a one second delay between retries when playback fails - fix(installation): gracefully handle missing file in sed command with || true - closes #281
- refactor(audio): make setter functions in audio manager try finding card index again and rebind in case of failure
- refactor(core): organize debug environment variables and add
UBO_DEBUG_PDB_SIGNALto settings menu of the gui and make debug flags set in the settings menu persistent - refactor(speech-synthesis): remove piper model from repository and provide download menu item for it - closes #165
- fix(system): add an
asyncio.sleepto the read loop to avoid high cpu usage - refactor(system): allow
send_commandto stay alive and stream responses over time to the client, useful for infrared service for example - fix(core): postpone touching
app_readysignal file until all services' setup functions are done - fix(audio): the volume bar sometimes not being in sync with playback volume
- feat(core): let the user upgrade/downgrade to any of the last three release versions, add a menu item in settings to enable beta upgrade/downgrade to beta versions - closes #260, closes 178
- feat(core): let the user activate a version among their installed versions in a sub-menu of the about menu
- refactor(core): refetch pypi index whenever user opens the about menu - with debouncing
- fix(core): use latest ubo-gui which adds bad-state-recovery for when menu-screen doesn't update - closes #235
- chore(ci): rename
ubo-podrunner label toubo-pod-pi4for clarity - refactor(core): replace uuid4 with service path as the unique identifier of ubo services
- refactor(core): introduce
utils.dataclass.default_providerand use it wherever we had that duplicated code for setting the default value of a dataclass field based on other fields - refactor: replace all
ApplicationItems with the newUboApplicationItem, not storing the mutablePageWidgetclasses in the store, an step towards implementing #261 - feat(file-system): add
file-systemservice with readonly features like navigation through file-system, checking size/permission/owner/group of files and directories, and reading files - closes #299 - refactor: improve type stubs for kivy app by only providing stubs for pyx files and making
Widgetuse correctEventListenerbase and fix type errors coming to surface - refactor(core): make
get_eeprom_datareturn a default value instead ofNoneif there is an issue in procuring the data - refactor(docker): remove sync wrapper functions around async actions and make the action directly async as it is run by
subscribe_eventand it supports async functions, general housekeeping for docker service - fix: separate
has_outputandhas_output_streamto fix the oldsend_commandcallers being broken with the newsend_commandimplementation - feat: add a menu item in settings for installing/reinstalling the wm8960 driver
- refactor: use
application_registryinOpenApplicationandCloseApplicationactions and events to move towards avoiding mutable objects in the store bus as part of #261 - chore(installation): add some checks to the
install.shscript to make sure it is run on a supported platform and with the right python version, also run parts of it conditionally based on the platform
Note than GitHub doesn't allow assets bigger than 2GB in a release. Due to this, the files bigger than 2GB have been split into 2GB chunks. You can join them using the following command:
cat [[filename]]_* > [[filename]]v1.3.0
PyPI package: https://pypi.org/project/ubo-app/1.3.0
Changes:
- fix: remove dependencies of
publishjob ofpublish_to_pypiworkflow - fix: vscode binary now needs to be instructed about the location of the binary with
version usesub-command - closes #217 - fix: image size being too big for the lite version of the raspberry os
- fix: restart avahi-daemon after the hostname is set in
ubo-system - feat: add support for
sets anddicts for rpc api - feat:
{{hostname}}, as a template variable, will be replaced with the hostname of the device whenever used intitleandcontentproperties of aNotificationinstance or in thetext,picovoice_textorpiper_textproperties of aReadableInformationinstance. - refactor: minor improvements like add
volumetoAudioPlayAudioEvent, metric'sdensityof kivy toDisplayRenderEventandDisplayCompressedRenderEvent, some housekeeping in syntax, logs and ci/cd scripts - refactor: to make it easier for other modules to interact with docker containers and compositions, there is now a store action for each interaction and now they run as side effects of those store actions dispatched to the store, instead of directly calling functions
- feat(web-ui): implement react web application for the web-ui service - closes #224
- refactor(web-ui): use mui dialogs for input demands - closes #224
- chore(web-ui): add linting and formatting to the web application code - closes #224
- refactor(web-ui): use webaudio for audio playback in the web application and add an unmute button - closes #224
- feat(web-ui): add side buttons layout, and handle swipe gestures for the web application - closes #224
- feat(web-ui): add dark-mode support for layout buttons and add color scheme switch buttons - closes #224
- fix(web-ui): provide input field for when there is no
fieldsnorpatternin theInputDescription - refactor(voice): upgrade
access_keyinput to use the newfieldsvalue of theInputDescription - refactor(web-ui): use the same mui interface in static server too (instead of jinja-rendered interface) and add action buttons for all status reported by server - closes #224
- fix(rpi-connect): use
with_stateof the latest python-redux version instead ofviewto avoid memoization of actions - closes #248 - refactor(core,audio,display,keypad,sensors): read and check content of eeprom to determine if a device/service should be initialized or not - closes #223, #closes #249
- fix(core): improve syntax of
str_to_bool, removing all unnecessary== 1postfixes - feat(core): implement services menu in settings for controlling services - closes #4, closes #226
- feat(core): store services configuration into and read them from the persistent store
- refactor: use the new subscriptions return value of the
setupfunction for different services to report subscriptions so that the service manager can clean up the subscriptions when the service is stopped - fix(core): remove the reference of the async task handle after it is done to avoid memory leaks
- feat(core): clean up status icons of a service when it stops
- refactor(tests): make different parts of code explicitly return their cleanup functions and make test_services wait until all services are completely loaded without any errors plus small improvements to logs
- chore(lint): update ruff to the latest version and update codebase to be compatible with it
- build(installation): remove the line in install.sh uninstalling
RPI.GPIOas it is no longer needed with the latest release of adafruit-blinka - build(installation): remove the raspberry pi's ssh daemon banner warning about setting a valid user
- refactor(core): make
subscribe_eventcreated in services, run the handler in the event loop of the service instead of the event loop of the main thread - closes #226 - refactor: add
ubo_app.colorsand move hardcoded color codes to it - feat: add menu switch for service threads to enable/disable auto-run and auto-rerun of services - closes #227
- build(install): avoid swallowing stdout of the
pip installcommand in theinstall.sh, lock onnxruntime to 1.20.1, related: microsoft/onnxruntime#23957 - test: improve cleanup and add explicit wait for loaded services to unload at the end of
test_servicestest - feat(core): add a barrier for services after they register their reducer, they will pass it only when the rest of them have registered their reducer - closes #163
- refactor(core): replace
kivy.clock.Clock.create_triggeras the scheduler of the store with a new in house implementation of a scheduler usingasynciorunning in a separate thread and multiple improvements in resource cleanup, test utilities to ensure tests are reproducible and don't fail randomly - docs: add a section for adding new services, mentioning general patterns, to avoid common mistakes
- refactor(core): better handle circular references in formatting log messages
- fix(core): wrap
callbackcall of the scheduler intryto avoid the scheduler stopping when an exception is raised in its thread - refactor(docker): make docker container menus load even if
ipservice is not available - test: mock
has_gatewayand better mocksend_commandto make it returndoneinstead ofConnectedwhen the command is notconnection - refactor(core): use latest version of
python-reduxandubo-guiand remove all@mainthreaddecorators for actions on the menu asubo-guinow takes care of running them in the main thread itself - fix(core): improve resource cleanup of service threads so that they can be restarted after being stopped
- refactor(core): defer attaching the main reducer to the root reducer using
CombineReducerRegisterActionto avoid circular imports or sacrificing the purity of reducers. - fix(core): add cleanup for gpio pins including display pins and run
gpiozero.devices._shutdownas part of the cleanup process - test: wait for scheduler to completely stop before stopping the kivy app to make sure no
kivy.clock.Clockevent gets scheduled after the app is stopped - fix(core): add display cleanup for raspberry pi 4 as adafruit uses
RPi.GPIOin pi 4 instead oflgpiowhich it uses for pi 5 and we already have a cleanup for it - test: add
UBO_TEST_INVESTIGATION_MODEto enable advanced and costly tools like recording stack-trace ofcells, generating dependency graph usingobjgraphand running pdb session when memory leak is found to better investigate memory leaks - test: move all dbus custom interfaces in
ubo_app.utils.dbus_interfacesand preserve it in test cleanup, this is due to sdbus having a hidden mapping of dbus interfaces to their implementations in the C code and it doesn't clean up the mapping when the interface is removed - refactor: avoid using
Clock.schedule_intervaland replace it withasyncio.sleepin services needing to periodically run a function - test: add
test_menu, as the first in a category of tests purposed to reproduce rare and hard-to-reproduce bugs: these tests run a few times normally, but whenUBO_TEST_INVESTIGATION_MODEenvironment variable is set, they repeat the expected reproduction steps thousands of times until the bug is reproduced, and then run a pdb session for investigation - refactor(services): better error representation containing more content in a single page
- fix(sensors): explicitly set the
light_integration_timefor the light sensor - closes #269 - fix(core): add
task_runnerparameter toasync_.create_taskand use it withasync_.get_task_runnerin store event handlers instead of directly calling the task runner to make sure a reference to tasks are stored in the memory until they are finished, handle byasync_.create_task- closes #247, closes #266 - chore: update pyright and fix/silent newly reported type errors
- fix(core): improve
has_gatewayutility function to ignore default routes with local scope - closes #251 - fix(display): decrease baudrate from 70,000,000 to 60,000,000 to avoid residual noise on the display - closes #236
- fix(web-ui): don't interpret keys pressed outside the
#web-app-root, or keys pressed onHTMLInputElement,HTMLTextAreaElement,HTMLSelectElementandHTMLButtonElementas interactions with the pod - fix(system): make system process completely exit when it's done so that systemd can restart it, the exit used to get blocked by the
check_connectionthread, also make it not exit simply because a client sends an empty datagram, the client may have crashed but system process doesn't need to exit - closes #272 - refactor(ip): remove python-ping package and the connection monitoring code in the system-manager, use system ping command instead, this is because none of the python packages providing ping functionality are actively maintained and ping command has the benefit of not needing to run as root, lowering the communication traffic between the system process and the main process - closes #267
- refactor(core): move setting gpio 17 to
config.txtso that it happens on boot and remove it fromhardware_initialization - refactor(core): make the scheduler compensate for the time it took to run the last scheduled event, by waiting less time in the next scheduled event, also sync its frequency with the frequency of the display updates
- feat(core): handle system signal
USR1as the signal to initiateipdbonly ifDEBUG_MODE_PDB_SIGNALis set - refactor(system): improve the user experience of the reset button, add a pattern for restarting the app without killing it
- refactor(core): add unified API to access “current service” via thread-local, parent thread, or call stack
- refactor(core): better representation of errors in logs and service menus
- fix(ip): make sure the connection status is set to not-connected when ping is not generating any output
- refactor(services): avoid silencing caught exceptions in services by either reraising them so that they are caught and...
v1.2.2
PyPI package: https://pypi.org/project/ubo-app/1.2.2
Changes:
- fix: temperature sensor is on 0x48, not 0x44
Note than GitHub doesn't allow assets bigger than 2GB in a release. Due to this, the files bigger than 2GB have been split into 2GB chunks. You can join them using the following command:
cat [[filename]]_* > [[filename]]v1.2.1
PyPI package: https://pypi.org/project/ubo-app/1.2.1
Changes:
- fix: tenacity is now a production dependency
- chore: add pypi publish and automatic release github workflows
Note than GitHub doesn't allow assets bigger than 2GB in a release. Due to this, the files bigger than 2GB have been split into 2GB chunks. You can join them using the following command:
cat [[filename]]_* > [[filename]]v1.2.0
PyPI package: https://pypi.org/project/ubo-app/1.2.0
Changes:
- chore: add
log_async_processto log the output of an async processes in a notification if they don't run successfully - refactor(core): housekeeping: rename
extra_informationtoqr_code_generation_instructionsinubo_input, add.tmplextension for extension files, usetextareaforLONGinput field type in web dashboard, rename..._HOSTenv variables to..._ADDRESS, use underscore thousand separators for big numbers in codebase - feat(docker): support docker compositions and add a way to import
docker-compose.ymlfiles - feat(docker): add instructions and icon for docker compositions
- refactor(core): rerender screen when rendering on the display is resumed like when returning from viewfinder to avoid artifacts
- refactor(docker): make composition menus responsive: showing spinner, etc
- fix: pass raw bytes to
DisplayRenderEventandDisplayCompressedRenderEventto avoid encoding issues - fix: add ".local" to hostname in users menus - closes #134
- fix: use stdout instead of stderr for reading rpi-connect process output - closes #174
- feat: hold update until the app creates a file signaling it is loaded - closes #177
- feat: setup a wifi hotspot for when the a web-ui input is demanded and the device is not connected to any network - closes #169
- feat: let the user upload directory content of the docker composition they are creating - closes #202
- feat: use
pod_idas the ssid of the wifi hotspot - feat: add dark mode for web-ui
- docs: update development documentation
- feat(web-ui): automatically run the wifi creation procedure when there is no ssid saved in the network manager and no default gateway is set - closes #214
- feat(web-ui): use captive portal in the hotspot started by web-ui - closes #211
- fix(core): an issue where a tuple of lists where passed as active_inputs instead of a list due to an unwanted comma - closes #212
- fix(core): high cpu usage due to the while loop going non-blocking when the ping raised an exception - closes #216
- feat(core): add a utility function to apply templates to filesystem based on a templates directory, while taking backups of the original files and another utility function to restore the backups
- fix(web-ui): run
iw wlan0 set power_save offbefore running hotspot to avoid the soft block - closes #222 - refactor(ci): use new github runner arm images for building images
- feat(web-ui): add
ubo-redirect-serverservice - refactor(web-ui): add notifications for when starting/stopping the hotspot fails in the system manager
- refactor(web-ui): move starting/stopping of the required hotspot system services to the
ubo-hotspotservice (the more general version of theubo-redirect-serverservice which runs the redirect server as its main process.) - fix(core): uninstall RPi.GPIO after installing python packages in
install.shrelated: adafruit/Adafruit_Blinka#910 - closes #231 - fix(web-ui): avoid web-ui stop procedure being triggered when qr-code input is cancelled
- fix(system): run
time.sleepfor both branches of the ping loop (success and failure) to avoid high cpu usage of the system process - fix(camera): avoid values read from qrcode being overridden by
Nonevalues of alternative patterns - closes #230 - fix(wifi): wait a few seconds before creating the wifi connection if the provided input result has the input method
WEB_DASHBOARD- closes #230 - fix(wifi): set
network_manager.wireless_enabledfor when hotspot is being turned off and also before creating a wifi connection and before connecting to a wifi network - closes #230 - fix(keypad,sensors): retry i2c initializations - closes #234
- fix(wifi): make
get_saved_wifi_ssidsreturn empty list in non-rpi environments
Note than GitHub doesn't allow assets bigger than 2GB in a release. Due to this, the files bigger than 2GB have been split into 2GB chunks. You can join them using the following command:
cat [[filename]]_* > [[filename]]v1.0.0
PyPI package: https://pypi.org/project/ubo-app/1.0.0
Changes:
- hotfix(users): do not mark the generated password as expired as it will cause boot failures as the os can't autologin into the ubo user when its password is expired
- hotfix(core): render blank screen on the display when
FinishEventis dispatched (makes sure display is clean after powering off)
Note than GitHub doesn't allow assets bigger than 2GB in a release. Due to this, the files bigger than 2GB have been split into 2GB chunks. You can join them using the following command:
cat [[filename]]_* > [[filename]]v0.17.1
PyPI package: https://pypi.org/project/ubo-app/0.17.1
Changes:
- feat(display): add
DisplayCompressedRenderEventas a compressed version ofDisplayRenderEvent - feat(rpc): add reflection to rpc server, limited to root service, but good enough for health checking purposes
- refactor(rpc): preserve the order of fields of
oneofdeclarations generated forUniontypes - refactor(audio): convert
AudioPlayChimeEvents toAudioPlayAudioEvents instead of directly playing the chime - feat(rpc): add
UBO_GRPC_LISTEN_HOSTandUBO_GRPC_LISTEN_PORTenvironment variables - fix(docker): make sure the
image_menuview - used nested in an autorun - is re-called when ip addresses are provided
Note than GitHub doesn't allow assets bigger than 2GB in a release. Due to this, the files bigger than 2GB have been split into 2GB chunks. You can join them using the following command:
cat [[filename]]_* > [[filename]]