* Add push to talk voice assistant
* Refactor most code into voice_assistant
* Make voice_assistant the component and remove push_to_talk (can be done in yaml)
* Fix component setup
* Always AF_INET to match serverside
* Fix microphone and media player co-existence
* Format
* Update codeowners
* Update test file
* Fix endifs
* nullptr not NULL
* clang-tidy
* Format
* fixup: Add VA event data
* Generate proto
* Parse and log events
* Add default to switch
* Fix
* Add mic/va to test5
* Move EntityBase Object Id from memory to flash.
* Sprinkler use common `setup_entity` method.
* Remove `EntityBase` from Sprinkler.
* Support for entity names set to None
* change so gh PR picks up commit.
---------
Co-authored-by: Your Name <you@example.com>
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
* Added missing PM_1_0 and PM_10_0 for PMS5003T
Added missing PM_1_0 and PM_10_0 for PMS5003T
* Revert "Added missing PM_1_0 and PM_10_0 for PMS5003T"
This reverts commit 86084f7c61.
* Added tests for PMS5003T
* Added missing PM_1_0 and PM_10_0 for PMS5003T PMS5003ST
* Added missing PM_1_0 and PM_10_0 for PMS5003T
* lint: Trailing whitespace fixed
* tab character removed
* Clang format suggested edit
* Feat: add support for hex color in color component
* Chore: move hex color validator to color component
* Chore: add test
* Chore: fix formatting
* Chore: make linter happy
* Chore: make linter happy
* Fix: parse correct offsets
Co-authored-by: Oxan van Leeuwen <oxan@oxanvanleeuwen.nl>
* Chore: use cv.Invalid
* Fix: remove # because it indicates a comment in yaml
* Fix: only allow hex if no other color value is set
* Fix: tests
* Fix: mutual exclusion of raw and hex colors
* Chore: format file
* Update __init__.py
---------
Co-authored-by: Oxan van Leeuwen <oxan@oxanvanleeuwen.nl>
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
* - Removed cleaning the screen twice.
\Should be handled by `DisplayBuffer::init_internal_();`
- Made ili9341::initalize() protected and renamed
\ it to ili9341::initalize().
- ili9341::initalize() should only init the display
\ and set the width and heigth.
* removed to much
* clang format fixes
* removing trailing underscors for
protected virtual methods
* removed the "override" on display()
* clang fixes
* restored old changes
* Renamed the ili9341 platform to ili9xxx and added
multiple drivers as well. including PR #3848
* fixed most of the clang reported issues
* fixed reported issues
* last fixes
* Setting the right codeowners
* missing changes
* fixed naming Display() method.
* clang again
* clang fix
* fixes reported by @jesserockz & @gpambrozio
* a change to display.py removing an unneeded var
* re-introduce **backlight** option.
* update the ili9488 initialization
* update the ili9488 initialization and fix typo
* fixed typo
* add missing constants
* swap height and width back for the ili9488
* init fixes ili9488
* fixed lint issue
testing the init code
* oeps
* init fixes ili9488
* fixed wrong define
* fixed wrong define again
* removed some spaces
* revert to ili9341
* Remove parts that where used for
the switchplate
* lint fixes and removing unused function
* fix error and introducing 16bit color option
* fix error and introducing 16bit color option
* fix clang issue
* clang fix
* clang issue again
* is this what clang exprect
* clang fix
* clang fix
* try again
* let try again
* and again
* and the last clang fix
* remove the need of wifi
* update dimentions
* update ili8488 init code.
* update dimentions
* allow to change height and width
* dump color mode config
* fix
* fix
* modify logging
* referd back unrelated change
* code formatting commit and moving functions around
* add missing ;
* update code
* update code
* use the correct write_array for sending uint16_t
* fix panic loop
* fix panic loop
* - update the test file
- fixed sending display data
* clang fixes
* clang fixes
* clang fixes again
* remove .gitignore items
* remove .gitignore items
* make sure Update() can can not be called while
called
* clang correction
* adding a test yaml for the ili9341
* Update ili9341 example
* Make test ili9xxx/tests only local
* restore back old ili9341 driver code
* Add a new config for the M5Core
* fix clang request
* reverd to restore of the old ili9341
there is no proper way to say it is depricated.
* Remove the backlight/led pin from the config.
You need to use a proper light platform component
* Ili9488init changes (#88)
Fixed ILI9488 init settings, and adjusted pixel handling code to push pixels in 18 bit format.
This does not change the internal 16-bit representation.
* fixed some leftover clang issues from the merge.
* fixed the slang-tidy request.
* remove `backlight_pin` warning.
---------
Co-authored-by: JD Steffen <jdsteffen81@gmail.com>
* remove unused sensors on pzemdc
* add reset energy action for pzemdc
* fix lint errors
* remove trailing space on pzemdc.h
* make method reset_energy of pzemdc public
* Apply suggestions from code review
---------
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
* Add support for AS7341 spectral color sensor.
* Run clang-format and clang-tidy.
* Post-review changes.
* Apply suggestions from code review
---------
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
* Add support for FS3000 sensor.
* add fs3000 to test yaml
* Clean up code with clang.
* Clean up sensor.py file.
* Update CODEOWNERS file.
* Apply suggestions from code review regarding sensor.py
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
* Apply suggestions from code review for basic issues regarding C++ code
- removed unnecessary default for FS3000Model
- use "this->" before any sensor update
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
* Move model setup to overall setup function.
* Remove unneeded CONF_ID from sensor.py
* Run clang-format
* Move set_model code to header file now that it is simplified
* Update fs3000.h
---------
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This lets downstream components respond to climate configuration
changes, which take place through ClimateCall objects, without also
being notified every time the state changes, which happens every time
the input sensor announces a new value.
FIXES https://github.com/esphome/feature-requests/issues/2136
* Raise errors for all the now deprecated options
* Fix CONF_DEFAULT_PRESET detection
* Stop attempting to set the non-existent normal_config
* Add support for default presets
* Fix correct detection of Two Point temperature mode
* Fix lint issues
* Fix tests
* Generate correct yaml for equivalent configurations
* Remove debug code
* Only set default preset if the thermostat does not have state to restore
* Add restore_default_preset_on_boot option
If set to True then the default_preset will be applied on every boot. If False (Default) state will be restored from memory as per prior versions
* Apply lint suggestions
* Switch from restore_default_preset_on_boot to an enum for startup_behavior
This gives better self-documentation as well as the option for extending to other options down the track
* Lint fixes
* Rename startup_behavior to on_boot_restore_from
This removes any issues with different English locales
* Fix comparable_preset yaml output alignment
* Add dump of on_boot_restore_from setting
Co-authored-by: Keith Burzinski <kbx81x@gmail.com>
Currently, in each loop during DisplayBuffer::update_() the display is
cleared by calling DisplayBuffer::clear().
This prevents more efficient display usages that do not render the
screen in each loop, but only if necessary. This can be helpful, for
example, if images are rendered. This would cause the loop time to be
exceeded frequently.
This change adds a new optional flag "auto_clear" that can be used to
control the clearing behavior. If unset, the DisplayBuffer defaults to
enabled auto clearing, the current behavior and thus backward compatible.
This flag applies to displays that use DisplayBuffer.
Example excerpt:
globals:
- id: state
type: bool
restore_value: no
initial_value: "false"
- id: state_processed
type: bool
restore_value: no
initial_value: "false"
switch:
- platform: template
name: "State"
id: state_switch
lambda: |-
return id(state);
turn_on_action:
- globals.set:
id: state
value: "true"
- globals.set:
id: state_processed
value: "false"
turn_off_action:
- globals.set:
id: state
value: "false"
- globals.set:
id: state_processed
value: "false"
display:
- platform: ili9341
# ...
auto_clear_enabled: false
lambda: |-
if (!id(state_processed)) {
it.fill(COLOR_WHITE);
if (id(state)) {
it.image(80, 20, id(image1));
} else {
it.image(80, 20, id(image2));
}
id(state_processed) = true;
}
Co-authored-by: Tim Niemueller <timdn@google.com>
- Fixed endianness bug on tcs34725 data read
- Fixed lux adjustments based on gain, integration time and GA factor
- Added glass attenuation factor to allow using this sensor behind
semi transparent glass
Co-authored-by: Razorback16 <razorback16@users.noreply.github.com>
* Renamed Nameable to EntityBase (cpp)
* Renamed NAMEABLE_SCHEMA to ENTITY_BASE_SCHEMA (Python)
* Renamed cg.Nameable to cg.EntityBase (Python)
* Remove redundant use of CONF_NAME from esp32_touch
* Remove redundant use of CONF_NAME from mcp3008
* Updated test
* Moved EntityBase from Component.h and Component.cpp
* Added icon property to EntityBase
* Added CONF_ICON to ENTITY_BASE_SCHEMA and added setup_entity function to cpp_helpers
* Added MQTT component getters for icon and disabled_by_default
* Lint
* Removed icon field from MQTT components
* Code generation now uses setup_entity to setENTITY_BASE_SCHEMA fields
* Removed unused import
* Added cstdint include
* Optimisation: don't set icon if it is empty
* Remove icon from NumberTraits and SelectTraits
* Removed unused import
* Integration and Total Daily Energy sensors now inherit icons from their parents during code generation
* Minor comment correction
* Removed redundant icon-handling code from sensor, switch, and text_sensor
* Update esphome/components/tsl2591/tsl2591.h
Co-authored-by: Oxan van Leeuwen <oxan@oxanvanleeuwen.nl>
* Added icon property to binary sensor, climate, cover, and fan component tests
* Added icons for Binary Sensor, Climate, Cover, Fan, and Light to API
* Consolidated EntityBase fields in MQTT components
Co-authored-by: Oxan van Leeuwen <oxan@oxanvanleeuwen.nl>
* Accept changes as proposed by black.
* Added test and implemented optional correctly.
* Disable PHY RF full calibration (because it calls the breaking MAC retrieval function).
* Disable CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE instead of enable, dummy!
* Rename CONF_IGNORE_EFUSE_MAC_CRC to CONF_ESP32_IGNORE_EFUSE_MAC_CRC.
* Removed unused import.
* Fix ordering of constants.
* Moved all MAC address logic to core helpers.
* Use pretty MAC address for the log.
* Use standard MAC formatter function for debug component.
* Fix clang-formatting.
* Fix clang-formatting.
* Brought wording of comments in line with other function-describing comments.
* Processed code review by @OttoWinter
* Add USE_ESP32_IGNORE_EFUSE_MAC_CRC to defines.h
Co-authored-by: Maurice Makaay <mmakaay1@xs4all.net>
* Adding first version of current_base cover. No Interlock yet.
* simplifying code
* Implementing malfunction protection
* Adding test
* Fixing too long lines
* Fixing test sensor names
* Adding missing id's in ade7953 tests
* Adding code owners as requested
* Fixing issue setting position when stop reached
* Fixing issue setting position when stop reached
* Black formatting
* Fixing format issues
* Fix for concurrent changes
Co-authored-by: Oxan van Leeuwen <oxan@oxanvanleeuwen.nl>
* Add serveral options for SSD1306 integration
* Add SSD1305 support
(SSD1305 is similar to SSD1306, it seems SSD1305 has
brightness and color register but does not have charge pump)
* Add some description when manipulating registers
* Add flip, offset and invert option to get more compatibility
with various display modules
* Fix typo `setup_ssd1036' -> `setup_ssd1306'
* Add SSD1306 brightness validation tip
* Add more description, limit offset range
* Changes according to linter
* Fix test
* Raise error instead of using warning
* Fix wrong logic
* Remove logger
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
* Remove logging import
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
* adding a scan results wifi text sensor
* Code comment
* Adding scan results to test
* Removing redundant call
* linting
* Better method to update wifi info
Co-authored-by: Otto Winter <otto@otto-winter.com>
* Getting loop back
At least for now.
* Trying out suggestion again
* Applying cr suggestions
Co-authored-by: Otto Winter <otto@otto-winter.com>
* numeric speed added
* when dumping config for MQTT components log a note when skipped due to is_internal
* added new topics to paython code validation/generation
* reformatted with black
* formatting corrected
* use dump_config_ mechanism to skip internal components
* use dump_config_ mechanism to skip internal components
* style issues resolved
* do_dump_config removed
* formatting fixed
* formatting fixed
* Drop parent dump_config() calls
Co-authored-by: Oxan van Leeuwen <oxan@oxanvanleeuwen.nl>
* Add support for ltr390
* Fix linting errors
* Fix more linting errors
* Linting fixes continued
* Linting forever
* Another one
* Fix regression and linting
* Fix narrowing conversion
* Add test and bugfix
* Add codeowners
* Update CODEOWNERS
* Update sensor defs
* Reformatted with black
* Fixed device class import
* Update CODEOWNERS
* Update CODEOWNERS
* Adding all config options
As requested https://github.com/esphome/esphome/pull/1505#discussion_r597326897
* Moving test to different config file
test1.yml runs out of memory
* Update according to comments
* Add safety clause to reading modes
* Fix clang-tidy complaint
* Revert change to i2c component
* Fix for changes in dev
* Revert "Revert change to i2c component"
This reverts commit 2810df59e9.
Co-authored-by: Otto winter <otto@otto-winter.com>
Co-authored-by: Oxan van Leeuwen <oxan@oxanvanleeuwen.nl>
* Prevent underscore character being used in 'name'.
* Restrict underscores in hostnames, not all names.
* Use hostname validator for node name.
* Allow underscore in hostname but warn once.
* Add renaming instructions link to warning.
* Point underscore warning to FAQ section
Co-authored-by: Otto Winter <otto@otto-winter.com>
Co-authored-by: Otto Winter <otto@otto-winter.com>
* Added an option to disable mDNS
* Fixed linter issues
* Moved the enable_mdns option to WiFi and Ethernet components
* extracted common method for add mdns library
* lint
Co-authored-by: Guillermo Ruffino <glm.net@gmail.com>
* Start of SGP40 dev
* Clean up
* Initial Commit
* VOC is working
* Fixed up sensor config
* Lint Fixes
Added in save/restore baseline
Noted original repo in header
* Lint Fixes
Added to test
* Lint Fixes
* Added additional check on restoring
* Removed double check
* Changed defines to static const double
* Changed defines to const
Do not send voc index until sensor stabilizes
* Fixed sensor stabilization message
* Fixup according to PR
* samples_read increment fix
* Fixed missing device class
* Choose a SENSOR device class
* Moved some sensors for tests
Co-authored-by: Guillermo Ruffino <glm.net@gmail.com>
* Add fan speed percentage support to the API
* Add float fan speed percentage
* Add percentage support to automation and configuration
* Update Tuya fan
* Fix pylint warning
* Update API to use speed levels instead of percentage
* Use speed levels
* Fix type warnings
* MQTT component now converts between speed levels and enums
* Webserver now supports speed_level
* Update prometheus
* Remove low/medium/high settings from speed fan
* Remove unused enum
* Configurable speed levels for speed fan
* Remove unused import
* Rename speed_level->speed and speed_levels->speed_count
* Rename supported_speed_levels -> supported_speed_count in API and FanTraits
Field id stays the same in the protocol, so the change is not breaking for aioesphome.
* schema dump idea
accept boolean or anything default
accept null also for full dicts
added some common validators
more simple validators
support multi_conf
better handle automations
updates
updates
handle lists
removed not needed class
move to own folder
generalized for automations lists, etc
updates
updates
clean up
clean up
fix automations
made comment optional
basic docs support
added more docs
fixes docs handling
updates
updates
fix components parent
updates
updates
updates
Fix inkplate 6 registration
updates
Disable logging for vscode add on
better handle buses
keep extended order as in CONFIGs
updates
updates
updates
disable comments
moved to scripts/build_jsonschema
added configurable decorators
path handling
fix handle list_schema
fixes and cleanup
add jschema_extractor to maybe
updates
lint
no schema in git
add generated loggers list
* lint
* Added support for SM300D2 sensor module
* Fixed lint errors due to added tvoc config
* add device class
Co-authored-by: Guillermo Ruffino <glm.net@gmail.com>
* Migrate ESPColor to Color
* color.h constructor fix
* Updated componets to use Color
Added a using for ESPColor
* Lint fixes
* Fixed value error
* Update display components to use colorutil
* Updated to latest PR comments
* Fixed COLOR_WHITE
* Moved esp_scale to color_utils
* Rename color_utils to display_color_utils
* Added samsung36 ir protocol
* Make linter happy
* Added test and fixed python failure
* Sorry for the commits but linter was still not happy :)
* Okay have to run script/clang-format -i
Co-authored-by: tuxBurner <tuxBurner@boggo.de>
* Added vl53l0x change address and timeout
* Added vl53l0x change address and timeout
* vl53l0x code cleanup and update test
* remove executable bit
* lint code cleanup
* code review fixes including timeout default to 10ms
* Code review cleanup and change a WARN log level message to DEBUG
* Fix issue where warn should be temporary
* Added name of sensor to warning message
* Fix blacklist lint issue
* Remove unused import
* Add constants for sensor device_class
* Add device_class attribute to sensor component
* Add device_class attribute to sensor class
* Add device_class to mhz19 temperature sensor
* Add device_class to sensor in api component
* Add test for device_class of sensor
* Rename DEVICE_CLASS_NONE to DEVICE_CLASS_EMPTY for consistency
* Make optional attributes of sensor component truly optional
* Initial Commit - ST7735
* Updated for CI checks
* Updated for travis build
* Travis fixes
* Travis line too long
* Travis fixes
* Fixed up travis format issues
* Travis Fixes
* Initial Commit - ST7735
* Updated for CI checks
* Updated for travis build
* Travis fixes
* Travis line too long
* Travis fixes
* Fixed up travis format issues
* Travis Fixes
* Update to new color API and added test
* Check fixes
* Fixed sid length in test
* Cleaned up whitespaces
* kbx81 recommended fixes
* test fix
* Fixes of fixes
* Fixed test1.yaml
* Fixed test1.yaml
* Changed digital pin #s to gpio
* Updated to match kbx's color names
* Typo for ST7735_INITR_MINI_160X80
* Updated 8bit color space code
Added to_rgb_332 to color.h
fixed typo
* Added in to_rgb_332,to_bgr_332, rgb_332to_rgb_556 and a more generic scale
* Fixed MADCTL
* Fixp MADCTL
* Implemented usrbgr option
updated color to support 332 bgr conversion
typo fix
* Updated to_bgr_332
* Fix up for clang
* FIx up init code. type in buffer caused overrun
* fixup protected names
* typos
* Matched use_bgr to its conf
* color.h red fix in bgr_233to_rgb_565
* Fix ST7735_INITR_MINI_160X80
* Renamed bgr_233to_bgr_565 to match its function
Color space leak in bgr_233to_bgr_565.
cleaned up init code for displays.
* Fix
* clang fix
* Started Color Conversion
* Added various bit color functions
add triadto
* lint changes
* Various fixes
* Various formatting fixes. Wish my checks worked!
* Updated color api to support different formats
removed to_rgb_565
* lint clang fixes
* Test1 fix
* test1.yaml fix
* fixed 565 in ILI9341Display
* Added CodeOwners
* Updated CODEOWNERS
* changed to to332 and to565
* Waiting for color.h changes
* Stage changes
* Removed all changes except this driver
* Moved color functions into driver
* lint changes
* Lint and removed unrelated display driver changes
* Lint changes
* Initial Commit - ST7735
* Updated for CI checks
* Updated for travis build
* Travis fixes
* Travis line too long
* Travis fixes
* Fixed up travis format issues
* Travis Fixes
* Initial Commit - ST7735
* Updated for CI checks
* Updated for travis build
* Travis fixes
* Travis line too long
* Travis fixes
* Fixed up travis format issues
* Travis Fixes
* Update to new color API and added test
* Check fixes
* Fixed sid length in test
* Cleaned up whitespaces
* kbx81 recommended fixes
* test fix
* Fixes of fixes
* Fixed test1.yaml
* Fixed test1.yaml
* Changed digital pin #s to gpio
* Updated to match kbx's color names
* Typo for ST7735_INITR_MINI_160X80
* Updated 8bit color space code
Added to_rgb_332 to color.h
fixed typo
* Added in to_rgb_332,to_bgr_332, rgb_332to_rgb_556 and a more generic scale
* Fixed MADCTL
* Fixp MADCTL
* Implemented usrbgr option
updated color to support 332 bgr conversion
typo fix
* Updated to_bgr_332
* Fix up for clang
* FIx up init code. type in buffer caused overrun
* fixup protected names
* typos
* Matched use_bgr to its conf
* color.h red fix in bgr_233to_rgb_565
* Fix ST7735_INITR_MINI_160X80
* Renamed bgr_233to_bgr_565 to match its function
Color space leak in bgr_233to_bgr_565.
cleaned up init code for displays.
* Fix
* clang fix
* Started Color Conversion
* Added various bit color functions
add triadto
* lint changes
* Various fixes
* Various formatting fixes. Wish my checks worked!
* Updated color api to support different formats
removed to_rgb_565
* lint clang fixes
* Test1 fix
* test1.yaml fix
* fixed 565 in ILI9341Display
* Added CodeOwners
* Updated CODEOWNERS
* changed to to332 and to565
* Waiting for color.h changes
* Stage changes
* Removed all changes except this driver
* Moved color functions into driver
* lint changes
* Lint and removed unrelated display driver changes
* Lint changes
* Updated with latest color api
* pulled from origin
* Updated for color.h changes
* pulled test1 from dev
* Added test
* Fix some Tuya devices not handling commands sent without delay
* Also do not report WiFi status if MCU does not support it
* Support Tuya MCU 0x1c command (obtain local time)
* Use #ifdef USE_TIME to handle optional dependency on RTC
* Rename Tuya clock config variable to time to be consistent with the codebase
* Add tuya time configuration to test4
* Hbridge Christmas light component
Can be used for Christmas lights that use 2 wires to run 2 different strings of lights using a hbridge driver.
* Add Test
NOTE: I am unable to test this via the docker image
* Update hbridge_light_output.h
* Update hbridge_light_output.h
* Update hbridge_light_output.h
* Update light.py
* Fixed duty as white value bug fixed
* lint changes
* Name case change
* thanks lint
* WIP: Advanced commands for portisch firmware
* Fix string code sending
* clang formatting
* Add new rf_bridge functions to test
* Add advanced code received trigger
* Fix copy-paste mistake in the advanced sending
* Fix log message to be consistent
* clang
* Remove extra +
* fix: FastLED SPI_DATA_RATE being truncated to 8 bits
FastLED expects SPI_DATA_RATE as an uint32_t, but we had it as uint8_t.
Fix that to avoid the data rate being truncated.
* fastled: allow specifying data rate
Previously, we've just taken the default data rate from FastLED.
However, that does not always work properly. In my case, I had a
slow level shifter that couldn't keep up with the 1 MHz data
rate default for WS2801. Long cabling might also be a reason why
one might want to reduce the data rate.
This will add a new optional "data_rate" config option where one
may specify the desired data rate as a frequency:
light:
- platform: fastled_spi
chipset: WS2801
data_pin: GPIO23
clock_pin: GPIO22
data_rate: 500kHz
num_leds: 178
* Move pn532 -> pn532_spi
Add pn532_i2c
* Update i2c address
* Always wait for ready byte before reading
* Generalise the pn532 a bit more so less code in i2c and spi implementations
* clang
* Add pn532_i2c to test1
* Try to get setup working
* Fixes
* More updates
* Command consts
* A few upgrades
* Change text back to include 'new'
* Fix data reading
* Added tmp102 temperature sensor support
* Added sensor to test3.yaml
* Moved docstring to component root
* Tweak formatting from clang-format script
* Removed extra newline at the end of the file to satisfy pylint
* Update schema to match that of other single-value sensors
In ESPHome, sensors that only expose one value do not put the sensor under another key.
* Add missing import
* Fix test after structural change to component
* removed unused setting
* Update esphome/components/tmp102/tmp102.cpp
Co-authored-by: Otto Winter <otto@otto-winter.com>
Co-authored-by: Guillermo Ruffino <glm.net@gmail.com>
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>