Je partage ici deux intégrations custom que j’ai développées pour gérer le contrôle parental de l’ordinateur Linux de ma fille, le tout piloté depuis Home Assistant.
Le contexte
Ma fille a son propre PC sous Linux. Je voulais pouvoir :
Contrôler les sites auxquels elle a accès (approche whitelist : tout est bloqué sauf ce que j’autorise)
Limiter son temps d’écran (durée journalière, jours autorisés, plages horaires)
Tout gérer depuis HA, y compris quand son PC est éteint (les changements se mettent en file d’attente et s’appliquent au redémarrage)
Par contre, j’aime pas l’idée de mettre le mot de passe du compte (dans Mot de passe SSH), ça serait bien qu’on puisse peut mettre une clé ssh à la place.
@tienou42 , je vient de le configurer et il fonctionne bien (ça sera bien plus simple a gérer que depuis le l’ordinateur, un grand merci a toi ! )
Comme amélioration, sur les sensors de limite par jour ( number.xxx_limite_jeudi par exemple ) :
le type slider n’est pas pertinent car entre le min (0) et le max (1440) c’est presque impossible a utiliser, le type box serait plus pertinent
Comme amélioration, sur les sensors de limite par jour ( number.xxx_limite_jeudi par exemple ) :
le type slider n’est pas pertinent car entre le min (0) et le max (1440) c’est presque impossible a utiliser, le type box serait plus pertinent
Contournement manuel (sur l'instance qui ne l'a pas) : Paramètres → Tableaux de bord → ⋮ → Ressources → Ajouter → URL /local/timekpra-card.js, type Module JavaScript → puis rechargement forcé.
/usr/bin/timekpra --settimelimitmonth baptiste 500h
ERREUR D'ANALYSE DE PARAMÈTRE (veuillez vérifier la validité du paramètre): invalid literal for int() with base 10: '500h'
Merci, c'est bien mieux, je peut maintenant gérer le temps via l'extension.
Par contre, les sensors eux ne sont pas mis a jour, j'ai ce type d'erreur sur l'instance d'HA :
2026-06-20 10:04:17.541 ERROR (MainThread) [custom_components.timekpra.ssh] SSH failed on all hosts (192.168.1.19): 'SSHCompletedProcess' object has no attribute 'exit_status'
2026-06-20 10:04:17.542 ERROR (MainThread) [custom_components.timekpra.coordinator] Unexpected error running set_track_inactive
Traceback (most recent call last):
File "/opt/homeassistant/.homeassistant/custom_components/timekpra/coordinator.py", line 126, in async_apply
File "/opt/homeassistant/.homeassistant/custom_components/timekpra/ssh.py", line 378, in set_track_inactive
...<2 lines>...
val = "true" if track else "false"
^^^^^
File "/opt/homeassistant/.homeassistant/custom_components/timekpra/ssh.py", line 220, in execute
raise last_err # type: ignore[misc]
^^^^^^^^^^^^^^
File "/opt/homeassistant/.homeassistant/custom_components/timekpra/ssh.py", line 192, in execute
return await self._execute_on_host(host, command, check)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homeassistant/.homeassistant/custom_components/timekpra/ssh.py", line 172, in _execute_on_host
if check and result.exit_status != 0:
^^^^^^^^^^^^^^^^^^
AttributeError: 'SSHCompletedProcess' object has no attribute 'exit_status'
Le fix (2 fichiers, +6/−3) : result.exit_status → result.returncode — compatible asyncssh 2.17.0. Plus d'AttributeError, et les écritures sont enfin correctement confirmées (fini les fausses mises en file).
À faire : mettre à jour vers 1.21.2 + redémarrer HA.
Désolé mais c'est pas encore ça (tester en clé ssh et en mot de passe ) :
Les logs sur le HA :
2026-06-24 14:22:49.094 DEBUG (MainThread) [custom_components.timekpra.coordinator] Loaded last known config from storage
2026-06-24 14:22:49.094 DEBUG (MainThread) [custom_components.timekpra.ssh] SSH connecting to XXX@192.168.1.19:22 (password auth)
2026-06-24 14:22:51.349 DEBUG (MainThread) [custom_components.timekpra.ssh] SSH error on 192.168.1.19 [AttributeError]: 'SSHCompletedProcess' object has no attribute 'stdout'
2026-06-24 14:22:51.349 ERROR (MainThread) [custom_components.timekpra.ssh] SSH failed on all hosts (192.168.1.19): 'SSHCompletedProcess' object has no attribute 'stdout'
2026-06-24 14:22:51.349 DEBUG (MainThread) [custom_components.timekpra.coordinator] Cannot reach machine for config read
2026-06-24 14:22:51.349 DEBUG (MainThread) [custom_components.timekpra.coordinator] Using last known config from storage
2026-06-24 14:22:51.349 DEBUG (MainThread) [custom_components.timekpra.coordinator] Finished fetching timekpra data in 2.255 seconds (success: True)
les logs sur la machine destination: (où on vois que la connexion et sudo se fait bien )
juin 24 14:22:51 Latitude-E5440 sshd[8377]: Accepted publickey for XXX from 192.168.1.15 port 60260 ssh2: RSA SHA256:ezQCs0ia9FYeC/M2GedJTo8ik+QskvAh/F5DrqYH0sk
juin 24 14:22:51 Latitude-E5440 sshd[8377]: pam_unix(sshd:session): session opened for user XXX(uid=1000) by XXX(uid=0)
juin 24 14:22:51 Latitude-E5440 systemd-logind[893]: New session 22 of user XXX.
juin 24 14:22:51 Latitude-E5440 snapd-desktop-i[6321]: Detected new session 22 at /org/freedesktop/login1/session/_322
juin 24 14:22:51 Latitude-E5440 systemd[1]: Started session-22.scope - Session 22 of User XXX.
juin 24 14:22:51 Latitude-E5440 sudo[8424]: XXX : PWD=/home/XXX ; USER=root ; COMMAND=/usr/bin/test -f /var/lib/timekpr/config/timekpr.YYY.conf
juin 24 14:22:51 Latitude-E5440 sudo[8424]: pam_unix(sudo:session): session opened for user root(uid=0) by XXX(uid=1000)
juin 24 14:22:51 Latitude-E5440 sudo[8424]: pam_unix(sudo:session): session closed for user root
juin 24 14:22:51 Latitude-E5440 sshd[8421]: Received disconnect from 192.168.1.15 port 60260:11: Disconnected by application
juin 24 14:22:51 Latitude-E5440 sshd[8421]: Disconnected from user XXX 192.168.1.15 port 60260
juin 24 14:22:51 Latitude-E5440 sshd[8377]: pam_unix(sshd:session): session closed for user XXX
juin 24 14:22:51 Latitude-E5440 systemd[1]: session-22.scope: Deactivated successfully.
juin 24 14:22:51 Latitude-E5440 systemd-logind[893]: Session 22 logged out. Waiting for processes to exit.
juin 24 14:22:51 Latitude-E5440 systemd-logind[893]: Removed session 22.
Ce que je pense : la commande test -f fichier est bonne (le code de retour, lancer en manuelle est 0) mais la commande ne renvoie rien dans stdout ce qui fait échoué custom_components.timekpra.ssh
Le fix (2 fichiers, +13/−9) : retour à conn.create_process() + propriétés stables (proc.stdout/stderr.read(), proc.returncode) → fini la dépendance au SSHCompletedProcess versionné. Corrige lectures (sensors) ET écritures en une fois.
À faire : mettre à jour vers 1.21.3 + redémarrer HA. Les sensors (Ordinateur, Temps utilisé/restant, Modifications en attente) doivent enfin se rafraîchir — immédiatement au redémarrage, puis toutes les ~5 min.
Sensors de temps : si « Temps utilisé » reste vide après 1.21.3, les clés du fichier .time diffèrent peut-être de ce qu'attend _process_time_data (TIME_SPENT_DAY/TODAY/SECONDS_SPENT). Envoie-moi un cat du .time et je cale le parsing.
set_track_inactive / set_lockout_type : maintenant que les erreurs remontent, teste-les ; si timekpr refuse le format (ex. True/False capitalisé), c'est une ligne.