Ich lese von einem nodemcu die temperatur ein und möchte diese auf dem Display , das an einem zweiten nodemcu angeschlossen ist, anzeigen.
Leider ist die angezeigte Temperatur völlig falsch. Die Anzeige wechselt immer nur von “1.9” zu “2.0” und “0.0”.
Dabei habe ich mehrere Formatierungen zur Anzeige der Temperatur ausprobiert:
text_sensor, sensor, %.1f, %s, … Erfolglos.
Das Display ist ein SSD1306, der Temperatursensor ist ein DH12B20. Diese funktionieren alle hervorragend.
font:
- file: 'arial.ttf'
id: my_font48
size: 48
- file: 'arial.ttf'
id: my_font16
size: 16
# Example configuration entry for ESP32
i2c:
sda: GPIO12
scl: GPIO14
scan: true
id: bus_a
text_sensor:
- platform: homeassistant
name: "sauna-temperatur"
id: "temp"
entity_id: sensor.home_saunatemperatur
display:
- platform: ssd1306_i2c
model: "SSD1306 128x64"
# invert: true
# reset_pin: D0
lambda: |-
it.printf(0, 0, id(my_font16), TextAlign::TOP_LEFT, "Sauna:");
it.printf(128, 0, id(my_font16), TextAlign::TOP_RIGHT, "°C");
it.printf(64, 16, id(my_font48), TextAlign::TOP_CENTER, "%.1f", id(temp).state);
Die Sensordaten kommen von:
sensor:
- platform: dallas_temp
address: 0x4701204213dc5328
name: "Saunatemperatur"
Die Anzeige auf dem SSD1306 sieht wie folgt aus:
Sauna °C
1.9
Ich verstehe wirklich nicht, wo diese “1.9” herkommt.
Der tatsächliche Temperaturwert ist nämlich:
26,3 °C

vielleicht ist es ein Darstellungs-/Konvertierungsthema?
Beim Compilieren gibt es nämlich die folgende Warnung:
/config/esphome/esphome-web-3839a1.yaml: In lambda function:
/config/esphome/esphome-web-3839a1.yaml:76:59: warning: format '%f' expects argument of type 'double', but argument 7 has type 'std::string' {aka 'std::__cxx11::basic_string<char>'} [-Wformat=]
76 | it.printf(64, 16, id(my_font48), TextAlign::TOP_CENTER, "%.1f", id(temp).state);
| ^~~~~~
SOLVED!
text_sensor:
- platform: homeassistant
name: "sauna-temperatur"
id: temp
entity_id: sensor.home_saunatemperatur
display:
- platform: ssd1306_i2c
model: "SSD1306 128x64"
id: oled_display
# invert: true
# reset_pin: D0
lambda: |-
it.printf(0, 0, id(my_font16), TextAlign::TOP_LEFT, "Sauna:");
it.printf(128, 0, id(my_font16), TextAlign::TOP_RIGHT, "°C");
it.printf(64, 16, id(my_font48), TextAlign::TOP_CENTER, "%s", id(temp).state.c_str());
care for:
“text_sensor”
and
“%s” with “.c_str()”
