[Tuto] Intégration de matériel OpenWrt dans HA

Bonjour,

Je souhaite partager quelques astuces pour l’intégration de matériel réseau fonctionnant sous OpenWrt dans Home Assistant. En effet, j’ai fait quelques recherches et ça semble assez mal documenté. Ceci est donc un résumé de mes recherches.

Tout d’abord, il faut scinder la problématique en deux sujets : la télémétrie et le contrôle distant de l’équipement.

Télémétrie

La télémétrie concerne la remontée d’information comme l’usage de la RAM, de la bande passante, le nombre de connexions actives, le nombre de baux DHCP, la température, … vers Home Assistant.

Pour la partie télémétrie, le plus simple semble d’utiliser le protocole MQTT. C’est simple à intégrer côté Home Assistant et c’est supporté côté OpenWrt.
Sur notre routeur, on va se servir du paquet « collectd » et de ses modules complémentaires. La documentation se trouve ici : Documentation officielle Collectd

Voici les principales étapes pour configurer cela :

  1. On commence côté Home Assistant. Il faut installer et configurer un brocker MQTT. On va utiliser Mosquitto. Les détails de l’opération se trouvent ici : ✅ Ajouter un serveur MQTT à Home Assistant via l'add-on Mosquitto Broker.

  2. On passe ensuite côté OpenWrt. Ouvrir la page Web de configuration du routeur. Se rendre dans « System » puis « Software ». Après avoir mis à jour la liste des paquets (bouton « Update lists … », en haut à droite), il faut à minima installer les paquets suivants :

  • collectd : service permettant la collecte des données, module principal
  • luci-app-statistics : l’interface graphique pour collectd
  • collectd-mod-mqtt : module permettant l’émission de ces données vers un brocker MQTT (Mosquito dans notre cas)

Il est possible d’installer d’autres modules, en fonction des données que l’on souhaite remonter. Pour connaître les modules disponibles, rechercher « collectd » dans la liste des paquets ou consulter la doc de « collectd ». Me concernant, voici les paquets que j’utilise :

  1. Une fois l’installation de "collectd effectuée, il faut recharger la page Web. Dans le bandeau supérieur, un nouveau menu est apparu : « Statistics ». On clique dessus, puis on choisit, « Setup ».
    Dans le premier onglet, seul le paramètre « Data collection interval » est à modifier. Cela définit le délais entre chaque rafraîchissement et envoi des données vers Home Assistant.

    Les onglets « General plugins » et « Network plugins » permettent de paramétrer le fonctionnement des modules complémentaires. Je ne rentrerais pas dans les détails, le paramétrage est plutôt intuitif.
    Voici à quoi ça ressemble de mon côté :


    Un mot sur le module « Thermal » : pour ma part, sur 4 équipements de marque différente, je n’ai pas réussi à avoir de valeur (c’est pourquoi je l’ai désactivé), ça ne fonctionne pas.
  2. On termine par l’onglet « Output plugins ». Seul le module « Mqtt » doit être activé. Il est important de désactiver le module « RRDTool » si vous paramétrez un délai d’actualisation court (ceci pour éviter d’écrire trop souvent dans la mémoire Flash du routeur).

    Il faut ensuite configurer le module « Mqtt » en renseignant l’adresse IP et le port du brocker MQTT (normalement l’adresse IP correspond à celle de Home Assistant et le port est 1883 par défaut) ainsi que le nom d’utilisateur et le mot de passe tel que définit dans la configuration du brocker MQTT (tel que définit dans le point n°1).

Cliquer sur « Save and Apply » pour appliquer la configuration.

  1. A cette étape le routeur envoie les données de télémétrie vers Home Assistant. Contrairement à d’autres intégrations MQTT, il faut définir manuellement chaque « sensor » (pas de découverte automatique). On va se servir du logiciel « MQTT Explorer » pour découvrir « l’adresse » de ces capteurs. Une fois connecté à Mosquitto, voici à quoi ça ressemble chez moi :

On peut voir que 4 routeurs envoient des données à OpenWrt. Si on veut remonter le taux d’utilisation de la RAM, il faut déclarer un sensor MQTT avec le topic « R01/R01/memory/memory-buffered » dans le fichier « Configuration.yaml ». Comme ceci :

  - name: RAM buffered
    state_topic: R01/R01/memory/memory-buffered
    unit_of_measurement: MB
    value_template: "{{ (value.split(':')[1].split('\0')[0] | float(0) / 1000000) | round(1) }}"
    unique_id: r01-ram_buffered

(La ligne « value_template » sert a extraire la valeur, car « collectd » renvoie dans le même topic un horodatage que l’on n’utilise pas).
Un exemple de configuration est disponible ici : Github OpenWRT-collectd-MQTT-HA /openwrt.yaml
Voici une partie de mon fichier de configuration :

mqtt:

### OpenWRT MQTT Sensors

#
# ========== R01 ==========
#

# RAM
  - name: RAM buffered
    state_topic: R01/R01/memory/memory-buffered
    unit_of_measurement: MB
    value_template: "{{ (value.split(':')[1].split('\0')[0] | float(0) / 1000000) | round(1) }}"
    unique_id: r01-ram_buffered
    state_class: measurement
    device_class: data_size
    icon: 'mdi:memory'
    device:
      identifiers: R01
      name: Routeur principal
      model: Modele
      manufacturer: Constructeur
  - name: RAM free
    state_topic: R01/R01/memory/memory-free
    unit_of_measurement: MB
    value_template: "{{ (value.split(':')[1].split('\0')[0] | float(0) / 1000000) | round(1) }}"
    unique_id: r01-ram_free
    state_class: measurement
    device_class: data_size
    icon: 'mdi:memory'
    device:
      identifiers: R01
      name: Routeur principal
      model: Modele
      manufacturer: Constructeur
  - name: RAM cached
    state_topic: R01/R01/memory/memory-cached
    unit_of_measurement: MB
    value_template: "{{ (value.split(':')[1].split('\0')[0] | float(0) / 1000000) | round(1) }}"
    unique_id: r01-ram_cached
    state_class: measurement
    device_class: data_size
    icon: 'mdi:memory'
    device:
      identifiers: R01
      name: Routeur principal
      model: Modele
      manufacturer: Constructeur
  - name: RAM used
    state_topic: R01/R01/memory/memory-used
    unit_of_measurement: MB
    value_template: "{{ (value.split(':')[1].split('\0')[0] | float(0) / 1000000) | round(1) }}"
    unique_id: r01-ram_used
    state_class: measurement
    device_class: data_size
    icon: 'mdi:memory'
    device:
      identifiers: R01
      name: Routeur principal
      model: Modele
      manufacturer: Constructeur
      
# System Load
  - name: L1
    unit_of_measurement: load
    state_topic: R01/R01/load/load
    value_template: "{{ (value.split(':')[1] | float(0)) | round(1) }}"
    unique_id: r01-L1
    state_class: measurement
    icon: 'mdi:gauge'
    device:
      identifiers: R01
      name: Routeur principal
      model: Modele
      manufacturer: Constructeur
  - name: L5
    unit_of_measurement: load
    state_topic: R01/R01/load/load
    value_template: "{{ (value.split(':')[2] | float(0)) | round(1) }}"
    unique_id: r01-L5
    state_class: measurement
    icon: 'mdi:gauge'
    device:
      identifiers: R01
      name: Routeur principal
      model: Modele
      manufacturer: Constructeur
  - name: L15
    unit_of_measurement: load
    state_topic: R01/R01/load/load
    value_template: "{{ (value.split(':')[3].split('\0')[0] | float(0)) | round(1) }}"
    unique_id: r01-L15
    state_class: measurement
    icon: 'mdi:gauge'
    device:
      identifiers: R01
      name: Routeur principal
      model: Modele
      manufacturer: Constructeur
      
    # WAN interface (wan1)
  - name: WAN errors
    state_topic: R01/R01/interface-wan1/if_errors
    unit_of_measurement: packets
    value_template: >-
      {% set parts = value.split(':') %}
      {% if parts|length >= 3 %}
        {% set value1 = parts[1]|float(0) %}
        {% set value2 = parts[2].split('\x00')[0]|float(0) %}
        {{ (value1 + value2)|round(0)|int }}
      {% else %}
        {{ 0 }}
      {% endif %}
    unique_id: r01-wan-errors
    state_class: measurement
    icon: mdi:lan-disconnect
    device:
      identifiers: R01
      name: Routeur principal
      model: Modele
      manufacturer: Constructeur

  - name: WAN dropped
    state_topic: R01/R01/interface-wan1/if_dropped
    unit_of_measurement: packets
    value_template: >-
      {% set parts = value.split(':') %}
      {% if parts|length >= 3 %}
        {% set value1 = parts[1]|float(0) %}
        {% set value2 = parts[2].split('\x00')[0]|float(0) %}
        {{ (value1 + value2)|round(0)|int }}
      {% else %}
        {{ 0 }}
      {% endif %}
    unique_id: r01-br-wan-dropped
    state_class: measurement
    icon: mdi:lan-pending
    device:
      identifiers: R01
      name: Routeur principal
      model: Modele
      manufacturer: Constructeur
  - name: WAN RX
    state_topic: R01/R01/interface-wan1/if_octets
    unit_of_measurement: Mbit/s
    value_template: "{{ (value.split(':')[1] | float(0) * 8 / 1048576) | round(2) }}"
    unique_id: r01-br-wan-bits-rx-transfer
    state_class: measurement
    device_class: data_rate
    icon: mdi:upload-network
    device:
      identifiers: R01
      name: Routeur principal
      model: Modele
      manufacturer: Constructeur
  - name: WAN TX
    state_topic: R01/R01/interface-wan1/if_octets
    unit_of_measurement: Mbit/s
    value_template: "{{ (value.split(':')[2].split('\x00')[0] | float(0) * 8 / 1048576) | round(2) }}"
    unique_id: r01-br-wan-bits-tx-transfer
    state_class: measurement
    device_class: data_rate
    icon: mdi:download-network
    device:
      identifiers: R01
      name: Routeur principal
      model: Modele
      manufacturer: Constructeur
  - name: WAN packets
    state_topic: R01/R01/interface-wan1/if_packets
    unit_of_measurement: packets/s
    value_template: "{{ value.split(':')[1] | int + value.split(':')[2].split('\x00')[0] | int | float(0) | round (0) }}"
    unique_id: r01-br-wan-packets
    state_class: measurement
    icon: mdi:lan-connect
    device:
      identifiers: R01
      name: Routeur principal
      model: Modele
      manufacturer: Constructeur   
      
    # VLAN 12 Interface (br-Personnel)
  - name: VLAN Personnel errors
    state_topic: R01/R01/interface-br-lan.12/if_errors
    unit_of_measurement: packets
    value_template: |-
      {% set parts = value.split(':') %} {% if parts|length >= 3 %}
        {% set value1 = parts[1]|float(0) %}
        {% set value2 = parts[2].split('\x00')[0]|float(0) %}
        {{ (value1 + value2)|round(0)|int }}
      {% else %}
        {{ 0 }}
      {% endif %}
    unique_id: r01-br-lan-12-errors
    state_class: measurement
    icon: 'mdi:lan-disconnect'
    device:
      identifiers: R01
      name: Routeur principal
      model: Modele
      manufacturer: Constructeur
  - name: VLAN Personnel dropped
    state_topic: R01/R01/interface-br-lan.12/if_dropped
    unit_of_measurement: packets
    value_template: |-
      {% set parts = value.split(':') %} {% if parts|length >= 3 %}
        {% set value1 = parts[1]|float(0) %}
        {% set value2 = parts[2].split('\x00')[0]|float(0) %}
        {{ (value1 + value2)|round(0)|int }}
      {% else %}
        {{ 0 }}
      {% endif %}
    unique_id: r01-br-lan-12-dropped
    state_class: measurement
    icon: 'mdi:lan-pending'
    device:
      identifiers: R01
      name: Routeur principal
      model: Modele
      manufacturer: Constructeur
  - name: VLAN Personnel TX Mb/s
    state_topic: R01/R01/interface-br-lan.12/if_octets
    unit_of_measurement: Mbit/s
    value_template: "{{ (value.split(':')[1] | float(0) * 8 / 1048576) | round(2) }}"
    unique_id: r01-br-lan-12-tx-transfer
    state_class: measurement
    device_class: data_rate
    icon: 'mdi:upload-network'
    device:
      identifiers: R01
      name: Routeur principal
      model: Modele
      manufacturer: Constructeur
  - name: VLAN Personnel RX Mb/s
    state_topic: R01/R01/interface-br-lan.12/if_octets
    unit_of_measurement: Mbit/s
    value_template: "{{ (value.split(':')[2].split('\0')[0] | float(0) * 8 / 1048576) | round(2) }}"
    unique_id: r01-br-lan-12-rx-transfer
    state_class: measurement
    device_class: data_rate
    icon: 'mdi:download-network'
    device:
      identifiers: R01
      name: Routeur principal
      model: Modele
      manufacturer: Constructeur
  - name: VLAN Personnel packets
    state_topic: R01/R01/interface-br-lan.12/if_packets
    unit_of_measurement: packets/s
    value_template: "{{ value.split(':')[1] | int + value.split(':')[2].split('\0')[0] | int | float(0) | round (0) }}"
    unique_id: r01-br-lan-12-packets
    state_class: measurement
    icon: 'mdi:lan-connect'
    device:
      identifiers: R01
      name: Routeur principal
      model: Modele
      manufacturer: Constructeur

    # LAN Interface VLAN xxxx
  
# Uptime
  - name: Uptime
    state_topic: R01/R01/uptime/uptime
    device_class: timestamp
    value_template: "{{ as_datetime( (value.split(':')[0] | float ) - (value.split(':')[1].split('\0')[0] | float ) ) }}"
    unique_id: r01-ap_uptime
    icon: 'mdi:clock'
    device:
      identifiers: R01
      name: Routeur principal
      model: Modele
      manufacturer: Constructeur

# Ping
  - name: Google ping
    state_topic: R01/R01/ping/ping-google.fr
    unit_of_measurement: ms
    value_template: "{{ value.split(':')[1].split('\0')[0] | float(0) | round(2) }}"
    unique_id: r01-ap_ping_01
    state_class: measurement
    icon: 'mdi:clipboard-flow'
    device:
      identifiers: R01
      name: Routeur principal
      model: Modele
      manufacturer: Constructeur
      
  - name: OpenWrt ping
    state_topic: R01/R01/ping/ping-openwrt.org
    unit_of_measurement: ms
    value_template: "{{ value.split(':')[1].split('\0')[0] | float(0) | round(2) }}"
    unique_id: r01-ap_ping_02
    state_class: measurement
    icon: 'mdi:clipboard-flow'
    device:
      identifiers: R01
      name: Routeur principal
      model: Modele
      manufacturer: Constructeur
      
# Connections
  - name: Connections
    state_topic: R01/R01/conntrack/conntrack
    unit_of_measurement: connections
    value_template: "{{ value.split(':')[1].split('\0')[0] | int }}"
    unique_id: r01-ap_connections
    state_class: measurement
    icon: 'mdi:connection'
    device:
      identifiers: R01
      name: Routeur principal
      model: Modele
      manufacturer: Constructeur
      
# DHCP Active Leases
  - name: DHCP Active Leases
    state_topic: R01/R01/dhcpleases/count
    unit_of_measurement: clients
    value_template: "{{ value.split(':')[1].split('\0')[0] | int }}"
    unique_id: r01-dhcp_clients
    state_class: measurement
    icon: 'mdi:router-network'
    device:
      identifiers: R01
      name: Routeur principal
      model: Modele
      manufacturer: Constructeur
  1. Il n’y a plus qu’a faire un joli tableau de bord :

Contrôle à distance

Pour modifier le fonctionnent du routeur depuis Home Assistant, il y a (en gros) deux méthodes :

  • Via SSH : l’idée est de déclarer un « sensor » SSH qui exécute des commandes directement dans le routeur.
  • Via UBus : l’idée est d’appeler une URL (faire une requête HTTP) qui, côté routeur, est traitée par UBus et déclenche l’exécution d’un script dans le routeur

La méthode SSH est, pour moi, une aberration sur le plan de la cybersécurité : en cas de compromission d’Home Assistant, l’attaquant aura a sa disposition un accès root au routeur (moyenneant quelques efforts, on peut mettre en place un compte limité, mais ça reste dangereux). Bref c’est (presque) la fin des haricots.
La méthode UBus est bien plus sécurisante : l’accès se fait avec un compte limité côté routeur (qui ne peut même pas accéder en SSH ou via Luci) et il y a un contrôle d’accès (appelé ACL) pour limiter encore plus fininement ce que peut faire cet utilisateur. En cas de compromission d’Home Assistant, l’attaquant ne pourra qu’exécuter les scripts auquels Home Assistant a accès et rien d’autre. C’est cette méthode que je vais montrer.

Voici les principales étapes :

  1. Côté routeur, se rendre sur la page Web de configuration. Se rendre dans « System » puis « Software ». Après avoir mis à jour la liste des paquets (bouton « Update lists … », en haut à droite), il faut installer les paquets suivants :
  • ubus : normallement ce paquet est déjà installé
  • uhttpd-mod-ubus : ce paquet foourni une API JSON

Voici ce que j’obtiens :

  1. Ouvrir un terminal SSH sur le routeur (avec Putty par exemple) :

  2. On commence par créer un compte limité (sans SSH, sans accès Luci), nommé hass. Saisir la commande vi /etc/passwd. Se mettre en insertion (appuyer sur la touche « i ») et ajouter une ligne
    hass:x:10001:10001:hass:/var:/bin/false. Sauvegarder et quitter (appuyer sur la touche « Echap » et saisir « :wq »).

  3. On ajoute ce compte pour l’accès distant à UBus. Créer un mot de passe avec la commande uhttpd -m mot_de_passe. Copier le résultat de cette commande dans un bloc note.
    Saisir la commande vi /etc/config/rpcd, passer en insertio et ajouter les lignes suivantes :

config login
        option username 'hass'
        option password '$1$...'
        list read unauthenticated
        list read hass
        list write hass

Dans « option password », mettre (entre guillemets) le résultat de la commande uhttpd -m mot_de_passe (ça doit commencer par $1$).
La ligne « list read unauthenticated » permet à l’utilisateur « hass » de s’authentifier (par défaut, l’utilisateur ne peut rien faire, même pas s’authentifier).
Les deux lignes suivantes, sont expliquées ci-après.
Sauvegarder et quitter Vim.
On obtient ceci :

  1. Ensuite, il faut paraméter le contrôle d’accès (ACL). Saisir la commande vi /usr/share/rpcd/acl.d/hass.json (le nom du fichier est important car il est lié aux lignes précédentes « list read hass » et « list write hass »). Passer en insertion et ajouter les lignes suivantes :
{
  "hass": {
                "description": "Home Assistant access role",
                "read": {
                        "ubus": {
                                "file": [ "exec" ]
                        },
                        "uci": [ "*" ],
                        "file":
                        {
                                "/etc/script/*": ["exec"],
                                "/sbin/reboot": ["exec"]
                        }
                },
                "write": {
                        "ubus": {
                                "file": [ ]
                        },
                }
        }
}

Sauvegarder et quitter Vim. Redémarrer le routeur (commande : reboot) pour prendre en compte les modifications.
Ce paramétrage va permettre à l’utilisateur « hass » d’éxécuter la commande « reboot » et les scripts contenus dans le répertoir « /etc/script » via UBus. Toute autre action est interdite.

  1. Créer un répertoir « script » dans « /etc » (commande : mkdir /etc/script/). C’est ici qu’il faut placer les scripts que l’on souhaite exécuter depuis Home Assistant. Pour la suite de cet exemple, on va partir sur un script qui permet d’activer ou désactiver un réseau WiFi. Je l’ai trouvé ici : Script WiFi On/Off OpenWrt
    Créer un script avec la commande vi /etc/script/ManageWiFi.sh et insérer les lignes suivantes :
DISABLE_SSID="SSID du réseau WiFi"

off() {
    for ssid in $(uci show wireless | grep "$DISABLE_SSID" | cut -f 1-2 -d.); do
        echo Disabling "$ssid"
        uci -q set "$ssid".disabled=1
        uci commit
        wifi reload
    done
}

on() {
    for ssid in $(uci show wireless | grep "$DISABLE_SSID" | cut -f 1-2 -d.); do
        echo Enabling "$ssid"
        uci -q set "$ssid".disabled=0
        uci commit
        wifi reload
    done
}

case $1 in

"-on")
    on
    ;;

"-off")
    off
    ;;

*)
    echo "valid parameters on or off. Get $1"
    ;;
esac

service collectd restart
service usteer restart

Changer l’affectation de la variable « DISABLE_SSID » en fonction du SSID que l’on souhaite activer ou désactiver.
Sauvegarder et quitter Vim.
Rendre le script exécutable (avec la commande chmod +x /etc/script/ManageWiFi.sh)

  1. Tester ensuite l’appel du script avec UBus en utilisant la commande :
  • ubus call file exec '{ "command": "/etc/script/ManageWiFi.sh", "params": [ "-on" ] }' pour activer le WiFi
  • ubus call file exec '{ "command": "/etc/script/ManageWiFi.sh", "params": [ "-off" ] }' pour désactiver le WiFi
    Voici un exemple de ce qu’on obtient :
  1. On va enfin passer du côté Home Assistant. Dans le fichier « Configuration.yaml », déclarer des « sensors » utilisant l’API Rest :
rest_command: 
#
# ========== AP00-Cuisine ==========
#  
  
  ap00_login:
    url: " https://adresse_ip_du_routeur/ubus"
    method: post
    verify_ssl: false
    payload: |-
		{
			"id": 1,
			"jsonrpc": "2.0",
			"method": "call",
			"params": [
				"00000000000000000000000000000000",
				"session",
				"login",
				{
					"password": "Mot de passe du compte hass",
					"username": "hass"
				}
			]
		}

  ap00_wifi_on:
    url: " https://adresse_ip_du_routeur/ubus"
    method: post
    verify_ssl: false
    payload: |-
        {
            "jsonrpc": "2.0",
            "id": 1,
            "method": "call",
            "params": [
                "{{jeton}}",
                "file",
                "exec",
                {
                    "command": "/etc/script/ManageWiFi.sh",
                    "params": [
                        "-on"
                    ]
                }
            ]
        }

  ap00_wifi_off:
    url: "https://adresse_ip_du_routeur/ubus"
    method: post
    verify_ssl: false
    payload: |-
        {
            "jsonrpc": "2.0",
            "id": 1,
            "method": "call",
            "params": [
                "{{jeton}}",
                "file",
                "exec",
                {
                    "command": "/etc/script/ManageWiFi.sh",
                    "params": [
                        "-off"
                    ]
                }
            ]
        }

Le premier bloc nommé « ap00_login » sert à obtenir un jeton d’authentification. Cette requête est à apperler avant chaque commande. Bien sûr, il faut adaptater le champ « password » en fonction de ce qui a été saisi au point 4. Ne pas toucher au reste.

Les blocs « ap00_wifi_on » et « ap00_wifi_off » permettent d’appeler notre script via UBus. Le plus important est ce « {{jeton}} ». Ce n’est rien d’autre qu’une variable à laquelle il faudra affecter le jeton précédemment obtennu avec la requête « ap00_login »

On peut noter la présence de « verify_ssl: false » : cela permet d’utiliser le protocole HTTPS avec les certificats autosignés du routeur. On peut l’enlever si on utilise le protocole HTTP.

Attention aux url : dans cet exemple, elles commencent par https:// car j’utilise le protocole HTTPS. Pour le protocole HTTP, il faut mettre http://. :wink:

  1. Dernière étape, créer des scripts dans Home Asistant pour automatiser l’appel de ces requêtes. Voici un exemple, qu’il suffit de dupliquer pour chaque commande à appeler dans le routeur :
sequence:
  - action: rest_command.ap00_login
    data: {}
    response_variable: ap00_auth
  - if:
      - condition: template
        value_template: "{{ ap00_auth['status'] == 200 }}"
    then:
      - if:
          - condition: template
            value_template: >-
              {{ (ap00_auth['content'].result[1].ubus_rpc_session | string |
              length) > 0}}
        then:
          - variables:
              jeton_lu: "{{ ap00_auth['content'].result[1].ubus_rpc_session | string}}"
          - action: rest_command.ap00_wifi_off
            data:
              jeton: "{{jeton_lu}}"
            response_variable: ap00_result
          - if:
              - condition: template
                value_template: "{{ ap00_result['content'].result[1].code == 0}}"
            then:
              - action: notify.persistent_notification
                metadata: {}
                data:
                  message: |-
                    Succès désactivation WiFi.
                    Réultat : {{ap00_result['content']}}
                  title: Modification WiFi sur AP00 - Cuisine
              - action: notify.bottelegram
                metadata: {}
                data:
                  message: |-
                    Succès désactivation WiFi.
                    Réultat : {{ap00_result['content']}}
                  title: 🛜 Modification WiFi sur AP00 - Cuisine
            else:
              - action: notify.persistent_notification
                metadata: {}
                data:
                  message: |-
                    Échec désactivation WiFi.
                    Réultat : {{ap00_result['content']}}
                    Authentification : {{jeton_lu}}
                  title: Modification WiFi sur AP00 - Cuisine
              - action: notify.bottelegram
                metadata: {}
                data:
                  message: |-
                    Échec désactivation WiFi.
                    Réultat {{ap00_result['content']}}
                    Authentification : {{jeton_lu}}
                  title: 🛜 Modification WiFi sur AP00 - Cuisine
        else:
          - action: notify.persistent_notification
            metadata: {}
            data:
              message: |-
                Échec désactivation WiFi, problème d'authentification.
                La requête renvoie : {{ap00_auth['content']}}
              title: Modification WiFi sur AP00 - Cuisine
          - action: notify.bottelegram
            metadata: {}
            data:
              message: |-
                Échec désactivation WiFi, problème d'authentification.
                La requête renvoie : {{ap00_auth['content']}}
              title: 🛜 Modification WiFi sur AP00 - Cuisine
    else:
      - action: notify.persistent_notification
        metadata: {}
        data:
          message: |-
            Échec désactivation WiFi, échec requête.
            Code d'erreur HTTP : {{ ap00_auth['status']}}
          title: Modification WiFi sur AP00 - Cuisine
      - action: notify.bottelegram
        metadata: {}
        data:
          message: |-
            Échec désactivation WiFi, échec requête.
            Code d'erreur HTTP : {{ ap00_auth['status']}}
          title: 🛜 Modification WiFi sur AP00 - Cuisine
alias: Cuisine, AP00 - Wifi Off
description: ""

Comment ça marche ?

  • Au début du script, on appelle la requête « ap00_auth »
  • Si le résultat HTTP de la requête est 200 alors on peut continuer (le code 200 signifie que la requête HTTP a été traitée avec succès)
  • Si la réponse contient un jeton d’authentification, alors on le met dans la variable « jeton_lu » et on continue
  • A l’aide du jeton, on appelle la commande « ap00_wifi_off » (la section « data » est ici importante car elle permet de paraméter cette requête en lui fournissant le fameux jeton, indispensable à sa bonne exécution)
  • Le reste du script contrôle la bonne exécution de la requête et en informe l’utilisateur

Bien sûr, les notifications présentent dans le script ne sont pas obligatoires et peuvent être enlevées.

  1. On finit par quelques boutons pour appeler nos scripts depuis un tableau de bord :

Il est ainsi possible d’exécuter n’importe quelle commande dans le routeur. On pourrait, par exemple, récupérer la liste des adresses MAC des équipements connectés à ce point d’accès et automatiser certaines actions si une adresse MAC était présente ou absente.

Sources :

A+

2 « J'aime »

Salut

Merci pour ce super tuto et petite question: pourquoi ne pas utiliser l’intégration officielle qui remontait pas mal de choses si je me rappelle bien l’époque où j’avais encore un routeur à base d’OpenWRT ?

Vincèn

Bonjour,
De rien.
Le problème avec l’intégration officielle est que je ne sais pas vraiment ce qu’elle remonte et, en terme de cybersécurité, il faut un compte avec un accès à Luci (en jouant avec les permissions Unix, je pense qu’il doit être possible de brider les actions possibles avec ce compte). En tout cas, je ne pense pas qu’il soit possible d’appeler des scripts dans le routeur de cette façon.
Si dès fois quelqu’un l’a utilisé, je ne serais pas contre un retour d’expérience.
A+