Home Lab Optimisé

Matériel utilisé

  • Raspberry Pi : Services légers (Pi-hole, Gatus).
  • NAS Synology : Stockage, médias (Emby, Transmission), et gestion documentaire (Paperless-ngx).
  • PC Proxmox : Virtualisation des services gourmands (VM/LXC).

Architecture Logicielle

1. Raspberry Pi

  • Pi-hole : Bloque les pubs et traqueurs.
  • Gatus : Surveille la disponibilité des services.

2. NAS Synology (DSM)

  • Médias : Emby, Transmission, SickChill, NZBGet, FileBot.
  • Documents : Paperless-ngx (via Docker).
  • Sauvegarde : Duplicati.

3. Proxmox (PC Principal)

Conteneur/VMApplicationsRôle
LXC 1Home AssistantAutomatisation domotique.
LXC 2Frigate + OllamaAnalyse vidéo (GPU) + IA locale.
LXC 3MQTT Explorer + Prometheus + DashySupervision et monitoring.
LXC 4Firefly IIIGestion financière.
VM 1pfSenseRouteur/firewall (optionnel).
VM 2Serveur Web (WordPress)Site web/blog.
VM 3JenkinsIntégration/déploiement (CI/CD).

Appareils Connectés (IoT)

  • Google Nest et Smart TV :
    • Isolés dans un VLAN IoT pour la sécurité.
    • Interagissent avec :
      • Home Assistant (commandes vocales, scénarios).
      • Emby (streaming depuis le NAS).
    • Contrôlés via Pi-hole pour bloquer les pubs.

Bonnes Pratiques

  • Réseau :
    • VLANs séparés (Trusted, IoT, Web, Media).
    • Pare-feu (pfSense) pour isoler les flux.
  • GPU :
    • Partage entre Frigate et Ollama via Docker dans un LXC dédié.
  • Sauvegardes :
    • Backuper Paperless, WordPress, et configurations Docker.

Schéma Réseau & Applications


graph TB
  %% Matériel
  Internet --> pfSense(VM1 - pfSense)
  pfSense --> RPi[Raspberry Pi]


  subgraph "NAS Synology"
    NAS[(DSM)] --> Emby
    NAS --> Paperless
    NAS --> Transmission
    NAS --> Duplicati
  end

  subgraph "Proxmox (PC Principal)"
    %% VLANs
    pfSense --> VLAN10[VLAN 10 - Trusted]
    pfSense --> VLAN20[VLAN 20 - Web]
    pfSense --> VLAN30[VLAN 30 - IoT]
    pfSense --> VLAN40[VLAN 40 - Media]

    %% Conteneurs/VM
    VLAN10 --> LXC1(LXC1 - Home Assistant)
    VLAN10 --> LXC2(LXC2 - Frigate + Ollama)
    VLAN10 --> LXC3(LXC3 - MQTT Explorer + Prometheus + Dashy)
    VLAN10 --> LXC5(LXC5 - Firefly III)

    VLAN20 --> VM2(VM2 - WordPress)
    VLAN20 --> VM4(VM4 - Jenkins)

    VLAN30 --> GoogleNest(Google Nest)
    VLAN30 --> SmartTV(Smart TV)

    VLAN40 --> NAS
  end

  %% Légende
  style VLAN10 fill:#d5f5e3,stroke:#27ae60
  style VLAN20 fill:#d6eaf8,stroke:#3498db
  style VLAN30 fill:#fadbd8,stroke:#e74c3c
  style VLAN40 fill:#fdedec,stroke:#f39c12

Légende Détaillée

ÉlémentDescription
🟠 pfSense (VM1)Routeur/firewall gérant les VLANs et la sécurité.
🟢 Raspberry PiExécute Pi-hole (DNS) + Gatus (monitoring).
🔵 NAS SynologyStockage central + applications média (Emby) et docs (Paperless).
VLAN 10 (Trusted)Services critiques : HA, Frigate, Ollama, monitoring.
VLAN 20 (Web)Services exposés : WordPress, Jenkins.
VLAN 30 (IoT)Appareils connectés (Google Nest, Smart TV) isolés pour sécurité.
VLAN 40 (Media)Accès aux médias (Emby) depuis la Smart TV.

Flux Clés à Retenir

  1. Google Nest/Smart TV → Communiquent avec Home Assistant (VLAN 10) via règles firewall précises.
  2. Frigate (VLAN 10) → Envoie les alertes à Home Assistant et Smart TV (via VLAN 30 autorisé).
  3. WordPress/Jenkins (VLAN 20) → Accessibles depuis Internet (port forwarding contrôlé par pfSense).
  4. Paperless (NAS) → Consommé par l’utilisateur via interface web (protégée par mot de passe).

Exemple de Configuration pfSense (Règles VLAN 30 → VLAN 10)

ActionSourceDestinationPortDescription
✅ AllowVLAN30LXC1 (HA)8123Accès à l’interface HA.
✅ AllowVLAN30LXC2 (Frigate)5000Flux vidéo pour affichage TV.
🚫 BlockVLAN30VLAN10*Bloquer tout autre accès.

Bonnes Pratiques

Pour les Nest

  • Mise à jour firmware : Vérifiez régulièrement via l’app Google Home.
  • Isolation : Bloquez l’accès aux autres VLANs sauf pour :
    • Home Assistant (port 8123).
    • MQTT Explorer (si utilisé, port 1883).

Pour la Smart TV

  • DNS personnalisé : Redirigez-la vers Pi-hole (Raspberry Pi) pour bloquer les pubs.
    • Dans pfSense : DHCP → Option DNS = IP du Pi-hole.
  • Désactivez le suivi : Désactivez ACR (Automatic Content Recognition) dans les paramètres TV.

Intégration de la Smart TV

Configuration Réseau

  • VLAN : Même VLAN IoT (30) que les Nest pour simplifier.
  • Règles pfSense :
    • Autorisez la TV à accéder à :
      • Internet (streaming Netflix/YouTube).
      • Emby/Jellyfin (NAS) via le VLAN Media (ex: VLAN 40 si existant).

Interaction avec Home Lab

  • Pour Emby/Jellyfin (NAS) :
    • Montez un dossier partagé Synology en SMB/NFS accessible à la TV.
    • Exemple de configuration Emby :yamlCopy# docker-compose.yml (NAS) volumes: – /volume1/medias:/media
  • Contrôle via Home Assistant :
    • Intégrez la TV via HDMI-CEC ou API spécifique (ex: Samsung Tizen, LG webOS).
    • Automatisations possibles :
      • Allumer/éteindre la TV quand Frigate détecte un mouvement.
      • Afficher les caméras sur la TV via un dashboard.

Intégration des Google Nest (Assistant Google)

Configuration Réseau

  • VLAN Recommandé : Isolez-les dans un VLAN IoT (ex: VLAN 30) pour limiter l’accès au reste du réseau.
    • Pour pfSense (VM1) :CopyCréez un VLAN 30 → Interface dédiée → Règles de firewall : – Autoriser OUT vers Internet (HTTPS/DNS). – Bloquer l’accès aux autres VLANs (sauf exceptions comme Home Assistant).

Communication avec Home Assistant (LXC1)

  • Via le protocole local :
    • Activez Google Assistant SDK dans Home Assistant.
    • Utilisez Nabu Casa (ou un domaine personnalisé avec HTTPS) pour la liaison sécurisée.
  • Scénarios :
    • Contrôle des lumières/prises via commandes vocales.
    • Synchronisation avec vos calendriers/rappels.

Add Weather Station

source

https://github.com/maliciamrg/Bresser-Weather-Station

dns

dns record

edit 2025-03-22, the new IP is 192.212.30.10

xampp install

xamp server
sudo apt upgrade -y
sudo apt update -y
wget https://sourceforge.net/projects/xampp/files/XAMPP%20Linux/8.2.4/xampp-linux-x64-8.2.4-0-installer.run
chmod a+x xampp-linux-x64-8.2.4-0-installer.run
sudo ./xampp-linux-x64-8.2.4-0-installer.run

auto start xampp server at ubuntu startup:

sudo nano /etc/systemd/system/xampp.service
[Unit]
Description=XAMPP

[Service]
ExecStart=/opt/lampp/lampp start
ExecStop=/opt/lampp/lampp stop
Type=forking

[Install]
WantedBy=multi-user.target
sudo systemctl enable xampp.service

scripting

sudo apt update
sudo apt install php-cli unzip -y
cd ~
curl -sS https://getcomposer.org/installer -o composer-setup.php
HASH=`curl -sS https://composer.github.io/installer.sig`
php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
cd /opt/lampp/htdocs
sudo mkdir weatherstation
cd weatherstation
composer require php-mqtt/client
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

require_once ('vendor/autoload.php');

use PhpMqtt\Client\Exceptions\ConnectingToBrokerFailedException;
use PhpMqtt\Client\Exceptions\DataTransferException;
use PhpMqtt\Client\Exceptions\UnexpectedAcknowledgementException;
use PhpMqtt\Client\ConnectionSettings;
use PhpMqtt\Client\MqttClient;

const MQTT_HOST = '192.212.30.105';
const MQTT_PORT = 1883;
const MQTT_CLIENT_ID = 'weather-data-publisher';
const MQTT_USER = 'mqttuser';
const MQTT_PASSWORD = 'mqttuser';
const TOPIC = 'pws/sensors/';

$myfile = fopen("last_SERVER_QUERY_STRING.txt", "w") or die("Unable to open file!");
fwrite($myfile, $_SERVER['QUERY_STRING']);
fclose($myfile);

$winddir = $_GET["winddir"];

$wspeed = $_GET["windspeedmph"];
$wgust = $_GET["windgustmph"];
$hum = $_GET["humidity"];
$dew = $_GET["dewptf"];
$temp = $_GET["tempf"];
$rainhour = $_GET["rainin"];
$rainday = $_GET["dailyrainin"];
$baro = $_GET["baromin"];

function RoundIt($ee){
  return round($ee, 2);
}
function toKM( $a) {
  return  RoundIt( floatval($a)*1.60934);
}
function toC( $a) {
  return RoundIt(  (floatval($a)-32) * (5/9) );
}
function toMM( $a) {
    return RoundIt( floatval($a)*25.4);
}
  
function toHPA( $a) {
  return RoundIt((floatval($a)*33.8639));
}

function wind_cardinal( $degree ) { 
  switch( $degree ) {
      case ( $degree >= 348.75 && $degree <= 360 ):
          $cardinal = "N";
      break;
      case ( $degree >= 0 && $degree <= 11.249 ):
          $cardinal = "N";
      break;
      case ( $degree >= 11.25 && $degree <= 33.749 ):
          $cardinal = "NNE";
      break;
      case ( $degree >= 33.75 && $degree <= 56.249 ):
          $cardinal = "NE";
      break;
      case ( $degree >= 56.25 && $degree <= 78.749 ):
          $cardinal = "ENE";
      break;
      case ( $degree >= 78.75 && $degree <= 101.249 ):
          $cardinal = "E";
      break;
      case ( $degree >= 101.25 && $degree <= 123.749 ):
          $cardinal = "ESE";
      break;
      case ( $degree >= 123.75 && $degree <= 146.249 ):
          $cardinal = "SE";
      break;
      case ( $degree >= 146.25 && $degree <= 168.749 ):
          $cardinal = "SSE";
      break;
      case ( $degree >= 168.75 && $degree <= 191.249 ):
          $cardinal = "S";
      break;
      case ( $degree >= 191.25 && $degree <= 213.749 ):
          $cardinal = "SSW";
      break;
      case ( $degree >= 213.75 && $degree <= 236.249 ):
          $cardinal = "SW";
      break;
      case ( $degree >= 236.25 && $degree <= 258.749 ):
          $cardinal = "WSW";
      break;
      case ( $degree >= 258.75 && $degree <= 281.249 ):
          $cardinal = "W";
      break;
      case ( $degree >= 281.25 && $degree <= 303.749 ):
          $cardinal = "WNW";
      break;
      case ( $degree >= 303.75 && $degree <= 326.249 ):
          $cardinal = "NW";
      break;
      case ( $degree >= 326.25 && $degree <= 348.749 ):
          $cardinal = "NNW";
      break;
      default:
          $cardinal = null;
  }
 return $cardinal;
}

// Send it to MQTT
$mqtt = new MqttClient(MQTT_HOST, MQTT_PORT, MQTT_CLIENT_ID);

$settings = (new ConnectionSettings)
    ->setUsername(MQTT_USER)
    ->setPassword(MQTT_PASSWORD);

$mqtt->connect($settings, true);

$mqtt->publish(TOPIC.'baromin', toHPA($_GET["baromin"]), 0);
$mqtt->publish(TOPIC .'temp', toC($_GET["tempf"]), 0);
$mqtt->publish(TOPIC .'dewpt', toC($_GET["dewptf"]), 0);
$mqtt->publish(TOPIC .'humidity', $_GET["humidity"], 0);
$mqtt->publish(TOPIC .'windspeedkph', toKM($_GET["windspeedmph"]), 0);
$mqtt->publish(TOPIC .'windgustkph', toKM($_GET["windgustmph"]), 0);

// Use this WindDir if you want wind direction in degrees
$mqtt->publish(TOPIC .'winddirection', $_GET["winddir"], 0);

$mqtt->publish(TOPIC .'rainmm', toMM($_GET["rainin"]), 0);
$mqtt->publish(TOPIC .'dailyrainmm', toMM($_GET["dailyrainin"]), 0);
$mqtt->publish(TOPIC .'indoortemp', toC($_GET["indoortempf"]), 0);
$mqtt->publish(TOPIC .'indoorhumidity', $_GET["indoorhumidity"], 0);

$mqtt->disconnect();

// POST TO WU
$xml = file_get_contents("http://pws-ingest-use1-01.sun.weather.com/weatherstation/updateweatherstation.php?".$_SERVER['QUERY_STRING']);

?>
success

test

http://192.212.30.10/weatherstation/updateweatherstation.php?ID=IANTON13&PASSWORD=nY2hD3eO&action=updateraww&realtime=1&rtfreq=5&dateutc=now&baromin=29.91&tempf=75.9&dewptf=60.4&humidity=59&windspeedmph=3.5&windgustmph=4.0&winddir=45&rainin=0.0&dailyrainin=0.0&indoortempf=81.1&indoorhumidity=53

smart shutter firmware

https://github.com/openshwprojects/OpenBK7231T_App

https://templates.blakadder.com/WF-CS01_EU.html

https://developer.tuya.com/en/docs/iot/wb3s-module-datasheet?id=K9dx20n6hz5n4

https://community.home-assistant.io/t/detailed-guide-on-how-to-flash-the-new-tuya-beken-chips-with-openbk7231t/437276

https://github.com/openshwprojects/OpenBK7231T_App/blob/main/docs/commands.md

https://www.elektroda.com/rtvforum/viewtopic.php?p=20433363#20433363

//Channel 0 ==> opening 
//Channel 1 ==> stop 
//Channel 2 ==> closing 
//Channel 3 ==> Color Blue (night Mode) 
//Channel 4 ==> value_template (open / closed)


//blue led on
SetStartValue 3 1

// interlock relais
addChangeHandler Channel0 == 1 SetChannel 2 0
addChangeHandler Channel2 == 1 SetChannel 0 0

//cancel button
addChangeHandler Channel1 == 1 SetChannel 0 0
addChangeHandler Channel1 == 1 SetChannel 2 0

//toggle night led mode
addEventHandler OnHold 10 ToggleChannel 3

//auto cancel relais after delai 34s
addChangeHandler Channel0 == 1 addRepeatingEventID 34 1 910 backlog SetChannel 0 0;SetChannel 4 1;
addChangeHandler Channel2 == 1 addRepeatingEventID 34 1 912 backlog SetChannel 2 0;SetChannel 4 0;

//auto cancel cancel button after 5s
addChangeHandler Channel1 == 1 addRepeatingEventID 5 1 911 SetChannel 1 0

//auto cancel cancel relai
addChangeHandler Channel1 == 1 cancelRepeatingEvent 910
addChangeHandler Channel1 == 1 cancelRepeatingEvent 912

https://community.home-assistant.io/t/template-cover-for-garage-door/241763/26

      garden:
        unique_id: template_cov_gardene
        device_class: shutter
        friendly_name: "Cover Garden"
        open_cover:
          - service: switch.turn_on
            target:
              entity_id: switch.obk61c3f99d_0
        close_cover:
          - service: switch.turn_on
            target:
              entity_id: switch.obk61c3f99d_2
        stop_cover:
          service: switch.turn_on
          target:
            entity_id: switch.obk61c3f99d_1
        value_template: >-
          {% if is_state('switch.cover_garden_4', 'on') %}
            open
          {% else %}
            closed
          {% endif %}

Wall Thermostat firmware

https://tasmota.github.io/docs/devices/TYWE3S/

https://templates.blakadder.com/Moes_WHT-HY609.html

https://github.com/blakadder/templates/blob/master/_templates/Moes_WHT-HY609

https://tasmota.github.io/docs/TuyaMCU/#dpid

https://github.com/sillyfrog/Tasmota-Tuya-Helper

{"NAME":"WHT-HY609-GB-WH-MS","GPIO":[0,2304,0,2272,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54,"CMND":"tuyamcu 11,1 | tuyamcu 71,3 | tuyamcu 72,2 | tuyamcu 63,4"}

https://blakadder.com/tuya-climate/

mqtt:
  climate:
    name: "MQTT Heater"
    unique_id: mqtt_heater_generic_thermostat
    modes: 
      - "heat"
      - "off"
    mode_command_topic: "cmnd/tasmota_6F492A/POWER1"
    mode_command_template: "{{'1' if value == 'heat' else '0'}}"
    mode_state_topic: "tele/tasmota_6F492A/STATE"
    mode_state_template: "{{'heat' if value_json.POWER == 'ON' else 'off'}}"
    current_temperature_topic: "tele/tasmota_6F492A/SENSOR"
    current_temperature_template: "{{value_json['TuyaSNS']['Temperature']}}"
    temperature_state_topic: "tele/tasmota_6F492A/SENSOR"
    temperature_state_template: "{{value_json['TuyaSNS']['TempSet']}}"
    min_temp: 18
    max_temp: 28
    precision: 0.5
    temperature_command_topic: "cmnd/tasmota_6F492A/TUYASEND2"
    temperature_command_template: "2,{{value*10|int}}"
    availability_topic: tele/tasmota_6F492A/LWT
    payload_available: Online
    payload_not_available: Offline

smart switch

https://codesandbolts.com/girier-smart-switch-wifi-w6b

https://github.com/ct-Open-Source/tuya-convert/issues/721

Hi Guys,
I also had a long time to try flash this WiFI-W6B. My solution is to unsolder and lift up pin 11 of unmarked chip (see yellow route on screen above). This route is connected to U0RXD (pin 25) of ESP8285 and probably blocking UART exchange.
Also don’t forget about GPIO0.
Good luck all.

In this PCB we can see a different orientation of unmarked chip. After tracing I make sure that pin 5 (not 11 as earlier!) is connected to pin 25 (U0RXD) of ESP8285. When I applied the previous method and lift up pin 5 of unmarked chip, flashing was started.

{"NAME":"1 Gang","GPIO":[0,288,0,0,0,32,0,0,224,0,0,0,0,0],"FLAG":0,"BASE":1}
{"NAME":"2 Gang","GPIO":[0,288,0,32,33,0,0,0,0,224,225,0,0,0],"FLAG":0,"BASE":29}
{"NAME":"3 Gang","GPIO":[0,52,0,17,19,18,0,0,22,21,23,0,0],"FLAG":0,"BASE":30}

smart plug update firmware 2

https://community.home-assistant.io/t/detailed-guide-on-how-to-flash-the-new-tuya-beken-chips-with-openbk7231t/437276

https://github.com/maliciamrg/OpenBK7231T_App

https://github.com/openshwprojects/OpenBK7231T/blob/master/bk_writer1.60.zip

https://developer.tuya.com/en/docs/iot/wb2s-module-datasheet?id=K9ghecl7kc479

https://www.elektroda.com/rtvforum/topic3937910.html

It is strongly advised to calibrate the plug. You are using default values which are not perfect for your exact device.

Please get a reliable power meter, plug the 60W bulb into the socket, and use following commands to adjust readings:
– VoltageSet [RealVoltageFromReliableMeter]
– CurrentSet [RealCurrentFromReliableMeter]
– PowerSet [RealPowerFromReliableMeter]
Just like in Tasmota.

PowerSet 77

VoltageSet 220

CurrentSet 350 (1000*(77.0/220.0))

smart plug update firmware

https://templates.blakadder.com/index.html

https://www.home-assistant.io/integrations/tasmota

https://www.elektroda.com/rtvforum/topic3937910.html

http://networkingathome.blogspot.com/2020/02/installing-tasmota-firmware-for-cheap.html

https://codesandbolts.com/bsd29-smart-socket-esp8285/

https://wiki.soloshin.su/iot/firmware/tasmota/athom/pg01-eu16a#fn__12

{"NAME":"GIRER JR PM01","GPIO":[0,321,0,2624,2688,2656,0,0,224,32,320,0,544,0],"FLAG":0,"BASE":6}

https://tasmota.github.io/docs/Power-Monitoring-Calibration/#fine-tuning

PowerSet 77

VoltageSet 220

CurrentSet 350 (1000*(77.0/220.0))