packages: led_indicator: !include led_status.yaml globals: - id: custom_prefix type: std::string esphome: name: esphome-bohemahouse friendly_name: ESPHome BohemaHouse name_add_mac_suffix: true on_boot: priority: 800.0 then: - lambda: |- std::string auto_node_name = App.get_name(); /* MQTT topic prefix */ id(custom_prefix) = "bohemahouse/" + auto_node_name; id(mqtt_client)->set_topic_prefix(id(custom_prefix), auto_node_name); /* AP fallback */ auto ap_config = id(wifi_component)->get_ap(); ap_config.set_ssid(auto_node_name); ap_config.set_password("bohemahouse"); id(wifi_component)->set_ap(ap_config); - script.execute: id: set_led_state state_name: "WIFI_SEARCHING" esp32: board: nodemcu-32s framework: type: arduino logger: level: VERBOSE interval: - interval: 2s then: - if: condition: lambda: 'return id(bh_captive_portal)->is_active();' then: - script.execute: id: set_led_state state_name: "AP_FALLBACK" switch: - platform: gpio name: LED id: switch_led internal: true pin: GPIO2 web_server: port: 80 auth: username: !secret web_server_username password: !secret web_server_password ota: - platform: web_server on_progress: then: - script.execute: id: set_led_state state_name: "OTA_UPDATE" wifi: id: wifi_component ssid: !secret wifi_ssid_test password: !secret wifi_password_test fast_connect: true power_save_mode: HIGH on_connect: then: - script.execute: id: set_led_state state_name: "WIFI_CONNECTED" on_disconnect: then: - script.execute: id: set_led_state state_name: "WIFI_SEARCHING" ap: ap_timeout: 30s captive_portal: id: bh_captive_portal # MQTT over TLS mqtt: id: mqtt_client broker: jacknick.xyz password: !secret mqtt_secret username: winery_device port: 8883 discover_ip: false discovery: false discovery_unique_id_generator: mac certificate_authority: | -----BEGIN CERTIFICATE----- MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ 0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ 3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq 4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= -----END CERTIFICATE----- skip_cert_cn_check: true on_disconnect: then: - script.execute: id: set_led_state state_name: "MQTT_FAILED" # DS18B20 Temperature Sensor one_wire: - platform: gpio id: one_wire_gpio_1 pin: GPIO23 # Sensor usage sensor: # DS18B20 1st sensor - platform: dallas_temp name: Temperature id: sensor_dallas_temp_1 index: 0 one_wire_id: one_wire_gpio_1 update_interval: 10s resolution: 12 unit_of_measurement: °C accuracy_decimals: 1 internal: true on_value: then: - mqtt.publish: topic: !lambda return id(custom_prefix) + "/sensor/barrel/1/temperature/state"; payload: !lambda return String(x).c_str(); - script.execute: id: set_led_state state_name: MQTT_SUCCESS # DS18B20 2nd sensor - platform: dallas_temp name: Temperature id: sensor_dallas_temp_2 index: 1 one_wire_id: one_wire_gpio_1 update_interval: 10s resolution: 12 unit_of_measurement: °C accuracy_decimals: 1 internal: true on_value: then: - mqtt.publish: topic: !lambda return id(custom_prefix) + "/sensor/barrel/2/temperature/state"; payload: !lambda return String(x + 1.0).c_str(); - script.execute: id: set_led_state state_name: MQTT_SUCCESS # DHT22 - platform: dht id: sensor_dht_1 pin: GPIO22 humidity: name: Room Humidity id: sensor_dht_1_humidity internal: true on_value: then: - mqtt.publish: topic: !lambda |- return id(custom_prefix) + "/sensor/room/1/humidity/state"; payload: !lambda 'return String(x).c_str();' - script.execute: id: set_led_state state_name: MQTT_SUCCESS temperature: name: Room Temperature id: sensor_dht_1_temperature internal: true on_value: then: - mqtt.publish: topic: !lambda |- return id(custom_prefix) + "/sensor/room/1/temperature/state"; payload: !lambda 'return String(x).c_str();' - script.execute: id: set_led_state state_name: MQTT_SUCCESS update_interval: 15s # Factory Reset — hold BOOT button 10 seconds binary_sensor: - platform: gpio name: GPIO Binary Sensor id: boot_button internal: true pin: number: GPIO0 mode: input: true pullup: true inverted: true filters: - delayed_on: 10s on_press: - logger.log: "Factory reset triggered!" - button.press: button_factory_reset button: - platform: factory_reset name: Factory Reset id: button_factory_reset internal: true text_sensor: - platform: wifi_info ip_address: name: "Device IP Address" mac_address: name: "Device Unique MAC Address"