Files
budget-tracker/MEMORY.md
T
Nox e4128f9788 fix: browser wrapper permanent pour SingletonLock après redémarrage
- chrome-wrapper.sh : nettoie les lock files avant de lancer Chrome
- openclaw.json : executablePath pointe vers le wrapper
- start-chrome-cdp.sh : script de secours manuel
- oc-up.sh : mis à jour (plus de démarrage manuel Chrome nécessaire)
- MEMORY.md : documentation du fix
2026-02-27 10:42:54 +00:00

12 KiB

MEMORY.md — Nox 🌑

📋 Règle de mémorisation

Critère MEMORY.md Qdrant Les deux
Config infra (URL, token, IDs)
Préférences & comportements
Leçon courte / gotcha technique ← les deux
Procédure détaillée / code
Événement épisodique (ce qu'on a fait)
Fait important ET recherchable ← les deux

Résumé :

  • MEMORY.md = ce que je dois savoir DÈS le démarrage. Court, dense, stable.
  • Qdrant = ce que je dois pouvoir RETROUVER par recherche. Détails, procédures, contexte.
  • Les deux = les leçons critiques, les gotchas techniques, tout ce qui est à la fois essentiel ET recharchable.

Toujours ajouter dans Qdrant après toute session de travail significative. Ne pas surcharger MEMORY.md — si c'est long ou procédural, Qdrant suffit.

Christophe

  • Habite Montlieu-La-Garde, Charente-Maritime (17), axe Bordeaux-Angoulême N10
  • Fuseau horaire : Europe/Paris
  • Langue : français

Home Assistant

  • URL : http://192.168.1.40:8123
  • Lumières :
    • light.dimmer_2Entrée
    • light.barBar
    • light.bibliothequeBibliothèque
    • light.dimmer_salonSalon
    • light.nano_dimmerMezzanine (Nano Dimmer Z-Wave)
    • light.mi_light_wifi_ibox1Mi-Light WiFi iBox1 (la "lumière wifi")
  • Caméras :
    • camera.onvif_ptzCaméra Extérieur (double vue, couleur, parking/cour)
    • camera.fi9821epCaméra Salon (Foscam, intérieur)
    • camera.camera_ndeg7Caméra n°7 (intérieur, sous-sol/atelier)
    • camera.camera_jarnac_rdc_7Caméra Jarnac RDC 7 (intérieur)
    • camera.foscamFoscam (intérieur, entrée/pièce de vie)
    • camera.klipper_webcamEnder 3 Webcam (imprimante 3D)
    • camera.predator_predatorPredator
    • camera.nono_noneNono
  • Media Players :
    • media_player.shieldSHIELD CUISINE
    • media_player.android_tv_cuisineAndroid TV Cuisine
    • media_player.shield_salonSHIELD SALON
    • media_player.android_tv_salonAndroid TV Salon
    • media_player.denon_avr_x3400hDenon AVR-X3400H

Proxmox

  • URL : https://192.168.1.250:8006
  • Token : variable d'env PVE_TOKEN (format root@pam!openclaw=<uuid>) — déjà dans .env + docker-compose override
  • Accès API : curl -sk -H "Authorization: PVEAPIToken=$PVE_TOKEN" "$PVE_URL/api2/json/nodes"
  • Parser JSON avec Node.js (pas jq — permission denied dans le conteneur)
  • Nodes : mini-pc, ts-651, pve, z820

Proxmox Backup Server (PBS)

  • URL : https://192.168.1.91:8007
  • Token : variables d'env PBS_TOKEN_ID + PBS_TOKEN_SECRET — déjà dans .env + docker-compose override
  • Accès API : curl -sk -H "Authorization: PBSAPIToken=$PBS_TOKEN_ID:$PBS_TOKEN_SECRET" "$PBS_URL/api2/json/status/datastore-usage"
  • Datastore : backups_on_ts651 (1.26 TB total)

Outils & Préférences

  • Génération d'images : utiliser fal.ai (FAL_KEY), PAS OpenAI
    • fal-ai/flux/schnell — génération rapide, bon pour photos/art
    • fal-ai/nano-banana-pro — Gemini 3 Pro Image, bon pour affiches/texte/édition d'images
  • Browser OpenClaw (outil browser) : OPÉRATIONNEL — headless Chromium Playwright, profil openclaw
    • Config : attachOnly: false, executablePath: /home/node/.openclaw/workspace/chrome-wrapper.sh
    • Le chrome-wrapper.sh nettoie les lock files résiduels AVANT de lancer Chrome (fix permanent pour le bug SingletonLock après redémarrage)
    • Chrome réel : /home/node/.cache/ms-playwright/chromium-1208/chrome-linux64/chrome (appelé par le wrapper)
    • CDP port : 18800, user-data-dir : /home/node/.openclaw/browser/openclaw/user-data
    • Utiliser pour : snapshots ARIA, interactions UI, screenshots, sessions persistantes
    • Se lance automatiquement au premier appel browser action=start profile=openclaw
    • Toujours sauvegarder les fichiers dans le workspace/tmp est bloqué pour l'envoi Telegram
    • ⚠️ Si le browser ne répond plus : vérifier que Chrome tourne (curl -sf http://127.0.0.1:18800/json/version) — relancer via bash /home/node/.openclaw/workspace/start-chrome-cdp.sh
  • Playwright direct (Node.js) : pour interception réseau, scripts sur mesure, scraping avancé
    • Installé dans /home/node/.openclaw/workspace/node_modules/playwright
    • executablePath/home/node/.cache/ms-playwright/chromium-1208/chrome-linux64/chrome
    • Les erreurs dbus en conteneur sont normales et sans impact
  • TTS : Edge, voix fr-FR-VivienneMultilingualNeural — TOUJOURS parler en français, même si la conversation contient de l'anglais
  • Transcription audio : Groq Whisper

Anytype

  • Instance self-hosted : http://192.168.1.150:31009
  • Espace principal : OpenClaw (id: bafyreigt3wmpnm2qduzijfubftw5ixrhqfrjrc2yi6hq2e4cpw6yer7hqq.25d1im923toai)
  • Skill custom dans /home/node/.openclaw/workspace/skills/anytype/
  • Utiliser cet espace pour tout ce qui concerne Christophe et moi
  • Images : ÇA MARCHE ! Anytype télécharge et internalise les images depuis une URL externe
    • Méthode : inclure ![alt](http://192.168.1.150:3923/chemin/image.png) dans le body markdown lors d'un POST (création d'objet)
    • Anytype récupère l'image, lui donne un ID interne (bafyrei...) et la sert via http://127.0.0.1:47800/image/<id>
    • L'image doit être accessible depuis le serveur Anytype (même réseau local)
    • PATCH : utiliser le champ "markdown" (PAS "body") pour modifier le contenu existant !
    • Le format icon doit être {"format":"emoji","name":"🧪"} et non une string simple
    • POST (création) : utiliser "body" pour le contenu
    • PATCH (modification) : utiliser "markdown" pour le contenu

CopyParty (stockage fichiers)

  • URL : http://192.168.1.150:3923
  • Upload simple via curl -X PUT "http://192.168.1.150:3923/<chemin>" --data-binary @fichier
  • Pas d'authentification requise
  • Dossier /anytype/ créé pour les fichiers liés à Anytype
  • Utilisable pour héberger images, schémas, etc. avec lien direct

Podcasts & Vidéos — Transcription

  • Je peux récupérer et transcrire des podcasts/vidéos en ligne
  • Méthode :
    1. Utiliser Playwright pour intercepter les requêtes réseau et trouver l'URL du fichier audio (.mp3)
    2. Télécharger le MP3 avec curl -sL -A "Mozilla/5.0..." -H "Referer: <site>" <url> -o fichier.mp3
    3. Transcrire avec Groq Whisper : curl -X POST https://api.groq.com/openai/v1/audio/transcriptions -H "Authorization: Bearer $GROQ_API_KEY" -F "file=@fichier.mp3" -F "model=whisper-large-v3-turbo" -F "language=fr" -F "response_format=text"
  • Testé avec succès sur BFM Business / Simplecast (podcasts hébergés sur simplecastaudio.com)
  • Sauvegarder les fichiers dans le workspace, pas dans /tmp
  • YouTube : utiliser yt-dlp (binaire dans /home/node/.openclaw/workspace/yt-dlp)
    • Transcript via API YouTube (sous-titres auto) : yt-dlp --write-auto-sub --skip-download --sub-lang fr -o workspace/transcript <url>
    • Audio pour Whisper : yt-dlp -x --audio-format mp3 -o workspace/audio.mp3 <url>

Mémoire Vectorielle (Qdrant)

  • Collection : nox-memory sur Qdrant (http://192.168.1.150:6333)
  • Stack Portainer : qdrant (anciennement kilocode-qdrant, renommé 2026-02-22)
  • Script : /home/node/.openclaw/workspace/nox-memory.js
  • Modèle : text-embedding-3-small (OpenAI, 1536 dims, Cosine)
  • Accès : node fetch natif (Node 22) — curl bloqué par sandbox OpenClaw, mais node fetch fonctionne
  • Réseau Docker : le stack doit avoir un réseau bridge en plus de swag_lan pour être accessible depuis le LXC
  • Usage :
    node nox-memory.js add "texte" --type fact|semantic|preference|episodic --tags "t1,t2" --importance 1-5
    node nox-memory.js search "question naturelle" [--limit 5] [--type fact]
    node nox-memory.js list [--type fact] [--limit 20]
    node nox-memory.js stats
    node nox-memory.js import-md MEMORY.md
    
  • MEMORY.md importé (9 chunks, 2026-02-22)
  • Utiliser en priorité pour les recherches contextuelles (memory_search reste utile pour le démarrage de session)
  • ⚠️ Qdrant charge ~34 collections KiloCode au démarrage → ~30s avant d'être prêt

Home Assistant — Lovelace / Dashboards

Dashboards disponibles

  • lovelace → "Aperçu" (dashboard principal, 15+ vues)
  • vue-par-pieces → "Vue par pièces"
  • mushroom-strategy → "Mushroom-strategy"
  • map → Map

Modifier/créer des vues Lovelace via WebSocket API

L'API REST /api/lovelace/config retourne 404 même si HA est en mode storage → utiliser l'API WebSocket à la place.

Méthode (Node.js, WebSocket natif Node 22) :

const ws = new WebSocket(`${HA_URL.replace('http://','ws://')}/api/websocket`);
// Auth
ws.send(JSON.stringify({ type: 'auth', access_token: TOKEN }));
// Lire config
send({ type: 'lovelace/config' })  // → result.views[]
// Sauvegarder config modifiée
send({ type: 'lovelace/config/save', config: modifiedConfig })
// Lister les dashboards
send({ type: 'lovelace/dashboards/list' })
// Pour un dashboard spécifique (url_path)
send({ type: 'lovelace/config', url_path: 'vue-par-pieces' })

Script template : /home/node/.openclaw/workspace/ha_ws_add_lights.mjs

  • Lire config → modifier le tableau views → sauvegarder
  • Utiliser le WebSocket natif Node 22 (pas besoin du package ws)
  • Timeout de sécurité à 15s
  • Le code de sortie 1 (timeout) est normal si ws.close() ne coupe pas avant le timeout — le succès est dans le log

Astuce : Pour ajouter une vue sans écraser les existantes, lire d'abord la config, push la nouvelle vue, puis sauvegarder le tout.

Portainer

  • URL : https://192.168.1.150:9443
  • Token : variable d'env PORTAINER_API_KEY
  • Endpoint local : id=2 (socket Docker)
  • ~38 stacks dont ~25 actives
  • Pas de jq dans le conteneur → utiliser curl + Node.js directement

Proxmox — Inventaire VMs/LXC clés

  • VM 138 (mini-pc) → Home Assistant (192.168.1.40) — pas d'agent QEMU
  • LXC 145 (mini-pc) → OpenClaw (ce conteneur)
  • LXC 139 (mini-pc) → Frigate (NVR)
  • VM 109 (z820) → PBS (Proxmox Backup Server, 192.168.1.91)

Docker — Règles de mise à jour

  • Toujours exécuter docker-backup.js avant toute mise à jour d'un conteneur Docker
    • Script : node /home/node/.openclaw/workspace/docker-backup.js <nom_conteneur>
    • Exemple : node docker-backup.js vaultwarden avant de puller une nouvelle image
    • Services configurés : vaultwarden, vikunja, nocodb, freshrss
    • Le cron hebdo a été créé mais désactivé à la demande de Christophe (2026-02-23)
    • Réactiver si besoin : node /app/dist/index.js cron add ...

Santé — Christophe

  • Profil : Homme, né 12/06/1981 (44 ans), 1m81, ~90 kg, IMC ~27,5
  • Appareil tension : Sanitas (poignet, profil 1)
  • Suivi tension dans memory/YYYY-MM-DD.md — tableau SYS/DIA/Pouls
  • Première mesure : 2026-02-25 12:08 → 145/94 mmHg, pouls 77 bpm (HTA stade 1)

Sites & Flux RSS

  • Korben.info : utiliser le flux RSS https://korben.info/feed pour récupérer les articles (plus propre que scraper la homepage)

Veilles actives

📡 XGS-PON CMTD — Montlieu-la-Garde

  • Christophe est sur le réseau CMTD (RIP, géré par Orange) actuellement en GPON → plafond ~1 Gbps
  • Migration XGS-PON en cours, prévue fin 2026
  • Quand XGS-PON dispo → recommander passage Freebox Ultra grand public (moins cher que FreePro, mêmes features + 8 Gbps sym)
  • Vérifier 1x/mois via heartbeat

Leçons apprises

  • Toujours prendre un snapshot du LXC 145 (mini-pc) avant toute modification de config ou installation qui pourrait casser OpenClaw
    • Commande : curl -sk -X POST -H "Authorization: PVEAPIToken=$PVE_TOKEN" -H "Content-Type: application/json" -d '{"snapname":"<nom>","description":"<desc>"}' "$PVE_URL/api2/json/nodes/mini-pc/lxc/145/snapshot"
  • Toujours vérifier les friendly_name dans HA pour trouver les entités
  • Les skills custom sont dans /home/node/.openclaw/workspace/skills/
  • curl est bloqué dans le sandbox OpenClaw pour certaines destinations réseau, mais node fetch (Node 22) fonctionne — utiliser node pour les requêtes HTTP internes quand curl échoue