Flavien PERIER

Développeur Full-Stack

Configuration d'une montre sous AsteroidOS

Avant toute chose, cet article traite de manipulations techniques qui pourraient, dans certains cas, causer un certain nombre de dysfonctionnements voire des pertes de données. Je n'assumerai en aucun cas la responsabilité de tels problèmes.

En préambule, je tiens à préciser que je vois personnellement d'un assez mauvais œil les montres connectées. Elles sont pour moi un gadget supplémentaire n'apportant pas de réelles innovations en matière d'usage, mais sont une source inépuisable de données pour ceux qui nous les vendent (données de déplacement, paramètres de santé...). Un système d'exploitation pour ce type d'objet a néanmoins retenu mon attention. Il s'agit d'AsteroidOS.

Le système

AsteroidOS est un système d'exploitation pour montre connectée basé sur Linux. Les interfaces sont développées en QT et sont affichées grâce à Wayland.

Si on veut être honnête, ce système d'exploitation est très en retard par rapport à ce que peut proposer Google WearOS ou une Apple Watch et ne propose que très peu d'options supplémentaires par rapport à une montre non connectée. Néanmoins, le projet est intéressant et les montres qui le supportent étant assez anciennes, il est possible de s'en procurer à moindre coût d'occasion (et donc à moindre impact environnemental).

On trouve comme fonctionnalités intégrées :

La montre

Ayant acheté une montre connectée dans l'unique objectif d'essayer cet OS, je suis parti sur l'une de celles qui a la meilleure compatibilité à savoir la LG Watch Urban.

Elle a notamment l'énorme avantage d'être connectable directement à un ordinateur sans devoir faire de bricolage au niveau du hardware.

Son bracelet est facilement changeable puisqu'il s'agit d'attache standard pour montre. Et en cas de problème au niveau hardware, elle est facilement démontable, comme le prouve les équipes de iFixit.

Installation

Pour l'installation, il faut au préalable vérifier qu'ADB est bien installé sur son ordinateur.

Pour la suite, le tutoriel présent sur le site suffit pour installer facilement l'OS.

Je détaille néanmoins ici les étapes d'installation :

  • Dans un premier temps, il faut télécharger les fichiers de la dernière version de WearOS pour la montre : Le kernel, Le recovery et La ROM.

  • Puis les fichiers d'AsteroidOS : Les données utilisateur et La ROM.

  • La stabilité de distribution étant ce qu'elle est, il peut être bon de remplacer le recovery par TWRP. Cela peut permettre d'effectuer des backups.

  • Ensuite, il faut accéder au bootloader de l'appareil. Pour ce faire, il suffit d'éteindre la montre puis de la rallumer. Au démarrage quand le logo "LG" apparait il faut faire glisser son doigt du coin supérieur gauche de l'écran au coin inférieur droit.

  • Enfin il faut brancher l'appareil à un ordinateur via le câble USB et taper les commandes :

bash
fastboot oem unlock

fastboot flash recovery recovery.img
fastboot flash system MM-system-ext4-*.img
fastboot flash boot Skin1980-boot-*.img

fastboot continue
# Attendre que l'os de base ait fini de s'installer avant de revenir sur fastboot et continuer.

fastboot flash recovery twrp-*-bass.img
fastboot flash userdata asteroid-image-bass.rootfs.ext4
fastboot flash boot zImage-dtb-bass.fastboot

fastboot oem lock

fastboot continue

Application téléphone

Par défaut, il est possible d'utiliser l'application mobile officielle d'AsteroidOs. Cependant, cette dernière est assez peu maintenue et relativement instable. Il est donc préférable d'utiliser GadgetBridge, une alternative plus complète également en mesure de piloter des montres qui ne fonctionnent pas sous AsteroidOS.

Connexion Wi-Fi

Pour se connecter à la montre, il faut aller dans les paramètres de la montre puis configurer le mode USB sur Mode ADB, puis taper les commandes sur un pc pendant que la montre est connectée :

bash
adb usb
adb shell

Ensuite, pour se connecter en WiFi, il faut taper les commandes :

bash
WIFI_SSID=*********
WIFI_PASSWORD=*********

rm -Rf /var/lib/connman/wifi*

connmanctl enable wifi
connmanctl scan wifi

WIFI="$(connmanctl services | grep $WIFI_SSID | tr -s " " | cut -f3 -d ' ')"

cat << EOL > /var/lib/connman/$WIFI.config
[service_wifi_$WIFI]
Type = wifi
Name = $WIFI_SSID
Passphrase = $WIFI_PASSWORD
Security = psk
AutoConnect=true
EOL

ifconfig wlan0 down
ifconfig wlan0 up

systemctl restart connman

System

Le gestionnaire de paquet de la distribution est opkg. Il s'utilise globalement comme apt-get sur les systèmes Debian.

Il faut cependant être attentif à ne pas faire d'opkg dist-upgrade. Cela pose un problème au moment de la mise à jour de la BusyBox et casse complètement l'OS... Donc obligé de tout réinstaller.

De même, des upgrades globaux (opkg upgrade) peuvent introduire des instabilités plus ou moins graves... Chose malheureusement symptomatique des distributions mal ou insuffisamment testées. Une fois la distribution installée, le plus sage est donc malheureusement de ne plus toucher à rien.

Optimisation

La configuration de base d'AsteroidOS génère beaucoup de logs, ce qui finit par impacter l'autonomie de l'appareil et qui finit par remplir toute la place sur le disque (qui est fortement limité).

Une solution peut donc être de réduire le spam de log et d'éviter de les stocker sur disque, mais d'uniquement les conserver en mémoire :

bash
echo '
Storage=volatile
SystemMaxUse=32M
RuntimeMaxUse=32M
MaxLevelStore=warning
' >> /etc/systemd/journald.conf

Watchface

J'utilise une watchface custom pour la montre. Pour l'installer, il suffit de taper les commandes depuis un pc :

bash
cd /tmp
git clone -q --depth 1 -- https://github.com/flavien-perier/asteroid-watchface.git
cd asteroid-watchface
adb push usr/ /
adb shell systemctl restart user@1000

Applications

Le site d'AsteroidOS liste différentes applications installées par défaut, ou installables, qui peuvent s'avérer plus ou moins utiles.

Asteroid Health

Asteroid Health est une application de comptage de pas, ou les données restent exclusivement dans la montre. Pas de risque de fuite sur le cloud.

bash
opkg install asteroid-health

Script de synchronisation

L'os n'étant pas très complet de base, il peut être bon de rajouter un petit script qui permette de synchroniser son agenda quand la montre a accès à internet ainsi que d'afficher son adresse ip dans une notification.

bash
opkg update
opkg install curl

echo "CALENDAR_URL=******" > /home/root/sync.conf

echo '#!/bin/bash

set -e

touch /tmp/calendar-sync-last-update
SYNC_DATE="$(date +%F)"
LAST_SYNC_DATE="$(cat /tmp/calendar-sync-last-update)"

if [[ "$SYNC_DATE" != "$LAST_SYNC_DATE" ]]
then
  if connmanctl state | grep -q "State = ready"
  then
    source /home/root/sync.conf

    curl -s -o /tmp/calendar.ics "$CALENDAR_URL"
    su -l ceres -c "icalconverter import /tmp/calendar.ics -d"

    IP="$(ip -br -4 a show wlan0 | tr -s " " | cut -f3 -d " " | cut -f1 -d "/")"
    su -l ceres -c "notificationtool -o add --icon=ios-wifi --application=\"System\" --urgency=3 --hint=\"x-nemo-preview-summary WiFi\" --hint=\"x-nemo-preview-body IP: $IP\" \"WiFi\" \"IP: $IP\"" || true

    echo "$SYNC_DATE" > /tmp/calendar-sync-last-update
  fi
fi' | tee /home/root/calendar-sync
chmod 550 /home/root/calendar-sync

cat << EOL > /etc/systemd/system/calendar-sync.service
[Unit]
Description=Calendar synchronization service
Wants=calendar-sync.timer

[Service]
ExecStart=/home/root/calendar-sync
Type=oneshot

[Install]
WantedBy=network-online.target
EOL
chmod 755 /etc/systemd/system/calendar-sync.service

cat << EOL > /etc/systemd/system/calendar-sync.timer
[Unit]
Description=Calendar synchronization service
Requires=calendar-sync.service

[Timer]
Unit=calendar-sync.service
OnUnitInactiveSec=2hours

[Install]
WantedBy=timers.target
EOL
chmod 755 /etc/systemd/system/calendar-sync.timer

systemctl enable --now calendar-sync.service
systemctl enable --now calendar-sync.timer
systemctl daemon-reload

Fix techniques

Écran qui ne s'éteint pas

Sur plusieurs de mes installations d'AsteroidOS, je me suis retrouvé face à un écran qui ne s'éteint plus de manière automatique (ce qui impacte évidemment énormément la batterie).

La meilleure solution que j'ai trouvée est de réinitialiser mce (un démon permettant des interactions avec le hardware).

Pour ce faire, c'est relativement simple :

bash
systemctl stop mce
rm -f /var/lib/mce/builtin-gconf.values
systemctl start mce

Sources