Firmware Valetudo cho robot hút bụi Xiaomi cung cấp giao diện web để điều khiển các chức năng được thiết kế cho robot, nhờ vào firmware gốc của Xiaomi được lồng ghép bên trong.
Điẻm sáng tạo là khả năng phân vùng lau dọn.
Với firmware Xiaomi, người dùng phải xác định toạ độ các góc của hình chữ nhật bao quanh vùng lau dọn, mà các toạ độ này được tính tương đối theo vị trí bắt đầu của robot. Xiaomi không cung cấp phương tiện gì để tính các toạ độ này, và nếu lần sau đặt robot tại vị trí bắt đầu khác thì các toạ độ bị sai lệch.
Với firmware Valetudo, vùng lau dọn được xác định bằng cách vẽ hình chữ nhật trên bản đồ đã thu thập trước. Tất nhiên bản đồ này cũng vẽ tương đối theo vị trí bắt đầu của robot. Vùng lau dọn này được lưu với tên tuỳ ý, thí dụ “Phòng ăn”, thực tế chỉ lưu tọa độ các góc của hình chữ nhật, lưu vào file text config.json khác với file nhị phân last_map của bản đồ.
Ở lần lau dọn sau, vị trí ban đầu của robot có thể khác, thể hiện vùng lau dọn không khớp với bản đồ sàn. Khi đó có thể di chuyển hình chữ nhật của vùng lau dọn cho khớp.
Tuy nhiên để có thể lập trình, vị trí ban đầu của robot phải không đổi.
Nếu nhà nhiều tầng có mặt sàn giống nhau, có thể dùng chung một bản đồ sàn nhưng cần phải đánh dấu vị trí ban đầu của robot cho giống nhau để tọa độ bản đồ không sai lệch.
Các vùng cấm robot đi vào và các thanh chắn cũng hoạt động tương tự.
Valetudo chỉ giữ một bản đồ đã hoàn thành, lần lau dọn sau sẽ khởi tạo bản đồ mới. Vì vậy nếu nhà nhiều tầng có mặt sàn khác nhau thì cần phải lưu lại bản đồ của mỗi sàn. Điều này sẽ thể hiện ở phiên bản Valetudo tiếp theo.
Tạm thời chúng ta sẽ lưu bản đồ sàn và đem ra sử dụng một cách thủ công.
Script lưu bản đồ sàn savemap.sh
#!/bin/bash
[ $# -eq 0 ] && exit 1
[ ! -e "/mnt/data/valetudo/maps/$1" ] && mkdir "/mnt/data/valetudo/maps/$1"
cp -f /mnt/data/rockrobo/last_map "/mnt/data/valetudo/maps/$1/" &> /dev/null
cp -f /mnt/data/rockrobo/PersistData_1.data "/mnt/data/valetudo/maps/$1"/ &> /dev/null
cp -f /mnt/data/rockrobo/PersistData_2.data "/mnt/data/valetudo/maps/$1/" &> /dev/null
cp -f /mnt/data/rockrobo/ChargerPos.data "/mnt/data/valetudo/maps/$1/" &> /dev/null
Gỉa sử để lưu bản đồ “Tầng #1”, ta chạy lệnh savemap.sh “Tầng #1”
Script nạp bản đồ sàn loadmap.sh
#!/bin/bash
[[ "$1" && -d "/mnt/data/valetudo/maps/$1" ]] || exit 1
rsync -r "/mnt/data/valetudo/maps/$1/" /mnt/data/rockrobo/
rm -f /mnt/data/rockrobo/user_map0
rm -f /mnt/data/rockrobo/StartPos.data
reboot #service rrwatchdoge restart
Các script này lưu trên robot, có thể gọi qua ssh.
sudo ssh root@ip_xiaomi_vacuum "/path/to/loadmap.sh map_name"
Hay gọi từ HASS, khai báo ở configuration.yaml
shell_command:
loadmap: 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i /config/ssh/id_rsa root@ip_xiaomi_vacuum "/path/to/loadmap.sh map_name"'
Trong đó map_name có thể chọn từ một select_input
Có vẻ sẽ nhanh hơn nếu gọi reboot thay vì service rrwatchdoge restart vì không cần chờ 30 giây.