esphome: name: faradfahrrad esp8266: board: nodemcuv2 # Enable logging logger: ota: password: !secret ota_password wifi: ssid: !secret wifi_ssid id: wifi_client password: !secret wifi_password manual_ip: static_ip: 192.168.4.7 gateway: 192.168.4.1 subnet: 192.168.4.255 use_address: faradfahrrad.iot.snel.it reboot_timeout: 0s output: - platform: gpio pin: number: D0 inverted: true id: gpio_d0 - platform: esp8266_pwm id: pwm_output pin: D3 frequency: 50 Hz mqtt: broker: 192.168.4.1 reboot_timeout: 0s font: - file: "Courier_New.ttf" id: my_font size: 15 glyphs: "/!\"%()+=,-_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz<>" - file: "Courier_New.ttf" id: my_small_font size: 10 glyphs: "rpm" - file: "materialdesignicons-webfont.ttf" id: icons size: 13 glyphs: [ "\U000F092E", # mdi-wifi-strength-off-outline "\U000F091F", # mdi-wifi-strength-1 "\U000F0922", # mdi-wifi-strength-2 "\U000F0925", # mdi-wifi-strength-3 "\U000F0928", # mdi-wifi-strength-4 "\U000F008E", # mdi-battery-outline "\U000F007A", # mdi-battery-10 "\U000F007B", # mdi-battery-20 "\U000F007C", # mdi-battery-30 "\U000F007D", # mdi-battery-40 "\U000F007E", # mdi-battery-50 "\U000F007F", # mdi-battery-60 "\U000F0080", # mdi-battery-70 "\U000F0081", # mdi-battery-80 "\U000F0082", # mdi-battery-90 "\U000F0079", # mdi-battery "\U000F010C", # mdi-car-battery "\U000F04C5", # mdi-speedometer "\U000F140B", # mdi-lightning-bolt "\U000F051B", # mdi-timer-outline ] - file: "materialdesignicons-webfont.ttf" id: icons_larger size: 14 glyphs: [ "\U000F109C", # mdi-bicycle ] - file: "materialdesignicons-webfont.ttf" id: icons_super size: 26 glyphs: [ "\U000F1A58", # mdi-meter-electric ] i2c: sda: D2 scl: D1 #time: # - platform: sntp #id: sntp_time #servers: 192.168.4.1 globals: - id: seconds type: int initial_value: '0' - id: timer_active type: bool initial_value: 'false' - id: start_energy_initialized type: bool initial_value: 'false' - id: start_energy type: float display: - platform: ssd1306_i2c model: "SSD1306 128x64" address: 0x3C rotation: 0 lambda: |- float voltage = id(system_voltage).state; float perc5, perc21; if (voltage < 6) { perc5 = 0; } else if (voltage > 29) { perc5 = 100; } else { perc5 = (voltage*voltage - 6*6)/(29.*29. - 6*6)*100; } if (voltage < 21) { perc21 = 0; } else if (voltage > 29) { perc21 = 100; } else { perc21 = (voltage*voltage - 21*21)/(29.*29. - 21*21)*100; } if (id(wifi_client)->is_connected()) { if (id(wifi_signal_strength).state > -67) { it.print(127, -1, id(icons), TextAlign::TOP_RIGHT, "\U000F0928"); } else if (id(wifi_signal_strength).state > -70) { it.print(127, -1, id(icons), TextAlign::TOP_RIGHT, "\U000F0925"); } else if (id(wifi_signal_strength).state > -80) { it.print(127, -1, id(icons), TextAlign::TOP_RIGHT, "\U000F0922"); } else { it.print(127, -1, id(icons), TextAlign::TOP_RIGHT, "\U000F091F"); } } else { it.print(127, 0, id(icons), TextAlign::TOP_RIGHT, "\U000F092E"); } if (perc5 <= 0) { it.print(111, -1, id(icons), TextAlign::TOP_RIGHT, "\U000F008E"); } else if (perc5 <= 10) { it.print(111, -1, id(icons), TextAlign::TOP_RIGHT, "\U000F007A"); } else if (perc5 <= 20) { it.print(111, -1, id(icons), TextAlign::TOP_RIGHT, "\U000F007B"); } else if (perc5 <= 30) { it.print(111, -1, id(icons), TextAlign::TOP_RIGHT, "\U000F007C"); } else if (perc5 <= 40) { it.print(111, -1, id(icons), TextAlign::TOP_RIGHT, "\U000F007D"); } else if (perc5 <= 50) { it.print(111, -1, id(icons), TextAlign::TOP_RIGHT, "\U000F007E"); } else if (perc5 <= 60) { it.print(111, -1, id(icons), TextAlign::TOP_RIGHT, "\U000F007F"); } else if (perc5 <= 70) { it.print(111, -1, id(icons), TextAlign::TOP_RIGHT, "\U000F0080"); } else if (perc5 <= 80) { it.print(111, -1, id(icons), TextAlign::TOP_RIGHT, "\U000F0081"); } else if (perc5 <= 90) { it.print(111, -1, id(icons), TextAlign::TOP_RIGHT, "\U000F0082"); } else { it.print(111, -1, id(icons), TextAlign::TOP_RIGHT, "\U000F0079"); } it.print(0, 0, id(icons_larger), TextAlign::TOP_LEFT, "\U000F109C"); int secs = id(seconds); int minutes = (secs/60)%100; secs %= 60; it.line(0, 14, 13, 14); it.line(114, 14, 127, 14); if (perc21 > 0) { it.line(14, 13, perc21 + 13, 13); it.line(14, 14, perc21 + 13, 14); it.line(14, 15, perc21 + 13, 15); } if (voltage >= 28.7 && !id(timer_active)) id(timer_active) = true; it.print(16, 9, id(my_font), TextAlign::BASELINE_LEFT, "Fa(hr)rad"); it.print(0, 26, id(icons), TextAlign::BASELINE_LEFT, "\U000F010C"); it.printf(16, 25, id(my_font), TextAlign::BASELINE_LEFT, "%4.1fV", voltage); it.print(0, 63, id(icons_super), TextAlign::BASELINE_LEFT, "\U000F1A58"); if (!id(start_energy_initialized) && !isnan(id(ff_generated).state)) { id(start_energy_initialized) = true; id(start_energy) = id(ff_generated).state; } if (id(start_energy_initialized)) { it.printf(128, 49, id(my_font), TextAlign::BASELINE_RIGHT, "trip%5.0fWh", (id(ff_generated).state - id(start_energy))*1000); it.printf(128, 61, id(my_font), TextAlign::BASELINE_RIGHT, "tot%6.0fWh", id(ff_generated).state*1000+947); } else { it.print(128, 49, id(my_font), TextAlign::BASELINE_RIGHT, "trip 0Wh"); it.print(128, 61, id(my_font), TextAlign::BASELINE_RIGHT, "tot------Wh"); } it.print(0, 38, id(icons), TextAlign::BASELINE_LEFT, "\U000F051B"); it.printf(16, 37, id(my_font), TextAlign::BASELINE_LEFT, "%2d:%02d", minutes, secs); it.print(64, 26, id(icons), TextAlign::BASELINE_LEFT, "\U000F04C5"); it.printf(84, 25, id(my_font), TextAlign::BASELINE_LEFT, "%3.0f", id(generator_rpm).state); it.print(128, 25, id(my_small_font), TextAlign::BASELINE_RIGHT, "rpm"); it.print(64, 38, id(icons), TextAlign::BASELINE_LEFT, "\U000F140B"); if (isnan(id(ff_power).state)) { it.print(128, 37, id(my_font), TextAlign::BASELINE_RIGHT, " ---W"); } else { it.printf(128, 37, id(my_font), TextAlign::BASELINE_RIGHT, " %3.0fW", id(ff_power).state); } if (id(timer_active)) { id(seconds)++; if (voltage > 24) id(gpio_d0).turn_on(); else if (voltage < 21.1) id(gpio_d0).turn_off(); } setup_priority: -100 servo: - id: my_servo output: pwm_output number: - platform: template name: Servo Control min_value: -100 initial_value: 0 max_value: 1 step: 0.01 optimistic: true set_action: then: - servo.write: id: my_servo level: !lambda 'return 2*x -1;' uart: rx_pin: D6 tx_pin: D7 baud_rate: 9600 modbus: sensor: - platform: adc pin: A0 id: system_voltage name: "System voltage" update_interval: 2s filters: - multiply: 34.47761 - platform: pulse_meter pin: number: D5 mode: input: true pullup: false internal_filter: 333ms internal_filter_mode: EDGE id: generator_rpm timeout: 4s filters: - multiply: 3.25 name: "Generator rpm" unit_of_measurement: 'rpm' total: id: total_pulses - platform: wifi_signal name: "WiFi Signal Sensor" update_interval: 5s id: wifi_signal_strength - platform: pzemac current: name: "FF Current" voltage: name: "FF Voltage" energy: name: "FF Generated" id: ff_generated state_class: "total_increasing" device_class: "energy" unit_of_measurement: "kWh" accuracy_decimals: 3 filters: - filter_out: NAN - lambda: |- if (x > 1000000) return {}; else return x; - multiply: 0.001 power: name: "FF Power" id: ff_power filters: - filter_out: NAN - lambda: |- if (x > 1000) return {}; else return x; frequency: name: "FF Frequency" power_factor: name: "FF Power Factor" update_interval: 1s