diff --git a/3d/box.scad b/3d/box.scad new file mode 100644 index 0000000..f3dbb26 --- /dev/null +++ b/3d/box.scad @@ -0,0 +1,28 @@ +// Maße +width = 100; +height = 70; +depth = 30; +wall = 2; + +// Hauptgehäuse +difference() { + // Außengehäuse + cube([width, height, depth]); + + // Innenaushöhlung + translate([wall, wall, wall]) + cube([width - 2*wall, height - 2*wall, depth - wall]); + + // Display-Ausschnitt vorne + translate([15, 20, depth - 1]) + cube([70, 30, 2]); + + // USB-Ausschnitt unten hinten + translate([width/2 - 5, -1, 5]) + cube([10, wall + 1, 5]); + + // Kippschalter oben (rundes Loch) + translate([width/2, height - wall, depth - 10]) + rotate([90, 0, 0]) + cylinder(h = wall + 2, r = 10, $fn=64); +} diff --git a/local_code/ESPHome/configuration.yaml b/local_code/ESPHome/configuration.yaml index bc0d731..5e53ee8 100644 --- a/local_code/ESPHome/configuration.yaml +++ b/local_code/ESPHome/configuration.yaml @@ -11,10 +11,8 @@ esp32: framework: type: esp-idf -# Enable logging logger: -# Enable Home Assistant API api: encryption: key: "gLfRXKqMU9IvvwZnIdrWYIclAnc4q5sHVwTkRzUxKyw=" @@ -23,45 +21,89 @@ ota: - platform: esphome password: "1618b7dc423684c5d3661481ce284359" -font: - +font: - file: "gfonts://Roboto" id: my_font - size: 20 + size: 18 image: - file: "cat.svg" id: cat_img resize: 64x64 - type: BINARY # oder MONO für 1-Bit + type: BINARY wifi: ssid: !secret wifi_ssid password: !secret wifi_password - # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "Doorwhat Fallback Hotspot" password: "KBiNyP7EkHCJ" captive_portal: +time: + - platform: homeassistant + id: ha_time + sensor: - platform: homeassistant entity_id: sensor.shellyhtg3_8cbfeaa53d88_humidity id: bad_feuchtigkeit - + spi: clk_pin: 2 mosi_pin: 15 - color: - id: red hex: "FF0000" - id: black hex: "FFFFFF" +globals: + - id: last_on_time + type: std::string + restore_value: no + initial_value: '"Noch nie"' + - id: previous_on_time + type: std::string + restore_value: no + initial_value: '"Noch nie"' + +text_sensor: + - platform: template + name: "Letzter Gong" + id: letzter_gong_sensor + - platform: template + name: "Vorheriger Gong" + id: vorheriger_gong_sensor + +binary_sensor: + - platform: gpio + pin: + number: 18 + mode: INPUT + id: opto_in + name: "Optokoppler Eingang" + on_press: + then: + - lambda: |- + auto time = id(ha_time).now(); + std::string new_time; + if (time.is_valid()) { + new_time = time.strftime("%Y-%m-%d %H:%M:%S"); + } else { + new_time = "Zeit unbekannt"; + } + + id(previous_on_time) = id(last_on_time); + id(last_on_time) = new_time; + + id(letzter_gong_sensor).publish_state(id(last_on_time)); + id(vorheriger_gong_sensor).publish_state(id(previous_on_time)); + - component.update: my_display + display: - platform: waveshare_epaper model: 2.90in3c @@ -71,10 +113,14 @@ display: busy_pin: 5 rotation: 270 reset_duration: 2ms - update_interval: 30s - lambda: !lambda |- - it.print(0, 4, id(my_font), id(black), "DoorWhat v0.1"); - it.print(80, 40, id(my_font), id(red), "Meow!"); - //it.printf(0, 80, id(my_font), id(red), "Feuchtigkeit Bad %.1f", id(bad_feuchtigkeit).state); - it.image(150, 40, id(cat_img)); + id: my_display + update_interval: 600s # alle 10 Minuten automatisch + lambda: |- + it.print(0, 4, id(my_font), id(black), "DoorWhat v1.0"); + it.print(170, 65, id(my_font), id(red), "Meow!"); + it.image(186, 1, id(cat_img)); + it.print(0, 30, id(my_font), id(black), "Letzter Gong:"); + it.print(0, 50, id(my_font), id(red), id(last_on_time).c_str()); + it.print(0, 70, id(my_font), id(black), "Vorheriger Gong:"); + it.print(0, 90, id(my_font), id(red), id(previous_on_time).c_str());