[TUTO] Domotisation BAL avec notification Pixelit

Ce tutoriel partait d’une problématique, la distance séparant ma BAL de la maison. J’ai environ 40 mètres de distance, pas forcément en champ libre qui plus est, avec de la végétation (haie de troène) et un arbre. Ma seule chance, c’est que j’ai une source d’énergie à proximité de la BAL : la motorisation du portail.
J’avais commencé, il y a quelques années avec des capteurs de porte 433 Mhz (Chacon DIO) : c’est ce qui a fonctionné le plus longtemps. J’ai ensuite essayé un capteur PIR Wifi (Tuya) trop sensible, pas de réglages, beaucoup trop de faux positifs. J’avais un petit routeur Wifi à cette époque, dans mon pilier de portail pour mon portier Google Nest Doorbell (Wifi). J’ai tenté également en Zigbee, avec mon carport, équipé d’un driver LED Zigbee pourtant pas loin : 30 mètre en champ direct, bien dégagé, mais non… J’ai fais comme beaucoup de monde, résigné, j’ai lâché l’affaire, j’ai mis ça de côté un temps et je suis passé à autre chose… pour mieux y revenir !

Il est vrai que l’installation a quelque peu évoluée entre temps. (Et le bonhomme qui l’a conçu aussi) Je partais d’une box domotique DIY, à base de Raspberry, d’un RFXCom et d’un Conbee II. Donc tout au même endroit, dans le salon et forcément cela montre ses limites.
Le fait de changer de coordinateur Zigbee (SMLight SLZB-06MU POE) et de concevoir une passerelle 433 Mhz à base d’OMG (OpenMqttGateway) à permis de placer ces deux derniers de manière plus stratégique et efficace, tout en n’étant pas à la vue.
A partir de ce moment, je me suis dit, là, c’est plus carré, on part sur une bonne base pour domotiser la BAL. Dès le premier essai c’était convaincant.

Matériel nécessaire pour l’envoi depuis la BAL:

  • 1 ESP32 (on ne le présente plus)
  • 1 transceiver 433 Mhz, le CC1101 (Attention il existe aussi en 868 Mhz)

  • 1 microswitch à levier

  • 1 ampoule/interrupteur reed

  • 1 antenne 433 Mhz rigide de 17 cm (format RP SMA Femelle)

  • 1 boite de dérivation (70 x 70mm)

  • du fil, un fer à souder, de l’étaim, de la gaine thermo.
  • Bonus: des connecteurs Dupont.

Attention, comme je l’explique dans la vidéo, à votre alimentation 5V.

Si elle est dédiée et isolée aucun soucis. Si vous vous repiquez comme moi sur l’arrivée 230V de la motorisation de portail, il faut filtrer l’alimentation, sous peine de vous prendre des pics de courant qui vont endommager les GPIO de votre ESP.

  • Un filtre EMI est nécessaire, AVANT votre alimentation 5V:



(ET le combo condensateur céramique + électrolytique A LA SORTIE de votre alimentation qui délivrera le 5V.)

  • 1 condensateur céramique 100 nanoF + 1 condensateur électrolytique 1000 µF

Matériel nécessaire pour les notifications sur Pixelit:

Au choix , selon la taille désirée,

  • Pour un petit modèle, 4 matrices de 8x8 pixels (le pas entre les LED est plus petit, c’est le modèle vu sur le tuto en vidéo et en photos)

  • Pour un grand modèle, 1 matrice de 8x32 pixels (le pas entre les LED est plus grand)

  • 1 ESP32 (Pour Pixelit à part entière)

  • 1 Alimentation 5V - 100W (la marque Mean Well reste la référence dans le domaine) J’ai fais attention à prendre une fanless pour éviter le bruit de ventilation, l’alim étant fixée juste sous mon bureau…

  • du fil section 1.5 mm² (de l’alimentation à la matrice)

  • Bonus : 1 deuxième ESP32 si vous voulez caster comme moi + 1 HP + 2 Wago

Je vous met le lien si vous voulez prendre le même HP que moi, étant donné que je vous partage mon fichier 3D : Amazon.fr

1 condensateur céramique 100 nanoF + 1 condensateur électrolytique 1000 µF
C’est important, je l’ai rajouté par la suite, j’avais des craquements lorsque le séparateur de l’heure clignotait sur la matrice LED. L’alimentation étant commune, l’ampli est sensible aux perturbations. L’ensemble se met sur l’alimentation de l’ampli.

(Il sera écrit 104 sur le céramique Soit 10 x 10^4 pF = 100 000 pF)


  • Bonus 2 : une imprimante 3D pour le boitier et de la colle à chaud.

J’attire votre attention sur l’alimentation, et la section du câble , ça peut paraitre énorme, on se dit c’est de la LED, ça ne consomme pas etc… Mais non en fait. Dans le cas le plus critique, c’est à dire tous les pixels allumés en blanc en pleine luminosité, on arrive à plus de 15A de conso, presque 80 Watts. En regardant bien les specs on peut lire : Puissance : 0,3 W/pixel.

Faites le calcul: 0.3 x 8 x 32 = 76.8 Watts (et 76.8/5= 15.36A)

Si vous avez une alim trop faible, et que vous lui demandez trop en luminosité, avec un bitmap qui prend toute la matrice (donc en 8x32 pixels) vous aurez des appels de courant tellement importants, que l’ESP qui héberge Pixelit va rebooter…

Réalisation de l’émetteur de la BAL

Voici le code Arduino à flasher sur votre ESP32, à l’aide d’Arduino IDE :

#include <ELECHOUSE_CC1101_SRC_DRV.h>
#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

const int pinSwitchLettre = 32; // Valeur 7969464
const int pinSwitchColis = 33;  // Valeur 7969460
const int pinGDO0 = 4;          // Pin de DATA pour l'émission

void setup() {
    Serial.begin(115200);
    
    pinMode(pinSwitchLettre, INPUT_PULLUP);
    pinMode(pinSwitchColis, INPUT_PULLUP);

    // 1. Initialisation physique du CC1101
    ELECHOUSE_cc1101.setSpiPin(18, 19, 23, 5);
    if (ELECHOUSE_cc1101.getCC1101()){
        ELECHOUSE_cc1101.Init();
        ELECHOUSE_cc1101.setMHZ(433.92);
        ELECHOUSE_cc1101.setPA(10); // Puissance max
        Serial.println("CC1101 configuré.");
    }

    // 2. Configuration du protocole radio (RCSwitch)
    // On lie RCSwitch à la pin GDO0 du CC1101
    mySwitch.enableTransmit(pinGDO0);
    
    // On ajuste selon vos trames : Protocol 1, Delay 275-277
    mySwitch.setProtocol(1);
    mySwitch.setPulseLength(275); 
    // Nombre de répétitions pour être sûr que OMG reçoive bien
    mySwitch.setRepeatTransmit(10); 

    Serial.println("Prêt à émettre vers OpenMQTTGateway...");
}

void loop() {
    // CANAL 1 : LETTRE (7969464)
    if (digitalRead(pinSwitchLettre) == LOW) {
        Serial.print("Envoi trame LETTRE...");
        // On repasse le CC1101 en mode émission avant d'utiliser RCSwitch
        ELECHOUSE_cc1101.SetTx(); 
        
        mySwitch.send(7969464, 24);
        
        ELECHOUSE_cc1101.SpiStrobe(0x36); // Mode repos (SIDLE)
        Serial.println(" OK.");
        while(digitalRead(pinSwitchLettre) == LOW) delay(10);
        delay(500);
    }

    // CANAL 2 : COLIS (7969460)
    if (digitalRead(pinSwitchColis) == LOW) {
        Serial.print("Envoi trame COLIS...");
        ELECHOUSE_cc1101.SetTx();
        
        mySwitch.send(7969460, 24);
        
        ELECHOUSE_cc1101.SpiStrobe(0x36);
        Serial.println(" OK.");
        while(digitalRead(pinSwitchColis) == LOW) delay(10);
        delay(500);
    }
}

Bien entendu, n’oubliez pas d’installer les deux bibliothèques nécessaires avant de flasher. (voici le détail au moment du projet)


Pour le branchement de l’émetteur CC1101, voici le détail:

En rose, les GPIO de l’ESP32.

Attention, le CC1101 fonctionne en 3.3V ! Ne le branchez pas sur du 5V sous peine de le griller !

Pour les capteurs, on utilise ici :

GPIO 32 pour le courrier :incoming_envelope:

GPIO 33 pour le colis. :package:


Le fil jaune correspond à l’alimentation en +5V et son voisin le vert, à la masse.
Le fil vert qui arrive par le dessous est la masse commune aux deux capteurs (porte + courrier)

mqtt:
  binary_sensor:
    - name: "BAL Colis"
      state_topic: "OMG/OMG_433/433toMQTT/7969460"
      value_template: >
        {% if value_json.value == 7969460 %}
          ON
        {% endif %}
      payload_on: "ON"
      off_delay: 10
      device_class: door
    - name: "BAL Courrier"
      state_topic: "OMG/OMG_433/433toMQTT/7969464"
      value_template: >
        {% if value_json.value == 7969464 %}
          ON
        {% endif %}
      payload_on: "ON"
      off_delay: 10
      device_class: door

J’attire votre attention sur cette configuration qui est la mienne au sujet des topics.

Selon votre matériel, cette configuration doit être adaptée. Vous voyez ici que j’ai une passerelle OpenMQTTGateway. Mon topic MQTT est donc renseigné en conséquence.

Une fois tout ceci bien renseigné et après avoir redémarré Home Assistant, on peut voir les capteurs:


Votre système est prêt à fonctionner, on a réalisé 50% du projet.

Il reste à installer le système en lieu et place.

Réalisation de Pixelit

Il faut vous rendre sur le site officiel afin de flasher votre ESP32 en ligne.

La version Ulanzi est un hack pour les personnes qui ont acheté ce petit module prêt à l’emploi :

A vous de voir si vous êtes ok pour dépenser 50€ pour un module prêt à l’emploi ou si vous préférez le DIY… Attention, ce modèle ne dispose pas de haut-parleur.

Une fois flashé, on peut raccorder la matrice à l’ESP.

Le GPIO par défaut est le GPIO27 pour l’adressage des LED.


On le voit ici sur la gauche de l’image, le fil ORANGE. l’ESP de droite est celui consacré au cast audio.


La partie ampli (avec le filtrage) + HP


Vue globale.

Pour le cast audio

Voici le code yaml pour ESPHome.

esphome:
  name: desktop
  friendly_name: Desktop
  on_boot:
    priority: -100
    then:
      - delay: 2s
      - media_player.volume_set:
          id: desktop_player
          volume: 30%

esp32:
  board: esp32dev
  framework:
    type: arduino

logger:

api:
  encryption:
    key: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  reboot_timeout: 0s

ota:
  - platform: esphome
    password: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  power_save_mode: none

i2s_audio:
  - id: i2s_out
    i2s_lrclk_pin: GPIO25
    i2s_bclk_pin: GPIO27

media_player:
  - platform: i2s_audio
    id: desktop_player
    name: "Desktop David"
    dac_type: external
    i2s_dout_pin: GPIO26
    mode: mono
    
sensor:
  - platform: wifi_signal
    name: "Signal WiFi"
    update_interval: 60s

A modifier à votre guise, en particulier pour la clé API et le MDP OTA, ainsi que le nom que vous voulez lui donner.

(name: desktop / friendly_name: Desktop / name: « Desktop David »)

Vous remarquerez que je règle le volume à 30% au démarrage, vous pouvez donc supprimer ou modifier la partie :

  on_boot:
    priority: -100
    then:
      - delay: 2s
      - media_player.volume_set:
          id: desktop_player
          volume: 30%

Comme on le voit ici, pour le branchement de l’ampli, nous utilisons 4 GPIO + 2 pour l’alimentation.

  • lrclk_pin: GPIO25
  • bclk_pin: GPIO27
  • dout_pin: GPIO26
  • gain: GND dans mon cas , mais à vous de voir.

3 configurations possibles,

Soit non connecté = +9 dB (par défaut)

Soit branché sur GND= +6 dB

Soit branché au +3.3V= +12 dB

Une fois l’ESP flashé, tout branché et alimenté, vous pouvez vérifier sous HA.

Il devrait être découvert, ici dans Intégration - ESPHome:

Il ne reste plus que les automatisations à réaliser, nous avons réalisé 95% du projet.

COLIS

alias: Colis BAL
description: ""
triggers:
  - trigger: state
    entity_id:
      - binary_sensor.bal_colis
    to:
      - "on"
conditions: []
actions:
  - action: notify.persistent_notification
    metadata: {}
    data:
      title: 📦 Colis
      message: "Colis dans la boîte aux lettres "
  - action: media_player.volume_set
    metadata: {}
    target:
      entity_id: media_player.desktop_desktop_david
    data:
      volume_level: 1
  - action: media_player.play_media
    metadata: {}
    target:
      entity_id: media_player.desktop_desktop_david
    data:
      media:
        media_content_id: media-source://media_source/local/Colis.mp3
        media_content_type: audio/mpeg
        metadata:
          title: Colis.mp3
          thumbnail: null
          media_class: music
          children_media_class: null
          navigateIds:
            - {}
            - media_content_type: app
              media_content_id: media-source://media_source
          browse_entity_id: media_player.desktop_desktop_david
  - action: mqtt.publish
    metadata: {}
    data:
      evaluate_payload: false
      qos: 0
      retain: false
      payload: >
        {
          "bitmapAnimation": {
            "data": [
        [0,0,0,0,0,0,0,0,0,0,0,65535,65535,0,0,0,0,0,0,0,0,65535,0,0,0,0,0,65535,65535,65535,0,0,0,0,65535,0,0,65535,0,0,0,0,0,65535,65535,65535,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,65535,65535,0,0,0,0,0,0,0,0,65535,0,0,0,0,0,65535,65535,65535,0,0,0,0,65535,0,0,65535,0,0,64512,0,0,65535,65535,65535,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,65535,65535,0,0,0,0,0,0,0,0,65535,0,0,0,0,0,65535,65535,65535,0,0,0,0,65535,0,0,65535,0,0,64512,0,0,65535,65535,65535,0,0,0,64512,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,65535,65535,0,0,0,0,0,0,0,0,65535,0,0,0,0,0,65535,65535,65535,0,0,0,0,65535,0,0,65535,0,0,64512,0,0,65535,65535,65535,0,0,0,64512,0,0,0,0,0,0,0,0,64512,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,65535,65535,0,0,0,0,0,0,0,0,65535,0,0,0,0,0,65535,65535,65535,0,0,0,0,65535,0,0,65535,0,0,64512,0,0,65535,65535,65535,0,0,0,64512,0,0,0,0,0,0,0,0,64512,64512,64512,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,65535,65535,0,0,0,0,0,0,0,0,65535,0,0,0,0,0,65535,65535,65535,0,0,0,0,65535,0,0,65535,0,0,64512,0,0,65535,65535,65535,0,0,0,64512,0,0,0,0,0,0,0,0,64512,64512,64512,64512,0,0],[0,0,0,0,0,0,0,0,0,0,0,65535,65535,0,0,0,0,0,0,0,0,65535,0,0,0,0,0,65535,65535,65535,0,0,0,0,65535,0,0,65535,0,0,64512,0,0,65535,65535,65535,0,0,0,64512,0,0,0,0,64512,64512,0,0,64512,64512,64512,64512,0,64512]
            ],
            "position": {
              "x": 12,
              "y": 0
            },
            "animationDelay": 150,
            "rubberbanding": false,
            "limitLoops": 0
            
          }
        }
      topic: pixelit/Desktop/setScreen
mode: single


Avec les modifications nécessaires pour vous, en fonction du nom de votre Pixelit, du nom de votre cast audio et de la piste audio (avec sa localisation) que vous souhaitez jouer.

La voix entendue sur la vidéo, est du TTS. J’ai utilisé le site internet TTSMaker. https://ttsmaker.com/fra (La voix Suisse Ariane exactement)

COURRIER

alias: Courrier BAL
description: ""
triggers:
  - trigger: state
    entity_id:
      - binary_sensor.bal_courrier
    to:
      - "on"
conditions: []
actions:
  - action: notify.persistent_notification
    metadata: {}
    data:
      title: ✉️ Courrier
      message: "Courrier dans la boîte aux lettres "
  - action: media_player.volume_set
    metadata: {}
    data:
      volume_level: 1
    target:
      entity_id: media_player.desktop_desktop_david
  - action: media_player.play_media
    metadata: {}
    data:
      media:
        media_content_id: media-source://media_source/local/Courrier.mp3
        media_content_type: audio/mpeg
        metadata:
          title: Courrier.mp3
          thumbnail: null
          media_class: music
          children_media_class: null
          navigateIds:
            - {}
            - media_content_type: app
              media_content_id: media-source://media_source
          browse_entity_id: media_player.nesthub3cae_2
    target:
      entity_id: media_player.desktop_desktop_david
  - action: mqtt.publish
    metadata: {}
    data:
      evaluate_payload: false
      qos: "1"
      retain: false
      payload: |
        {
          "bitmap": {
            "data": [0,0,0,0,0,0,0,0,65504,65504,65504,65504,65504,65504,65504,65504,65504,54970,54970,54970,54970,54970,54970,65504,65504,0,54970,54970,54970,54970,0,65504,65504,0,0,54970,54970,0,0,65504,65504,0,0,0,0,0,0,65504,65504,65504,65504,65504,65504,65504,65504,65504,0,0,0,0,0,0,0,0],
            "position": {
              "x": 12,
              "y": 0
            },
            "size": {
              "width": 8,
              "height": 8
            }
          }
        }
      topic: pixelit/Desktop/setScreen
mode: single


Je vous mets à disposition ici mon fichier fusion 360, pour ceux qui veulent imprimer un boitier. J’ai imprimé à 40% de remplissage avec du PLA noir pour le châssis et la trappe arrière et du blanc pour la diffusion de la lumière en façade.

Ci-dessus, le fichier pour le grand modèle de matrice (8 x 32) Tout en sachant que mon modèle sert de box domotique, j’y ai mon Raspberry Pi V, une plaque support/prototypage d’ESP32 ainsi que deux ventilateurs 5V pour faire un couloir de refroidissement.) le HP se fixe sur le capot arrière, retenu par 6 magnets.

Quelques photos de la réalisation:










Résistance de 33 Ohms afin de baisser la vitesse des ventilateurs, car ils étaient bruyants à 5V. Là on redescend à 3.15V c’est parfait et suffisant pour qu’ils puissent tourner. Ils ne démarrent pas sous les 3V.

Le Raspberry Pi V en détail, avec son HAT PCIe + SSD (Visible ici sur le prototype précédent de box, sans cadrage, les LED ont un effet trop « flou » et dispersant.)


On revient dans la nouvelle box.




7 « J'aime »