Mino260806 / miwtool

A tool for manipulating Redmi Watch 2 Lite watchface files
GNU General Public License v3.0
36 stars 8 forks source link

miwtool

A tool for manipulating Redmi Watch 2 Lite, Redmi Watch 2 China, Poco Watch watchface files


Installation

Usage

Creating Watch Faces the easy way

Watchface Editor now includes support for Redmi Watch 2 Lite!

How to use - In the top right corner, press "Devices" and select "Redmi Watch 2 Lite" - Go to "View" Tab, press "SELECT" button in front of Images and select all of your custom images (they must be named in order "0.png", "1.png", "2.png"...) - In "Edit" Tab, you can change watch "Name" under "MetaData", and add a custom "Id" (optional) - Toggle the components you want to add in the right - In "Design" Tab, position your components freely - After finishing, click "EXPORT JSON" and save the file as "watchface.json" in the same folder then the images you imported earlier ### Compiling to ready-to-install file ```commandline python main.py --encode_wfeditor /path/to/input --output /path/to/output ``` ### Compiling to unpacked file ```commandline python main.py --decode_wfeditor /path/to/input --output /path/to/output ``` where `path/to/input` refers to the folder which contains the exported "watchface.json" and the images
Folder structure ``` ├── 0000.png ├── 0001.png ├── 0002.png ├── 0003.png ├── 0004.png ├── 0005.png ├── 0006.png ├── 0007.png ... └── watchface.json ```
Unsupported features - 12/24H format change - Date OneLine - Steps Goal, Steps Progress, Steps Progress Circle, Steps Goal Icon - Distance - Alarm, Bluetooth, Lock, Do not disturb - Battery icon, Battery bar - Weather OneLine, Day Weather, Night Weather, Alt Day Weather, Alt Night Weather - Air Pollution
[Notes] - Only "Tens" image matters in Time, ("Ones" is ignored) - Editing `config.json` (see "Details about unpacked file") gives you a more complete control over features (exclusive: analog, ...) - Weather CustomIcon must be in this exact order: Sunny, Cloudy, Overcast, Showers, Thunder Storm, Snowy, Sleet, Moderate Rain, Heavy Rain, Weak Snow, Moderate Snow, Heavy Snow, Very Heavy Snow, Foggy, Windy, Weak Snow, Loop (?), Unknown Data, Showers

Watch Faces extraction

To extract watch faces, you need to install Mi Fitness on an android device, download a watchface, and then navigate to

Android/data/$PACKAGE_NAME/files/WatchFace

($PACKAGE_NAME might be com.mi.health or com.xiaomi.wearable depending on your region)

Details about unpacked file

folder tree ``` . ├── config.json ├── images_0 │   └── static.png ... ├── images_11 │   ├── image_0.png │   ├── image_1.png ... │   ├── image_8.png │   └── image_9.png └── images_preview └── static.png ```
config.json structure ``` { "name": "Watch Face Name", "id": "12345678", "preview": { "static": "path/to/preview.png" }, "components": [ { "x": 0, "y": 0, "static": "background.png" }, ... ] } } ```
component attributes | Attribute | Condition | Description | Data type | |---------------------|-----------------|--------------------------------------------------|---------------| | x | * | x coordinate | int16 | | y | * | y coordinate | int16 | | static | optional | static image path | string | | dynamic | optional | dynamic images paths | array[string] | | type | optional | defines the type of a dynamic widget | object | | -- category | * | [TIME / BATTERY...] | string | | -- type | * | [HOUR / TEMPERATURE / ...] | string | | -- format | * | the format to display the data | string | | -- coordinate_types | * | what x and y mean | string | | pivot_x | if R | xcenter of rotation | int16 | | pivot_y | if R | ycenter of rotation | int16 | | max_value | if R | max_value that defines a rotation | int16 | | max_degrees | if R | degrees corresponding to max_value (3600° is 2π) | int16 | | values_ranges | if FORMAT_IMAGE | value range for each image | array[uint32] | | spacing | optional | spacing in pixels at the end of each image | int |
[Notes] - Images can have any names and can be placed in any folder - All categories, types, formats, and coordinate_types can be found in `constants.py` - Examples can be found in ./examples/watchfaces/decoded

How to upload a custom watch face to the watch

https://github.com/Mino260806/mi-watchface-uploader


Examples

Decoded "Multifunction" watchface from Mi Fitness ![decoder](examples/decoder_1.png)
Watchface created from scratch and uploaded to the watch ![encoder](examples/encoder_1.jpg)
"Minecraft 1.0" watchface ported from GTS 2 mini ![encoder](examples/encoder_2.jpg) Source: https://amazfitwatchfaces.com/gts/view/9999
"Dynamic" watchface ported from GTS 3 / GTS 4 ![encoder](examples/encoder_3.jpg) Source: https://amazfitwatchfaces.com/gts/view/9953