Raumklima Erfassung mit ESPHome

Philips Hue Wandschalter Modul, Doppelpack, ermöglicht ständige Erreichbarkeit von Hue Lampen, Installation hinter vorhandende Wandschalter, 2-er Pack, Weiß
Philips Hue Wandschalter Modul, Doppelpack, ermöglicht ständige Erreichbarkeit von Hue Lampen, Installation hinter vorhandende Wandschalter, 2-er Pack, Weiß
Unverb. Preisempf.: 79,99 €
49,99 €
Sie sparen 30,00 € (38%)

Raumtemperatur und Luftfeuchtigkeit erfassen leicht gemacht mit ESPHome

Steigende Gas und Strompreise haben mich nachdenken lassen und da bin auf
die Idee gekommen jeden Raum zu überwachen damit ich weiß welche Temperaturen
und Luftfeuchtigkeit in welchem Raum vorliegen.
Sicher kann man das auch mit Thermostaten überwachen aber die erfassen meiner
Meinung nach die Temperatur nicht sehr genau. Außerdem dachte ich mir, wäre es
nicht schlecht das ganze über ein Display anzeigen zu lassen. Da die meisten ja
einen Home Assistant im Einsatz haben, ist es nur logisch auch die Außentemperatur
anzeigen zu lassen und „last but not least“ darf die Uhrzeit nicht
fehlen.

Dazu habe ich ein Gehäuse entworfen um alle nötigen Komponenten zu verbauen.

https://www.thingiverse.com/thing:5520992

Die Grundfunktion wie Temperatur und Luftfeuchtigkeit laufen komplett auf
dem ESP selbst (Kein HA nötig). Zusätzlich wird der Sonnenstand ermittelt damit
das Display nachts gedimmt wird.

Des Weiteren besteht wenn man es möchte die Möglichkeit alle Sensoren vom Home
Assistant auf dem Display anzeigen zu lassen. Da sind eurer Fantasie keine
Grenzen gesetzt.

Anschlusse auf dem ESP Chip:
D1: RES ->Display
D2: Data -> DHT11
D5: D0 -> Display
D6: DC -> Display
D7: D1 -> Display
D8: CS -> Display

VCC und GND sollte soweit klar sein. (VCC immer 3.3v nicht 5v)
Die NodeMCU verfügt über 2x 3.3v und 2x GND

Der Temperatur Sensor muss kalibriert werden damit die Wärme vom Sensor selbst und der NodeMCU den wirklichen Wert nicht verfälscht.
Das lässt sich sehr einfach bewerkstäligen indem man einen Filter setzt.
In meinem Fall sieht das wie folgt aus:

      filters:
        - calibrate_linear:
            - 0.0 -> 0.0
            - 24.4 -> 21.7

Um die Differenz zu ermitteln muss der Filter mit einer # deaktiviert werden

      #filters:
      #  - calibrate_linear:
      #      - 0.0 -> 0.0
      #      - 24.4 -> 21.7

Dadurch wird der reale Wert angezeigt der korrigiert werden muss.
Dazu braucht ihr ein weiteres Thermometer um die tatsächliche Temperatur zu ermitteln.
Der linke wert zeigt den Wert an der vom Sensor gemessen wurde und der rechte Wert zeigt den Wert an der von euch gemessen wurde.
Durch das Eintragen der beiden Werte ist der Sensor kalibriert.

Um den richtigen Sonnenstand zu ermitteln ist es wichtig die richtigen Längen- und Breitengrade einzutragen. Diese Werte kann man über div. Seiten im Internet ermitteln.

sun:
  latitude: 52.3923°
  longitude: 13.5170°

Hier der komplette Code:

esphome:
  name: raumklima-wohnzimmer

esp8266:
  board: nodemcuv2

logger:
api:
ota:
wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  ap:
    ssid: "raumklima-wohnzimmer"
    password: "E7TE90zuyCxr"

captive_portal:
    
sensor:
  - platform: dht
    pin: D2
    temperature:
      name: "Wohnzimmer Temperatur"
      id: "temp_wz"
      filters:
        - calibrate_linear:
            - 0.0 -> 0.0
            - 24.4 -> 21.7
    humidity:
      name: "Wohnzimmer Luftfeuchtigkeit"
      id: "feuchte_wz"
    update_interval: 10s

  - platform: homeassistant
    id: temp_aussen
    entity_id: sensor.temp_aussen

time:
  - platform: homeassistant
    id: homeassistant_time
    
sun:
  latitude: 52.3923°
  longitude: 13.5170°
  on_sunrise:
    - then:
        - light.turn_on:
            id: oled_light2
  on_sunset:
    - then:
        - light.turn_off:
            id: oled_light2

font:
  - file: 'arial.ttf'
    id: font1
    size: 20
    glyphs:
          ['&', '@', '!', ',', '.', '?', '"', '%', '(', ')', '+', '-', '_', ':', '°', '0',
           '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
           'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
           'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
           'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
           'u', 'v', 'w', 'x', 'y', 'z','å', 'Ä', 'ä', 'Ö', 'ö', 'Ü', 'ü', 'ß', '/']
  - file: 'arial.ttf'
    id: font2
    size: 12
    glyphs:
          ['&', '@', '!', ',', '.', '?', '"', '%', '(', ')', '+', '-', '_', ':', '°', '0',
           '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
           'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
           'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
           'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
           'u', 'v', 'w', 'x', 'y', 'z','å', 'Ä', 'ä', 'Ö', 'ö', 'Ü', 'ü', 'ß', '/']
  - file: 'arial.ttf'
    id: font3
    size: 16
    glyphs:
          ['&', '@', '!', ',', '.', '?', '"', '%', '(', ')', '+', '-', '_', ':', '°', '0',
           '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
           'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
           'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
           'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
           'u', 'v', 'w', 'x', 'y', 'z','å', 'Ä', 'ä', 'Ö', 'ö', 'Ü', 'ü', 'ß', '/']
           
  - file: 'arial.ttf'
    id: font4
    size: 18
    glyphs:
          ['&', '@', '!', ',', '.', '?', '"', '%', '(', ')', '+', '-', '_', ':', '°', '0',
           '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
           'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
           'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
           'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
           'u', 'v', 'w', 'x', 'y', 'z','å', 'Ä', 'ä', 'Ö', 'ö', 'Ü', 'ü', 'ß', '/']

spi:
  clk_pin: D5 
  mosi_pin: D7 

display:
  - platform: ssd1306_spi
    model: "SSD1306 128x64"
    id: my_display
    cs_pin: D8 
    dc_pin: D6 
    reset_pin: D1 
    pages:
      - id: page1
        lambda: |-
          it.printf(1, 0, id(font1), "%.1f°C", id(temp_wz).state);
          it.printf(70, 0, id(font1), "%.1f%%", id(feuchte_wz).state);
          it.printf(4, 22, id(font2), "Außentemperatur");
          it.printf(1, 33, id(font3), "%.1f°C", id(temp_aussen).state);
          it.strftime(56, 45, id(font4), "%X", id(homeassistant_time).now());

switch:
  - platform: template
    name: "Oled Backlights2"
    id: oled_backlight2
    assumed_state: true
    optimistic: true
    turn_on_action:
      then:
        - lambda: |-
            id(my_display).turn_on();
            id(my_display).fill(COLOR_ON);
    turn_off_action:
      then:
        - lambda: |-
            id(my_display).turn_off();
            id(my_display).fill(COLOR_OFF);
            
light:
  - platform: monochromatic
    name: "OLED Contrast2"
    output: oled_bc
    id: oled_light2
    
output:
  - platform: template
    id: oled_bc
    type: float
    write_action:
      then:
        - lambda: id(my_display).set_contrast(state);

Und ja der Druck sieht nicht schön aus da es sich um einen Prototypen handelt.