From c9adc5be5e000a1122b88ccf7d348a9ee7cd3c6f Mon Sep 17 00:00:00 2001 From: Alexis Rolland Date: Fri, 19 Jun 2026 22:32:27 +0200 Subject: [PATCH] first --- configs/alarmo/automations-alarm.yaml | 350 ++++++++++++++++++ configs/esphome/humidity-sensor.yaml | 73 ++++ configs/frigate/config.yaml.example | 167 +++++++++ .../homeassistant/configuration.yaml.example | 128 +++++++ .../zigbee2mqtt/configuration.yaml.example | 66 ++++ docs/architecture.md | 64 ++++ docs/automations-overview.md | 84 +++++ docs/network-diagram.md | 171 +++++++++ docs/security-policy.md | 95 +++++ readme.md | 229 +++++++++--- 10 files changed, 1375 insertions(+), 52 deletions(-) create mode 100644 configs/alarmo/automations-alarm.yaml create mode 100644 configs/esphome/humidity-sensor.yaml create mode 100644 configs/frigate/config.yaml.example create mode 100644 configs/homeassistant/configuration.yaml.example create mode 100644 configs/zigbee2mqtt/configuration.yaml.example create mode 100644 docs/architecture.md create mode 100644 docs/automations-overview.md create mode 100644 docs/network-diagram.md create mode 100644 docs/security-policy.md diff --git a/configs/alarmo/automations-alarm.yaml b/configs/alarmo/automations-alarm.yaml new file mode 100644 index 0000000..8165ee9 --- /dev/null +++ b/configs/alarmo/automations-alarm.yaml @@ -0,0 +1,350 @@ +# automations-alarm.yaml – Alarmo & Sécurité +# Automatisations liées au système d'alarme +# Version anonymisée — noms, pièces et identifiants remplacés + +# ───────────────────────────────────────────── +# DÉCLENCHEMENT ALARME +# ───────────────────────────────────────────── + +- alias: Notification déclenchement alarme + description: Envoie un message de notification quand l'alarme est déclenchée + triggers: + - trigger: state + entity_id: alarm_control_panel.alarmo + to: triggered + actions: + - action: telegram_bot.send_message + data: + message: "Alarme déclenchée !" + target: + - !secret telegram_chat_user1 + - !secret telegram_chat_user2 + +- alias: Notification alarme mode absence prolongée + description: Notifie les contacts d'urgence en mode absence prolongée + triggers: + - trigger: state + entity_id: alarm_control_panel.alarmo + from: armed_vacation + to: triggered + actions: + - action: notify.mobile_app_contact_1 + data: + message: "Alarme déclenchée !" + title: "Alarme domicile" + - action: notify.mobile_app_contact_2 + data: + title: "Alarme domicile" + message: "ALARME DÉCLENCHÉE" + +- alias: Snapshots caméra principale sur alarme + description: Envoie plusieurs photos + vidéo de la caméra principale sur déclenchement + triggers: + - trigger: state + entity_id: alarm_control_panel.alarmo + to: triggered + actions: + - repeat: + count: 3 + sequence: + - action: camera.snapshot + data: + filename: /config/www/tmp1.jpg + target: + entity_id: camera.camera_principale + - action: telegram_bot.send_photo + data: + verify_ssl: true + file: /config/www/tmp1.jpg + target: + - !secret telegram_chat_user1 + - !secret telegram_chat_user2 + - delay: + seconds: 1 + - action: camera.record + data: + filename: /config/www/clip1.mp4 + duration: 10 + target: + entity_id: camera.camera_principale + - action: telegram_bot.send_video + data: + verify_ssl: true + file: /config/www/clip1.mp4 + target: + - !secret telegram_chat_user1 + - !secret telegram_chat_user2 + +- alias: Snapshots caméra secondaire sur alarme + description: Envoie plusieurs photos + vidéo de la caméra secondaire sur déclenchement + triggers: + - trigger: state + entity_id: alarm_control_panel.alarmo + to: triggered + actions: + - repeat: + count: 3 + sequence: + - action: camera.snapshot + data: + filename: /config/www/tmp2.jpg + target: + entity_id: camera.camera_secondaire + - action: telegram_bot.send_photo + data: + verify_ssl: true + file: /config/www/tmp2.jpg + target: + - !secret telegram_chat_user1 + - !secret telegram_chat_user2 + - delay: + seconds: 1 + - action: camera.record + data: + filename: /config/www/clip2.mp4 + duration: 10 + target: + entity_id: camera.camera_secondaire + - action: telegram_bot.send_video + data: + verify_ssl: true + file: /config/www/clip2.mp4 + target: + - !secret telegram_chat_user1 + - !secret telegram_chat_user2 + +# ───────────────────────────────────────────── +# ARMEMENT / DÉSARMEMENT +# ───────────────────────────────────────────── + +- alias: Notification armement alarme + description: Confirme l'armement par notification + triggers: + - trigger: state + entity_id: alarm_control_panel.alarmo + to: armed_away + actions: + - action: telegram_bot.send_message + data: + message: "Alarme armée." + title: "Alarme activée" + target: !secret telegram_chat_user1 + - action: telegram_bot.send_message + data: + message: "Alarme armée." + title: "Alarme activée" + target: !secret telegram_chat_user2 + +- alias: Notification désarmement alarme + description: Confirme le désarmement par notification + triggers: + - trigger: state + entity_id: alarm_control_panel.alarmo + to: disarmed + actions: + - action: telegram_bot.send_message + data: + message: "Alarme désactivée." + title: "Alarme désactivée" + target: + - !secret telegram_chat_user1 + - !secret telegram_chat_user2 + +- alias: Désarmement via commande Telegram + description: Désarme l'alarme via commande bot Telegram + triggers: + - trigger: event + event_type: telegram_callback + event_data: + command: /desactive_alarme + actions: + - action: alarmo.disarm + data: + entity_id: alarm_control_panel.alarmo + +- alias: Armement via commande Telegram + description: Arme en mode absence prolongée via commande bot Telegram + triggers: + - trigger: event + event_type: telegram_callback + event_data: + command: /arme_alarme + actions: + - action: alarmo.arm + data: + entity_id: alarm_control_panel.alarmo + mode: vacation + +# ───────────────────────────────────────────── +# SURVEILLANCE À DISTANCE +# ───────────────────────────────────────────── + +- alias: Envoi photos à la demande + description: Envoie des photos de toutes les caméras sur commande Telegram + triggers: + - trigger: event + event_type: telegram_callback + event_data: + command: /photos + actions: + - repeat: + count: 5 + sequence: + - action: camera.snapshot + data: + filename: /config/www/tmp1.jpg + target: + entity_id: camera.camera_principale + - action: telegram_bot.send_photo + data: + verify_ssl: true + file: /config/www/tmp1.jpg + target: + - !secret telegram_chat_user1 + - !secret telegram_chat_user2 + - action: camera.snapshot + data: + filename: /config/www/tmp2.jpg + target: + entity_id: camera.camera_secondaire + - action: telegram_bot.send_photo + data: + verify_ssl: true + file: /config/www/tmp2.jpg + target: + - !secret telegram_chat_user1 + - !secret telegram_chat_user2 + +# ───────────────────────────────────────────── +# SIRÈNE ZIGBEE +# ───────────────────────────────────────────── + +- alias: Contrôle sirène Zigbee + description: Publie le mode sirène (burglar/stop) selon l'état de l'input_boolean + triggers: + - trigger: state + entity_id: input_boolean.sirene_switch + actions: + - action: mqtt.publish + data: + topic: zigbee2mqtt/sirene/set + payload_template: > + {% if is_state('input_boolean.sirene_switch', 'on') %} + {"warning": {"mode": "burglar"}} + {% else %} + {"warning": {"mode": "stop"}} + {% endif %} + +# ───────────────────────────────────────────── +# INTÉGRATIONS CONDITIONNELLES +# ───────────────────────────────────────────── + +- alias: Détection Frigate selon état alarme + description: Active/désactive la détection Frigate selon l'état de l'alarme + triggers: + - trigger: state + entity_id: alarm_control_panel.alarmo + actions: + - if: + - condition: state + entity_id: alarm_control_panel.alarmo + state: disarmed + then: + - type: turn_off + device_id: DEVICE_ID_CAMERA_1 + entity_id: switch.frigate_detect_camera_1 + domain: switch + - type: turn_off + device_id: DEVICE_ID_CAMERA_2 + entity_id: switch.frigate_detect_camera_2 + domain: switch + else: + - type: turn_on + device_id: DEVICE_ID_CAMERA_1 + entity_id: switch.frigate_detect_camera_1 + domain: switch + - type: turn_on + device_id: DEVICE_ID_CAMERA_2 + entity_id: switch.frigate_detect_camera_2 + domain: switch + +- alias: Extinction lumières à l'armement + description: Éteint toutes les lumières quand l'alarme passe en mode arming + triggers: + - trigger: state + entity_id: alarm_control_panel.alarmo + from: disarmed + to: arming + actions: + - type: turn_off + device_id: DEVICE_ID_LUMIERE_1 + entity_id: switch.lumiere_1 + domain: switch + - type: turn_off + device_id: DEVICE_ID_LUMIERE_2 + entity_id: switch.lumiere_2 + domain: switch + - type: turn_off + device_id: DEVICE_ID_LUMIERE_3 + entity_id: light.lumiere_3 + domain: light + - type: turn_off + device_id: DEVICE_ID_LUMIERE_4 + entity_id: light.lumiere_4 + domain: light + +- alias: Éclairage plantes en absence + description: Active l'éclairage des plantes à pleine puissance quand absent depuis 5 min + triggers: + - trigger: state + entity_id: alarm_control_panel.alarmo + to: armed_away + for: + minutes: 5 + actions: + - type: turn_on + device_id: DEVICE_ID_LUMIERE_PLANTES_1 + entity_id: light.lumiere_plantes_1 + domain: light + brightness_pct: 100 + - type: turn_on + device_id: DEVICE_ID_LUMIERE_PLANTES_2 + entity_id: light.lumiere_plantes_2 + domain: light + brightness_pct: 100 + +# ───────────────────────────────────────────── +# CLAVIER PHYSIQUE (BLUEPRINT) +# ───────────────────────────────────────────── + +- alias: Clavier physique avec Alarmo + description: Armement/désarmement via clavier Zigbee à code PIN + use_blueprint: + path: Bygood91/frient_keypad_with_alarmo.yaml + input: + z2m_keypad_path: zigbee2mqtt/clavier + z2m_keypad_path_set: zigbee2mqtt/clavier/set + pin_list: !secret alarmo_pin + control_panel: alarm_control_panel.alarmo + pin_control_panel: !secret alarmo_pin + action_arming: + - device_id: DEVICE_ID_ALARMO + domain: alarm_control_panel + entity_id: alarm_control_panel.alarmo + type: arm_away + action_disarmed: + - device_id: DEVICE_ID_ALARMO + domain: alarm_control_panel + entity_id: alarm_control_panel.alarmo + type: disarm + code: !secret alarmo_pin + action_alarm: + - device_id: DEVICE_ID_ALARMO + domain: alarm_control_panel + entity_id: alarm_control_panel.alarmo + type: trigger + action_armed_night: + - device_id: DEVICE_ID_ALARMO + domain: alarm_control_panel + entity_id: alarm_control_panel.alarmo + type: arm_night diff --git a/configs/esphome/humidity-sensor.yaml b/configs/esphome/humidity-sensor.yaml new file mode 100644 index 0000000..419c3a8 --- /dev/null +++ b/configs/esphome/humidity-sensor.yaml @@ -0,0 +1,73 @@ +# humidity-sensor.yaml – ESPHome +# Capteur d'humidité du sol sur ESP32 +# Mesure la résistance du sol via deux sondes métalliques + +esphome: + name: capteur-plantes + friendly_name: Capteur Plantes + +esp32: + board: esp32dev + framework: + type: arduino + +# Logs série +logger: + +# API Home Assistant +api: + encryption: + key: !secret esphome_api_key + +# OTA updates +ota: + - platform: esphome + password: !secret esphome_ota_password + +wifi: + ssid: !secret wifi_ssid + password: !secret wifi_password + ap: + ssid: "Capteur-Plantes Fallback" + password: !secret esphome_ap_password + +captive_portal: + +# ───────────────────────────────────────────── +# CAPTEUR D'HUMIDITÉ DU SOL +# Principe : lecture analogique de la résistance du sol +# Sol sec = haute résistance = valeur haute +# Sol humide = faible résistance = valeur basse +# ───────────────────────────────────────────── + +sensor: + - platform: adc + pin: GPIO34 + name: "Humidité Sol Plante 1" + id: soil_moisture_raw + update_interval: 60s + unit_of_measurement: "%" + accuracy_decimals: 1 + attenuation: auto + # Calibration : ajuster min/max selon votre sol et vos sondes + filters: + - calibrate_linear: + - 3.0 -> 0.0 # Sol sec (ajuster selon calibration) + - 1.1 -> 100.0 # Sol saturé (ajuster selon calibration) + - clamp: + min_value: 0 + max_value: 100 + on_value: + then: + - if: + condition: + sensor.in_range: + id: soil_moisture_raw + below: 30.0 + then: + - logger.log: "Sol sec ! Arrosage nécessaire." + + # Température interne ESP32 (monitoring) + - platform: internal_temperature + name: "Température ESP32" + update_interval: 300s diff --git a/configs/frigate/config.yaml.example b/configs/frigate/config.yaml.example new file mode 100644 index 0000000..a25e95c --- /dev/null +++ b/configs/frigate/config.yaml.example @@ -0,0 +1,167 @@ +# config.yaml – Frigate NVR +# Version anonymisée — IPs et credentials remplacés +# Documentation : https://docs.frigate.video/configuration/ + +# ───────────────────────────────────────────── +# MQTT – Connexion au broker Mosquitto local +# ───────────────────────────────────────────── + +mqtt: + enabled: true + host: 192.168.1.X # IP du serveur HAOS + port: 1883 + user: mqtt + password: "{FRIGATE_MQTT_PASSWORD}" # Variable d'env ou secrets Frigate + topic_prefix: frigate + client_id: frigate + stats_interval: 60 + +# ───────────────────────────────────────────── +# DÉTECTEUR D'OBJETS +# CPU par défaut — décommenter pour accélération matérielle +# ───────────────────────────────────────────── + +detectors: + cpu1: + type: cpu + num_threads: 3 + +# Pour Coral USB (recommandé si disponible) : +# detectors: +# coral: +# type: edgetpu +# device: usb + +# ───────────────────────────────────────────── +# BASE DE DONNÉES +# ───────────────────────────────────────────── + +database: + path: /config/frigate.db + +# ───────────────────────────────────────────── +# STOCKAGE – Enregistrements et clips +# ───────────────────────────────────────────── + +record: + enabled: true + retain: + days: 3 + mode: motion # N'enregistre que les segments avec mouvement + events: + retain: + default: 10 # Jours de rétention des événements (clips) + mode: motion + +snapshots: + enabled: true + bounding_box: true # Encadre l'objet détecté + crop: false + retain: + default: 10 + +# ───────────────────────────────────────────── +# CAMÉRAS +# ───────────────────────────────────────────── + +cameras: + + # Caméra principale (pièce de vie) + camera_principale: + enabled: true + ffmpeg: + inputs: + - path: rtsp://admin:{CAMERA_PASSWORD}@192.168.1.X:554/stream1 + roles: + - detect + - record + # Optimisations décodage (réduire la charge CPU) + input_args: preset-rtsp-restream + output_args: + record: preset-record-generic-audio-copy + detect: + enabled: false # Activé/désactivé dynamiquement par Home Assistant + width: 1920 + height: 1080 + fps: 5 + objects: + track: + - person + filters: + person: + min_area: 5000 # Ignorer les petites détections (faux positifs) + max_area: 100000 + threshold: 0.7 + motion: + threshold: 25 + contour_area: 100 + mask: + - 0,0,0,200,400,200,400,0 # Masquer zone statique si besoin + record: + retain: + days: 3 + snapshots: + retain: + default: 10 + + # Caméra secondaire (entrée / autre pièce) + camera_secondaire: + enabled: true + ffmpeg: + inputs: + - path: rtsp://admin:{CAMERA_PASSWORD}@192.168.1.X:554/stream1 + roles: + - detect + - record + input_args: preset-rtsp-restream + output_args: + record: preset-record-generic-audio-copy + detect: + enabled: false + width: 1920 + height: 1080 + fps: 5 + objects: + track: + - person + filters: + person: + min_area: 5000 + threshold: 0.7 + motion: + threshold: 25 + contour_area: 100 + record: + retain: + days: 3 + snapshots: + retain: + default: 10 + + # Caméra chambre – privacy géré via switch Home Assistant + camera_chambre: + enabled: true + ffmpeg: + inputs: + - path: rtsp://admin:{CAMERA_PASSWORD}@192.168.1.X:554/stream1 + roles: + - detect + detect: + enabled: false # Désactivé par défaut (usage ponctuel) + width: 1280 + height: 720 + fps: 5 + objects: + track: + - person + # Note : le mode privacy est piloté côté HA via switch.camera_privacy + # Frigate voit simplement le flux coupé ou actif + +# ───────────────────────────────────────────── +# UI FRIGATE +# ───────────────────────────────────────────── + +ui: + live_mode: mse # mse | webrtc | jsmpeg + timezone: Europe/Paris + use_experimental_ui: false diff --git a/configs/homeassistant/configuration.yaml.example b/configs/homeassistant/configuration.yaml.example new file mode 100644 index 0000000..e23d84c --- /dev/null +++ b/configs/homeassistant/configuration.yaml.example @@ -0,0 +1,128 @@ +# configuration.yaml – Home Assistant OS +# Version anonymisée — secrets externalisés dans secrets.yaml + +# ───────────────────────────────────────────── +# CORE +# ───────────────────────────────────────────── + +# Charge les intégrations par défaut (UI, historique, log, etc.) +default_config: + +frontend: + themes: !include_dir_merge_named themes + +automation: !include automations.yaml +script: !include scripts.yaml +scene: !include scenes.yaml + +# ───────────────────────────────────────────── +# HTTP – Proxy inverse Cloudflare +# L'accès distant passe par le tunnel Cloudflared (sortant). +# L'administration passe par WireGuard hébergé sur le serveur Proxmox. +# ───────────────────────────────────────────── + +http: + use_x_forwarded_for: true + trusted_proxies: + - 172.30.33.0/24 # Réseau interne add-on Cloudflared + # Pas de WireGuard sur HAOS — le serveur VPN est sur le Proxmox (LXC dédié) + +# ───────────────────────────────────────────── +# NOTIFICATIONS – Bot Telegram +# ───────────────────────────────────────────── + +telegram_bot: + - platform: polling + api_key: !secret telegram_bot_token + allowed_chat_ids: + - !secret telegram_chat_user1 + - !secret telegram_chat_user2 + +notify: + - platform: telegram + name: user1 + chat_id: !secret telegram_chat_user1 + - platform: telegram + name: user2 + chat_id: !secret telegram_chat_user2 + +# ───────────────────────────────────────────── +# INPUT BOOLEANS – Switchs virtuels dashboard +# ───────────────────────────────────────────── + +input_boolean: + # Scènes lumière + sunset_switch: + name: Scène lumière ambiante + initial: off + led_bar_switch: + name: Barre LED + initial: off + + # Appareils IR + ventilo_switch: + name: Ventilateur + initial: off + diffuseur_switch: + name: Diffuseur arômes + initial: off + + # Alarme & Sécurité + sirene_switch: + name: Sirène + initial: off + camera_privacy_switch: + name: Caméra privacy + initial: off + + # Maître automatisations + master_automatisations: + name: Automatisations On/Off + initial: on + +# ───────────────────────────────────────────── +# SENSORS +# ───────────────────────────────────────────── + +sensor: !include sensors.yaml + +# ───────────────────────────────────────────── +# TEMPLATE – Switch caméra avec inversion privacy +# Le switch HA représente l'état "caméra visible" +# alors que l'entité physique est un switch "privacy" (logique inversée) +# ───────────────────────────────────────────── + +template: + - switch: + - name: Caméra + unique_id: camera_privacy_template + state: "{{ is_state('switch.camera_privacy', 'off') }}" + icon: > + {% if is_state('switch.camera_privacy', 'off') %} + mdi:cctv + {% else %} + mdi:cctv-off + {% endif %} + turn_on: + - action: switch.turn_off + target: + entity_id: switch.camera_privacy + turn_off: + - action: switch.turn_on + target: + entity_id: switch.camera_privacy + +# ───────────────────────────────────────────── +# HOMEKIT (optionnel) +# Expose certaines entités vers Apple Home +# ───────────────────────────────────────────── + +# homekit: +# - name: HAOS Bridge +# port: 21063 +# filter: +# include_domains: +# - light +# - switch +# - climate +# - alarm_control_panel diff --git a/configs/zigbee2mqtt/configuration.yaml.example b/configs/zigbee2mqtt/configuration.yaml.example new file mode 100644 index 0000000..3ff6949 --- /dev/null +++ b/configs/zigbee2mqtt/configuration.yaml.example @@ -0,0 +1,66 @@ +# configuration.yaml – Zigbee2MQTT +# Version anonymisée — clés réseau et mots de passe remplacés +# Adaptateur : Sonoff Zigbee 3.0 USB Dongle Plus V2 (ember) + +version: 5 + +mqtt: + base_topic: zigbee2mqtt + server: mqtt://core-mosquitto:1883 + user: mqtt + password: !secret mqtt_password # À définir dans secrets.yaml + +serial: + baudrate: 115200 + rtscts: false + # Adapter le port selon votre installation : + port: /dev/serial/by-id/usb-Itead_Sonoff_Zigbee_3.0_USB_Dongle_Plus_V2_XXXXXXXXXXXXXXXX-if00-port0 + adapter: ember + +advanced: + log_level: info + channel: 11 + network_key: GENERATE # Générer via : zigbee2mqtt/bridge/request/options + pan_id: GENERATE # Générer automatiquement + +frontend: + enabled: true + port: 8099 + +homeassistant: + enabled: true + legacy_action_sensor: false + base_topic: zigbee2mqtt + force_disable_retain: false + include_device_information: false + keepalive: 60 + maximum_packet_size: 1048576 + reject_unauthorized: true + server: mqtt://core-mosquitto:1883 + user: mqtt + version: 4 + experimental_event_entities: false + +# Appareils Zigbee enregistrés +# Les adresses MAC sont propres à chaque installation +devices: + '0xXXXXXXXXXXXXXXXX': + friendly_name: ir blaster 1 + '0xXXXXXXXXXXXXXXXX': + friendly_name: ir blaster 2 + '0xXXXXXXXXXXXXXXXX': + friendly_name: sirene + '0xXXXXXXXXXXXXXXXX': + friendly_name: capteur fuite 1 + '0xXXXXXXXXXXXXXXXX': + friendly_name: Lampe rouge + '0xXXXXXXXXXXXXXXXX': + friendly_name: Bouton entree + '0xXXXXXXXXXXXXXXXX': + friendly_name: clavier + '0xXXXXXXXXXXXXXXXX': + friendly_name: Lampesdb2 + '0xXXXXXXXXXXXXXXXX': + friendly_name: Lampesdb1 + '0xXXXXXXXXXXXXXXXX': + friendly_name: bouton sdb diff --git a/docs/architecture.md b/docs/architecture.md new file mode 100644 index 0000000..e89d010 --- /dev/null +++ b/docs/architecture.md @@ -0,0 +1,64 @@ +# Architecture – HAOS Project + +## Vue d'ensemble + +L'infrastructure repose sur Home Assistant OS installé en natif sur un mini-PC dédié, fonctionnant 24h/24. + +## Stack technique + +| Couche | Technologie | +| ------------------- | ------------------------------------ | +| OS domotique | Home Assistant OS (HAOS) | +| Broker MQTT | Mosquitto (add-on officiel) | +| Réseau Zigbee | Zigbee2MQTT + Sonoff Dongle Plus V2 | +| NVR | Frigate | +| Alarme | Alarmo | +| Tunnel sortant | Cloudflared (add-on officiel) | +| VPN | WireGuard (add-on officiel) | +| Capteurs custom | ESPHome (add-on officiel) | +| Notifications | Telegram Bot API | +| Énergie | Intégration Enedis officielle | +| Chauffage | Heatzy (intégration HACS) | + +## Flux de données + +``` +Équipements Zigbee + │ + ▼ (radio Zigbee 2.4GHz) +Sonoff USB Dongle + │ + ▼ (USB) +Zigbee2MQTT ──► Mosquitto MQTT ──► Home Assistant + │ + ├── Alarmo + ├── Frigate (RTSP) + ├── ESPHome (Wi-Fi) + ├── Heatzy (Cloud API) + └── Enedis (Cloud API) +``` + +## Accès réseau + +``` +Internet + │ + ▼ (HTTPS sortant uniquement) +Cloudflare + │ + ▼ (tunnel chiffré) +Cloudflared add-on + │ + ▼ +Home Assistant (LAN) + │ + └── WireGuard VPN (admin SSH/Samba uniquement) +``` + +## Principes de sécurité + +- **Zéro port ouvert** sur la box/routeur +- **Tunnel sortant** uniquement (Cloudflared) pour l'accès web +- **VPN WireGuard** obligatoire pour toute administration (SSH, Samba) +- **Données locales** : vidéo, Zigbee, capteurs ESPHome restent sur le réseau local +- **Moindre privilège** : chaque service n'accède qu'à ce dont il a besoin diff --git a/docs/automations-overview.md b/docs/automations-overview.md new file mode 100644 index 0000000..e05a44b --- /dev/null +++ b/docs/automations-overview.md @@ -0,0 +1,84 @@ +# Automatisations – Vue d'ensemble + +## Statistiques + +| Domaine | Nombre d'automatisations | +| ----------------- | ------------------------ | +| Alarme & Sécurité | 15 | +| Éclairage | 9 | +| Chauffage | 4 | +| Ventilation & IR | 5 | +| Capteurs | 3 | +| **Total** | **~36 actives** | + +> Des scripts et scènes additionnels complètent les automatisations pour atteindre plus de 50 logiques conditionnelles. + +--- + +## Alarme & Sécurité + +| Fonction | Déclencheur | Action | +| --------------------------------- | --------------------------------- | ------------------------------------------------ | +| Notification déclenchement | Alarme triggered | Message + bouton désactivation (bot Telegram) | +| Notification absence prolongée | Alarme triggered (vacation) | Notification contacts d'urgence (mobile) | +| Snapshots caméra principale | Alarme triggered | 3 photos + vidéo 10s → Telegram | +| Snapshots caméra secondaire | Alarme triggered | 3 photos + vidéo 10s → Telegram | +| Photos à la demande | Commande Telegram | Envoi en boucle des caméras → Telegram | +| Notification armement | armed_away | Confirmation armement → Telegram | +| Notification désarmement | disarmed | Confirmation désarmement → Telegram | +| Désarmement Telegram | Commande bot Telegram | Désarmement Alarmo | +| Armement Telegram | Commande bot Telegram | Armement mode vacation | +| Contrôle sirène Zigbee | input_boolean sirène | MQTT → sirène mode burglar/stop (template) | +| Clavier physique (blueprint) | Clavier Zigbee à code | Arm/Disarm/Night avec code PIN | +| Détection Frigate selon alarme | État alarme (any) | Active/désactive détection caméras | +| Extinction lumières à l'armement | disarmed → arming | Extinction de toutes les lumières | +| Éclairage plantes en absence | armed_away + 5 min | Lumières plantes à 100% | + +--- + +## Éclairage + +| Fonction | Déclencheur | Action | +| ------------------------------- | ---------------------------------- | ---------------------------------- | +| Lumière auto sur mouvement | Capteur PIR | Allumage + extinction après 5 min | +| Toggle lampe via bouton Zigbee | Action bouton Zigbee (single) | Toggle lampe | +| Allumage automatique au retour | Alarme disarmed (retour) | Allumage lampe entrée | +| Toggle lumières via bouton | Action bouton Zigbee (single) | Toggle groupe de lumières | +| Allumage automatique matin | Heure fixe (matin) | Allumage lumière programmée | +| Extinction automatique soir | Heure fixe (soir) | Extinction lumière programmée | +| Éclairage plantes en absence | armed_away + 5 min | Lumières plantes 100% | +| Scène lumière ambiante | input_boolean switch | Scène IR on/off | +| Toggle barre LED | input_boolean switch | Toggle LED via IR | + +--- + +## Chauffage + +| Fonction | Déclencheur | Action | +| --------------------- | ----------------- | ----------------------- | +| Chauffe matin (on) | Heure fixe | Radiateurs → heat | +| Chauffe matin (off) | Heure fixe | Radiateurs → auto | +| Chauffe soir (on) | Heure fixe | Radiateurs → heat | +| Chauffe soir (off) | Heure fixe | Radiateurs → auto | + +--- + +## Ventilation & IR Blaster + +| Fonction | Déclencheur | Action | +| ------------------ | ------------------------ | ----------------------- | +| Toggle ventilateur | input_boolean switch | Script toggle IR | +| Toggle on/off | Manuel (script) | Code IR on/off | +| Puissance | Manuel (script) | Code IR power | +| Rotation | Manuel (script) | Code IR rotation | +| Mode | Manuel (script) | Code IR mode | + +--- + +## Capteurs & Divers + +| Fonction | Déclencheur | Action | +| --------------------------- | ----------------------------- | ----------------------------------- | +| Alerte fuite d'eau | Capteur humidité (20s) | Notification Telegram | +| Privacy caméra | input_boolean switch | Toggle mode privacy caméra | +| Diffuseur arômes | input_boolean switch | Séquence IR on/off diffuseur | diff --git a/docs/network-diagram.md b/docs/network-diagram.md new file mode 100644 index 0000000..478480c --- /dev/null +++ b/docs/network-diagram.md @@ -0,0 +1,171 @@ +# Diagramme réseau – HAOS Project + +## Vue d'ensemble + +```text + INTERNET + │ + ┌──────────────┴──────────────┐ + │ │ + ┌─────────▼─────────┐ ┌───────────▼───────────┐ + │ Cloudflare CDN │ │ Admin (mobile / PC) │ + │ (DNS + Tunnel) │ │ Client WireGuard │ + └─────────┬─────────┘ └───────────┬───────────┘ + │ Tunnel chiffré (sortant) │ UDP :51820 + ┌─────────▼─────────────────────────────▼───────────┐ + │ Box / Routeur │ + │ 192.168.1.1 │ + │ 1 seul port ouvert : UDP 51820 (WireGuard) │ + └──────────────────────┬─────────────────────────────┘ + │ LAN 192.168.1.0/24 + ┌─────────────────┼──────────────────┐ + │ │ │ +┌─────────▼────────┐ ┌─────▼──────────┐ ┌───▼──────────────────┐ +│ Mini-PC Proxmox │ │ Mini-PC HAOS │ │ Équipements IoT │ +│ 192.168.1.Y │ │ 192.168.1.X │ │ (Wi-Fi / Zigbee) │ +│ │ │ │ │ │ +│ ┌──────────────┐ │ │ ┌────────────┐ │ │ • Caméras IP (RTSP) │ +│ │ WireGuard │ │ │ │Home Asst. │ │ │ • ESP32 ESPHome │ +│ │ LXC :51820 │ │ │ │:8123 │ │ │ • Radiateurs Heatzy │ +│ └──────┬───────┘ │ │ ├────────────┤ │ └──────────────────────┘ +│ │ VPN │ │ │Mosquitto │ │ +│ │tunnel │ │ │MQTT :1883 │ │ ┌──────────────────────┐ +│ ▼ LAN │ │ ├────────────┤ │ │ Réseau Zigbee │ +│ ┌──────────────┐ │ │ │Zigbee2MQTT │◄├──│ Canal 11 / 2.4GHz │ +│ │ Apache │ │ │ │UI :8099 │ │ │ │ +│ │ Guacamole │ │ │ ├────────────┤ │ │ • Sirène │ +│ │ (CF Tunnel) │ │ │ │Frigate NVR │ │ │ • Capteur fuite │ +│ └──────────────┘ │ │ │:5000/:1984 │ │ │ • Boutons Zigbee │ +│ │ │ ├────────────┤ │ │ • IR Blasters │ +│ (cf. pve-project)│ │ │Cloudflared │ │ │ • Clavier à code │ +└──────────────────┘ │ │(tunnel out)│ │ │ • Ampoules │ + │ └────────────┘ │ └──────────────────────┘ + └────────────────┘ +``` + +--- + +## Rôles des machines + +| Machine | IP | Rôle | +| -------------- | ------------- | -------------------------------------------------- | +| Box / Routeur | 192.168.1.1 | Passerelle, NAT, 1 port ouvert (UDP 51820) | +| Mini-PC Proxmox| 192.168.1.Y | WireGuard VPN (LXC), Guacamole, OPNsense, lab | +| Mini-PC HAOS | 192.168.1.X | Home Assistant OS + tous les services domotiques | + +> Le serveur WireGuard est hébergé sur le **Proxmox** (LXC dédié), pas sur HAOS. +> L'accès VPN donne un accès au LAN complet, donc aussi à HAOS et ses interfaces d'admin. + +--- + +## Adressage réseau + +| Service | Hôte | Port | Protocole | Accessible depuis | +| ------------------- | -------------- | ---------- | ---------- | ----------------------- | +| Home Assistant | 192.168.1.X | 8123 | HTTP/WS | LAN + CF Tunnel | +| Mosquitto MQTT | 192.168.1.X | 1883 | MQTT (TCP) | LAN uniquement | +| Zigbee2MQTT UI | 192.168.1.X | 8099 | HTTP | LAN + VPN | +| Frigate (UI) | 192.168.1.X | 5000 | HTTP | LAN + VPN | +| Frigate (RTSP out) | 192.168.1.X | 1984 | RTSP | LAN uniquement | +| WireGuard VPN | 192.168.1.Y | 51820 | UDP | WAN (port ouvert) | +| Guacamole | 192.168.1.Y | — | HTTPS | CF Tunnel (Proxmox) | +| Caméras IP | 192.168.1.X+n | 554 | RTSP | LAN uniquement | +| ESP32 ESPHome | 192.168.1.X+n | — | mDNS/HTTP | LAN uniquement | + +--- + +## Flux réseau détaillés + +### Accès HAOS distant (HTTPS) + +```text +Utilisateur + │ + ▼ HTTPS :443 +Cloudflare Edge + │ + ▼ Tunnel QUIC chiffré (connexion sortante depuis HAOS) +Cloudflared add-on (Mini-PC HAOS) + │ + ▼ HTTP local +Home Assistant :8123 +``` + +### Administration SSH / Zigbee2MQTT / Frigate + +```text +Admin + │ + ▼ UDP :51820 +WireGuard LXC (Proxmox, 192.168.1.Y) + │ + ▼ Tunnel VPN → LAN 192.168.1.0/24 +Mini-PC HAOS :8099 (Z2M) / :5000 (Frigate) / SSH +``` + +### Flux Zigbee → Home Assistant + +```text +Équipement Zigbee + │ Radio 2.4GHz + ▼ +Sonoff USB Dongle (coordinateur, USB sur HAOS) + │ Série USB + ▼ +Zigbee2MQTT (add-on HAOS) + │ MQTT publish + ▼ +Mosquitto :1883 (add-on HAOS) + │ MQTT subscribe + ▼ +Home Assistant +``` + +### Flux caméras → Frigate → Home Assistant + +```text +Caméra IP + │ RTSP :554 (LAN) + ▼ +Frigate NVR (add-on HAOS — décodage + détection CPU) + ├─▼ Événements MQTT → Mosquitto → Home Assistant + ├─▼ Snapshots → /config/www/ + └─▼ Enregistrements → /media/frigate/ +``` + +### Flux ESPHome → Home Assistant + +```text +ESP32 (capteur sol) + │ Wi-Fi LAN + ▼ +ESPHome add-on (HAOS) + │ API native chiffrée (mDNS) + ▼ +Home Assistant +``` + +--- + +## WireGuard – Plage VPN (LXC Proxmox) + +| Interface | Adresse | Usage | +| ------------ | ------------- | -------------- | +| wg0 (serveur)| 10.0.0.1/24 | LXC Proxmox | +| Client 1 | 10.0.0.2/32 | Mobile admin | +| Client 2 | 10.0.0.3/32 | PC admin | + +Les clients VPN ont accès au LAN `192.168.1.0/24` via la route configurée dans WireGuard, ce qui inclut HAOS (`192.168.1.X`) et Proxmox (`192.168.1.Y`). + +--- + +## Segmentation et isolation + +L'isolation des équipements IoT repose sur : + +- **Aucun accès WAN** configuré pour les caméras, ESP32 et équipements Zigbee +- **Flux RTSP** consommés uniquement par Frigate en local +- **MQTT non exposé** sur le WAN (port 1883 LAN only) +- **ESPHome** sans cloud (API locale uniquement) + +> Pour aller plus loin : VLAN IoT dédié sur switch manageable + règles firewall OPNsense (disponible sur le Proxmox — cf. `pve-project`). diff --git a/docs/security-policy.md b/docs/security-policy.md new file mode 100644 index 0000000..122b0ad --- /dev/null +++ b/docs/security-policy.md @@ -0,0 +1,95 @@ +# Politique de sécurité – HAOS Project + +## Principes fondamentaux + +### 1. Exposition réseau minimale + +Aucun port entrant n'est ouvert sur le routeur/box. + +| Service | Exposition | Détail | +| -------------- | -------------------- | ----------------------------------------- | +| Home Assistant | Tunnel sortant | Cloudflared → Cloudflare → domaine perso | +| SSH | VPN uniquement | Inaccessible hors WireGuard | +| Samba | LAN uniquement | Partage réseau local uniquement | +| MQTT | LAN uniquement | Mosquitto non exposé sur le WAN | +| Zigbee2MQTT | LAN uniquement | Interface web sur port 8099 (LAN) | + +### 2. Accès distant via tunnel sortant (Cloudflared) + +Le flux réseau est **sortant uniquement** depuis le serveur vers Cloudflare. + +``` +Utilisateur distant + │ + ▼ HTTPS + Cloudflare Edge + │ + ▼ Tunnel chiffré (WireGuard/QUIC) + Cloudflared add-on (HAOS) + │ + ▼ HTTP local + Home Assistant +``` + +Avantages : +- Aucun port ouvert sur la box +- IP publique non exposée +- HTTPS natif via certificat Cloudflare +- Protection DDoS Cloudflare incluse + +### 3. Administration via VPN (WireGuard) + +Toute administration système (SSH, Samba, Zigbee2MQTT UI) est restreinte au tunnel WireGuard. + +### 4. Données locales + +Les données sensibles ne transitent pas vers des clouds tiers : + +| Donnée | Traitement | Justification | +| --------------- | ----------- | ----------------------------------- | +| Flux vidéo | Local | Frigate NVR sur le serveur | +| Réseau Zigbee | Local | Zigbee2MQTT + Mosquitto locaux | +| Capteurs ESP32 | Local | ESPHome sur réseau local | +| Enedis | API officielle | Données de consommation uniquement | +| Heatzy | API officielle | Commandes chauffage uniquement | + +### 5. Principe du moindre privilège + +- Services limités au strict nécessaire +- Chaque add-on n'a accès qu'à ses ressources propres +- Mot de passe MQTT dédié (non partagé) +- Code PIN alarme non stocké en clair dans les automatisations (secrets.yaml) + +### 6. Sauvegardes & Maintenance + +- Sauvegardes automatiques régulières de la configuration HAOS +- Mises à jour appliquées régulièrement (HAOS, add-ons, intégrations) +- Surveillance des logs (HAOS, Zigbee2MQTT, Frigate) + +## Gestion des secrets + +Tous les éléments sensibles sont stockés dans `secrets.yaml` (non commité) : + +```yaml +# secrets.yaml – NE PAS COMMITER +telegram_chat_alexis: "XXXXXXXXX" +telegram_chat_vanessa: "XXXXXXXXX" +mqtt_password: "XXXXXXXXX" +alarmo_pin: "XXXX" +wifi_ssid: "XXXXXXXXX" +wifi_password: "XXXXXXXXX" +esphome_api_key: "XXXXXXXXX" +esphome_ota_password: "XXXXXXXXX" +esphome_ap_password: "XXXXXXXXX" +``` + +## Ce que ce dépôt ne contient pas + +- ❌ Clés privées ou tokens +- ❌ Mots de passe (MQTT, Telegram, Wi-Fi) +- ❌ Adresses IP réelles du réseau local +- ❌ Clé réseau Zigbee (network_key) +- ❌ PAN ID / Extended PAN ID Zigbee +- ❌ Adresses MAC des équipements Zigbee +- ❌ Code PIN de l'alarme +- ❌ Chat ID Telegram diff --git a/readme.md b/readme.md index b9742e2..9750bc3 100644 --- a/readme.md +++ b/readme.md @@ -10,10 +10,11 @@ Ce projet est une **infrastructure domotique opérationnelle** tournant 24/7 sur **Usages principaux :** -- Surveillance et sécurisation du logement (alarme, vidéo) -- Automatisation du quotidien (chauffage, présence, éclairage) +- Surveillance et sécurisation du logement (alarme, vidéo, détection fuite) +- Automatisation du quotidien (chauffage, présence, éclairage, ventilation) - Optimisation énergétique (suivi Enedis, pilotage des radiateurs) -- Expérimentation IoT maîtrisée (capteurs custom ESPHome/ESP32) +- Expérimentation IoT maîtrisée (capteurs custom ESPHome/ESP32, IR blaster) +- Notifications en temps réel via **bot Telegram** --- @@ -28,27 +29,44 @@ Ce projet est une **infrastructure domotique opérationnelle** tournant 24/7 sur │ ┌──────────────────────┼───────────────────────┐ │ │ │ -┌────────▼────────┐ ┌────────▼────────┐ ┌─────────▼────────┐ -│ Sécurité │ │ IoT & Protocoles│ │ Accès & Admin │ -│ │ │ │ │ │ -│ • Alarmo │ │ • Zigbee2MQTT │ │ • Cloudflared │ -│ • Frigate (NVR) │ │ • ESPHome / ESP32│ │ (CF Tunnel) │ -│ • Détection IA │ │ • Heatzy │ │ • WireGuard VPN │ -│ • Notifications │ │ • Enedis │ │ • SSH / Samba │ -└─────────────────┘ └──────────────────┘ └──────────────────┘ +┌────────▼────────┐ ┌────────▼─────────┐ ┌────────▼─────────┐ +│ Sécurité │ │ IoT & Protocoles │ │ Accès & Admin │ +│ │ │ │ │ │ +│ • Alarmo │ │ • Zigbee2MQTT │ │ • Cloudflared │ +│ • Frigate (NVR) │ │ • ESPHome / ESP32 │ │ (CF Tunnel) │ +│ • Détection IA │ │ • Heatzy │ │ • WireGuard VPN │ +│ • Bot Telegram │ │ • Enedis │ │ • SSH / Samba │ +│ • Clavier Frient│ │ • IR Blaster │ │ │ +└─────────────────┘ └───────────────────┘ └──────────────────┘ ``` --- ## 🖥️ Infrastructure matérielle -| Composant | Détail | -| -------------- | ----------------------------------- | -| Machine | Mini-PC dédié | -| Stockage | SSD (fiabilité & performances) | -| Hyperviseur | Home Assistant OS (natif) | -| Coordinateur | Sonoff Zigbee USB Dongle | -| Fonctionnement | 24/7, environnement isolé | +| Composant | Détail | +| -------------- | ----------------------------------------------- | +| Machine | Mini-PC dédié | +| Stockage | SSD (fiabilité & performances) | +| Hyperviseur | Home Assistant OS (natif) | +| Coordinateur | Sonoff Zigbee 3.0 USB Dongle Plus V2 (ember) | +| Fonctionnement | 24/7, environnement isolé | + +--- + +## 📡 Équipements Zigbee supervisés + +| Nom | Type | Usage | +| --------------- | ---------------------- | ----------------------------------- | +| ir blaster 1 | Blaster IR | Pilotage ventilateur & diffuseur | +| ir blaster 2 | Blaster IR | Réserve / extension | +| sirene zigbee 1 | Sirène | Alarme intrusion (mode burglar) | +| capteur fuite 1 | Capteur d'eau | Détection fuite salle de bain | +| Lampe rouge | Ampoule connectée | Signalisation | +| Bouton entree | Bouton Zigbee | Toggle lampadaire entrée | +| Clavier frient | Clavier à code | Armement/désarmement alarme physique| +| Lampesdb1/2 | Ampoule connectée | Éclairage salle de bain | +| bouton sdb | Bouton Zigbee | Toggle lumières salle de bain | --- @@ -66,11 +84,11 @@ Accès HTTPS distant sans exposition de port sur le routeur. #### WireGuard VPN -Accès administration sécurisé réservé au tunnel privé. +Accès administration via le serveur WireGuard hébergé sur le Proxmox (LXC dédié — cf. `pve-project`). -- SSH restreint au VPN -- Partage Samba limité au LAN -- Aucun port d'administration exposé sur le WAN +- SSH et interfaces admin (Zigbee2MQTT, Frigate) accessibles via VPN uniquement +- Le seul port WAN ouvert (UDP 51820) est sur le Proxmox, pas sur HAOS +- HAOS ne fait tourner aucun serveur VPN --- @@ -78,32 +96,46 @@ Accès administration sécurisé réservé au tunnel privé. #### Alarmo – Système d'alarme personnalisé -Extension d'alarme intégrée nativement à Home Assistant. +Extension d'alarme intégrée nativement à Home Assistant, pilotée via Telegram et clavier physique. -- Armement / désarmement (présence, mode nuit, absence) -- Détection d'intrusion avec notifications instantanées -- Scénarios conditionnels selon les occupants +- Armement / désarmement (présence, mode nuit, absence, vacances) +- Clavier à code physique **Frient** pour armement/désarmement local +- Détection d'intrusion avec notifications instantanées via Telegram +- Snapshots et vidéos automatiques (caméras) envoyés sur déclenchement +- Extinction automatique des lumières à l'armement +- Activation de la lumière d'entrée au retour (désarmement) +- Activation Frigate détection uniquement quand alarme armée #### Frigate – NVR intelligent local Vidéosurveillance avec détection d'objets par intelligence artificielle. - Traitement local (aucun cloud vidéo) +- Caméras : principales et secondaires (avec mode privacy) - Réduction des faux positifs par reconnaissance d'objets -- Enregistrements internes et déclenchement automatique d'alertes +- Détection activée/désactivée automatiquement selon l'état de l'alarme - Preuves vidéo locales en cas d'incident +#### Bot Telegram – Notifications & télécommande + +Intégration Telegram bidirectionnelle pour la supervision et le contrôle à distance. + +- Alertes instantanées : déclenchement alarme, fuite d'eau, armement/désarmement +- Envoi de photos et vidéos des caméras sur événement +- Commande `/garde_alarme` : envoi en boucle de snapshots (caméras) +- Commande `/desactive_alarme` : désarmement à distance + --- ### 🌡️ Confort & Énergie #### Heatzy – Gestion du chauffage -Pilotage dynamique de radiateurs électriques connectés selon présence et horaires. +Pilotage dynamique de radiateurs électriques connectés selon des plages horaires fixes. -- Programmation horaire et adaptation à la présence -- Optimisation de la température pièce par pièce -- Réduction directe de la consommation énergétique +- Chauffe matin : 06h00 → 07h40 (mode heat) +- Chauffe soir : 18h00 → 21h00 (mode heat) +- Retour en mode `auto` hors plages #### Enedis – Suivi énergétique intelligent @@ -115,6 +147,37 @@ Intégration officielle du compteur Linky via l'API Enedis. --- +### 💡 Éclairage & Automatisations ambiantes + +- **Lumière automatique** : allumage automatique sur détection de mouvement (PIR), extinction après 5 min +- **Lampadaire entrée** : toggle via bouton Zigbee + allumage automatique au retour +- **Lumières SDB** : toggle via bouton Zigbee dédié +- **Suspension** : allumage à 07h00, extinction à 22h00 +- **Plantes (photosynthèse)** : lumières à 100% de luminosité quand alarme armée + 5 min (éclairage absent) +- **Lampes off à l'armement** : extinction de toutes les lumières au départ + +#### Scènes lumières avancées + +- **Sunset lamp** : scène lumière couchant de soleil via IR blaster (on/off) +- **LED bar** : pilotage barre LED décorative via IR (on/off) + +--- + +### 🌬️ Ventilation & Domotique IR + +Pilotage d'un ventilateur via **IR Blaster Zigbee** avec codes IR personnalisés. + +- Toggle on/off +- Contrôle de la puissance (mode) +- Rotation automatique +- Intégration dans le script `toggle_ventilo` + +#### Diffuseur d'huiles essentielles + +Pilotage via IR Blaster avec séquences de codes pour allumage/arrêt. + +--- + ### 🌿 IoT personnalisé – ESPHome #### Capteur d'humidité (ESP32) @@ -130,10 +193,11 @@ Capteur de sol développé sur mesure via ESPHome sur microcontrôleur ESP32. ### 📡 Réseau Zigbee local -Coordinateur : **Sonoff Zigbee USB Dongle** — géré via **Zigbee2MQTT**. +Coordinateur : **Sonoff Zigbee 3.0 USB Dongle Plus V2** — géré via **Zigbee2MQTT** (adaptateur `ember`, canal 11). - Aucun cloud tiers — données traitées localement -- Maîtrise complète des 15 équipements Zigbee supervisés +- Broker MQTT : **Mosquitto** (add-on natif HAOS) +- Proxy HTTP configuré pour Cloudflare (`trusted_proxies: 172.30.33.0/24`) - Protocole ouvert, compatible multi-fabricants --- @@ -150,6 +214,7 @@ Coordinateur : **Sonoff Zigbee USB Dongle** — géré via **Zigbee2MQTT**. | Traitement local des données | Vidéo (Frigate), Zigbee et capteurs ESPHome traités en local | | Principe du moindre privilège | Services limités au strict nécessaire | | Surveillance continue | Logs réguliers, mises à jour et sauvegardes automatisées | +| Privacy caméra | Switch dédié pour activer/désactiver le mode privacy de la caméra | ### Architecture Zero-Trust domestique @@ -167,13 +232,66 @@ Coordinateur : **Sonoff Zigbee USB Dongle** — géré via **Zigbee2MQTT**. ## ⚡ Automatisations -Plus de **50 automatisations conditionnelles** actives, couvrant : +Les automatisations sont organisées par domaine fonctionnel : -- Gestion de la présence (arrivée / départ) -- Scénarios d'alarme et notifications contextuelles -- Pilotage du chauffage selon horaires et occupants -- Alertes IoT (plantes, énergie, caméras) -- Scènes d'éclairage et routines quotidiennes +### 🚨 Alarme & Sécurité + +| Alias | Déclencheur | Action principale | +| ---------------------------- | ------------------------------------ | ---------------------------------------------- | +| Alarme vacances | Alarme déclenchée (mode vacances) | Notification mobile (famille) | +| Question alarme | Alarme déclenchée | Message Telegram avec bouton désactivation | +| Snapshots caméra principale | Alarme déclenchée | 3 photos caméra principale + vidéo 10s → Telegram | +| Snapshots caméra secondaire | Alarme déclenchée | 3 photos caméra secondaire + vidéo 10s → Telegram | +| Surveillance à distance | Commande `/garde_alarme` | Photos toutes caméras en boucle → Telegram | +| Message telegram amorçage | Alarme armée (away) | Message de confirmation Telegram | +| Notif alarme désactivée | Alarme désarmée | Notification Telegram | +| desactive alarme telegram | Commande `/desactive_alarme` | Désarmement Alarmo | +| button arm | Commande Telegram | Armement mode vacances | +| Alarme zigbee start/stop | `input_boolean.sirene_meian` | Publication MQTT sirène (burglar/stop) | +| Contrôle Sirène Meian | État `input_boolean.sirene_meian` | Toggle sirène via MQTT (template) | +| Clavier physique avec Alarmo | Clavier physique Frient | Armement/désarmement avec code PIN | +| toggle detect frigate | État alarme | Active/désactive détection Frigate | +| lampes off amorcage | Alarme → arming | Extinction de toutes les lumières | + +### 💡 Éclairage + +| Alias | Déclencheur | Action principale | +| --------------------- | ------------------------------- | --------------------------------------- | +| Lumière automatique auto | Détection mouvement PIR | Allumage switch + extinction après 5min | +| Bouton lampadaire | Action bouton entrée (MQTT) | Toggle lampadaire entrée | +| Lampe entrée auto | Alarme désarmée (retour) | Allumage lampadaire entrée | +| Bouton lampes sdb | Action bouton SDB (MQTT) | Toggle lumières salle de bain (x2) | +| Suspension on/off | Heure (07:00 / 22:00) | On/Off lumière suspension | +| Plantes photosynthèse | Alarme armed_away + 5min | Lumières plantes à 100% | +| sunset lamp | `input_boolean.sunset_switch` | Scène lumière couchant de soleil (IR) | +| led bar | `input_boolean.led_bar_switch` | Toggle barre LED (IR) | + +### 🌡️ Chauffage + +| Alias | Déclencheur | Action | +| ------------------ | -------------- | ----------------------------- | +| start chauffe matin | 06:00 | Radiateurs → mode heat | +| stop chauffe matin | 07:40 | Radiateurs → mode auto | +| start chauffe soir | 18:00 | Radiateurs → mode heat | +| stop chauffe soir | 21:00 | Radiateurs → mode auto | + +### 🌬️ Ventilation & IR + +| Alias | Déclencheur | Action | +| -------------- | --------------------------------- | -------------------------- | +| ventilo | `input_boolean.ventilo_switch` | Script toggle ventilateur | +| ventilo toggle | Manuel | Code IR toggle | +| ventilo power | Manuel | Code IR power | +| ventilo rotate | Manuel | Code IR rotation | +| ventilo mode | Manuel | Code IR changement mode | + +### 🛁 Capteurs & Sécurité passive + +| Alias | Déclencheur | Action | +| --------------------------- | ---------------------------- | ------------------------------- | +| fuite sdb | Capteur humidité (20s moist) | Alerte Telegram fuite d'eau | +| Privacy caméra | `input_boolean.camera_privacy_switch` | Toggle mode privacy caméra | +| diffuseur huiles essentielles | `input_boolean.diffuseur_switch` | Séquence IR on/off diffuseur | --- @@ -182,21 +300,25 @@ Plus de **50 automatisations conditionnelles** actives, couvrant : ```text haos-project/ │ -├── readme.md # Ce fichier +├── readme.md # Ce fichier │ ├── docs/ -│ ├── architecture.md # Schémas et choix d'architecture -│ ├── network-diagram.md # Plan réseau (segments IoT, VPN, tunnel) -│ ├── automations-overview.md # Vue d'ensemble des automatisations -│ └── security-policy.md # Politique de sécurité appliquée +│ ├── architecture.md # Schémas et choix d'architecture +│ ├── network-diagram.md # Plan réseau (segments IoT, VPN, tunnel) +│ ├── automations-overview.md # Vue d'ensemble des automatisations +│ └── security-policy.md # Politique de sécurité appliquée │ └── configs/ + ├── homeassistant/ + │ └── configuration.yaml.example # Config principale HAOS (anonymisée) ├── zigbee2mqtt/ - │ └── configuration.yaml.example # Template config Zigbee2MQTT + │ └── configuration.yaml.example # Config Zigbee2MQTT (anonymisée) + ├── alarmo/ + │ └── automations-alarm.yaml # Automatisations alarme (anonymisées) ├── esphome/ - │ └── humidity-sensor.yaml # Config capteur ESP32 (anonymisée) + │ └── humidity-sensor.yaml # Config capteur ESP32 humidité └── frigate/ - └── config.yaml.example # Template config Frigate NVR + └── config.yaml.example # Template config Frigate NVR ``` --- @@ -208,7 +330,8 @@ haos-project/ - Hébergement auto-géré sur matériel dédié (Home Assistant OS natif) - Mise en place VPN WireGuard et tunnel sortant Cloudflared - Administration distante sécurisée sans exposition WAN -- Gestion multi-protocoles (Zigbee, Wi-Fi, HTTP, MQTT) +- Gestion multi-protocoles (Zigbee, Wi-Fi, HTTP, MQTT, IR) +- Configuration Mosquitto MQTT broker et Zigbee2MQTT **Cybersécurité** @@ -216,19 +339,21 @@ haos-project/ - Suppression des dépendances cloud sur les données sensibles (vidéo, capteurs) - Segmentation logique des équipements IoT - Réduction de la surface d'attaque (aucun port WAN, moindre privilège) +- Privacy caméra avec switch dédié **Développement & Automatisation** - Développement de capteurs custom avec ESPHome / ESP32 -- Conception de plus de 50 automatisations conditionnelles -- Intégrations API officielles (Enedis, Heatzy) -- Pilotage énergétique et optimisation des usages +- Conception d'automatisations complexes (conditionnelles, répétitions, délais, templates Jinja2) +- Intégrations API officielles (Enedis, Heatzy, Telegram Bot) +- Pilotage IR avancé (ventilateur, diffuseur, éclairage ambiant) +- Blueprint Zigbee (Clavier physique avec Alarmo) --- ## ⚠️ Sécurité du dépôt -> Ce dépôt est **public**. Aucune clé privée, token, mot de passe, adresse IP réelle ou information sensible n'est commitée. Les fichiers de configuration sont systématiquement **anonymisés ou fournis sous forme de templates**. +> Ce dépôt est **public**. Aucune clé privée, token, mot de passe, adresse IP réelle, clé réseau Zigbee ou identifiant sensible n'est commitée. Les fichiers de configuration sont systématiquement **anonymisés ou fournis sous forme de templates**. ---