File manager - Edit - /home/nonthaphan/smartlab-stack/services/esphome/config/.esphome/build/airterk-monitor/src/main.cpp
Back
// Auto generated code by esphome // ========== AUTO GENERATED INCLUDE BLOCK BEGIN =========== #include "esphome.h" using namespace esphome; using std::isnan; using std::min; using std::max; using namespace binary_sensor; using namespace display; using namespace switch_; logger::Logger *logger_logger; web_server_base::WebServerBase *web_server_base_webserverbase; captive_portal::CaptivePortal *captive_portal_captiveportal; wifi::WiFiComponent *wifi_wificomponent; mdns::MDNSComponent *mdns_mdnscomponent; ota::OTAComponent *ota_otacomponent; api::APIServer *api_apiserver; using namespace api; web_server::WebServer *web_server_webserver; const uint8_t ESPHOME_WEBSERVER_INDEX_HTML[174] PROGMEM = {60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 104, 116, 109, 108, 62, 60, 104, 116, 109, 108, 62, 60, 104, 101, 97, 100, 62, 60, 109, 101, 116, 97, 32, 99, 104, 97, 114, 115, 101, 116, 61, 85, 84, 70, 45, 56, 62, 60, 108, 105, 110, 107, 32, 114, 101, 108, 61, 105, 99, 111, 110, 32, 104, 114, 101, 102, 61, 100, 97, 116, 97, 58, 62, 60, 47, 104, 101, 97, 100, 62, 60, 98, 111, 100, 121, 62, 60, 101, 115, 112, 45, 97, 112, 112, 62, 60, 47, 101, 115, 112, 45, 97, 112, 112, 62, 60, 115, 99, 114, 105, 112, 116, 32, 115, 114, 99, 61, 34, 104, 116, 116, 112, 115, 58, 47, 47, 111, 105, 46, 101, 115, 112, 104, 111, 109, 101, 46, 105, 111, 47, 118, 50, 47, 119, 119, 119, 46, 106, 115, 34, 62, 60, 47, 115, 99, 114, 105, 112, 116, 62, 60, 47, 98, 111, 100, 121, 62, 60, 47, 104, 116, 109, 108, 62}; const size_t ESPHOME_WEBSERVER_INDEX_HTML_SIZE = 174; using namespace number; using namespace sensor; using namespace spi; spi::SPIComponent *spi_spicomponent; esp32::ESP32InternalGPIOPin *esp32_esp32internalgpiopin; esp32::ESP32InternalGPIOPin *esp32_esp32internalgpiopin_2; using namespace i2c; i2c::ArduinoI2CBus *i2c_arduinoi2cbus; using namespace json; preferences::IntervalSyncer *preferences_intervalsyncer; font::Font *roboto; using namespace uart; uart::ESP32ArduinoUARTComponent *uart_esp32arduinouartcomponent; esp32::ESP32InternalGPIOPin *esp32_esp32internalgpiopin_4; esp32::ESP32InternalGPIOPin *esp32_esp32internalgpiopin_3; wifi_signal::WiFiSignalSensor *wifi_signal_db; copy::CopySensor *wifi_signal_percent; sensor::LambdaFilter *sensor_lambdafilter; pmsx003::PMSX003Component *pmsx003_pmsx003component; sensor::Sensor *sensor_pm_2_5; copy::CopySensor *pm2_5_in_room; sensor::MedianFilter *sensor_medianfilter; sensor::ClampFilter *sensor_clampfilter; homeassistant::HomeassistantSensor *pm2_5_outside; homeassistant::HomeassistantBinarySensor *intake_fan_status; gpio::GPIOBinarySensor *button_change_auto_mode; binary_sensor::DelayedOnFilter *binary_sensor_delayedonfilter; binary_sensor::PressTrigger *binary_sensor_presstrigger; Automation<> *automation; lcd_pcf8574::PCF8574LCDDisplay *lcd_pcf8574_pcf8574lcddisplay; output::OutputSwitch *switch_relay_exhale; template_::TemplateSwitch *use_filter_auto; using namespace output; gpio::GPIOBinaryOutput *output_relay_exhale; esp32::ESP32InternalGPIOPin *esp32_esp32internalgpiopin_6; switch_::ToggleAction<> *switch__toggleaction; esp32::ESP32InternalGPIOPin *esp32_esp32internalgpiopin_5; #define yield() esphome::yield() #define millis() esphome::millis() #define micros() esphome::micros() #define delay(x) esphome::delay(x) #define delayMicroseconds(x) esphome::delayMicroseconds(x) // ========== AUTO GENERATED INCLUDE BLOCK END ===========" void setup() { // ========== AUTO GENERATED CODE BEGIN =========== // async_tcp: // {} // esphome: // name: airterk-monitor // friendly_name: Airterk monitor // project: // name: smartlab.airterk // version: 0.0.1 // build_path: build/airterk-monitor // area: '' // platformio_options: {} // includes: [] // libraries: [] // name_add_mac_suffix: false // min_version: 2023.11.6 App.pre_setup("airterk-monitor", "Airterk monitor", "", "", __DATE__ ", " __TIME__, false); // binary_sensor: // display: // switch: // logger: // level: VERBOSE // id: logger_logger // baud_rate: 115200 // tx_buffer_size: 512 // deassert_rts_dtr: false // hardware_uart: UART0 // logs: {} logger_logger = new logger::Logger(115200, 512); logger_logger->set_uart_selection(logger::UART_SELECTION_UART0); logger_logger->pre_setup(); logger_logger->set_component_source("logger"); App.register_component(logger_logger); // web_server_base: // id: web_server_base_webserverbase web_server_base_webserverbase = new web_server_base::WebServerBase(); web_server_base_webserverbase->set_component_source("web_server_base"); App.register_component(web_server_base_webserverbase); // captive_portal: // id: captive_portal_captiveportal // web_server_base_id: web_server_base_webserverbase captive_portal_captiveportal = new captive_portal::CaptivePortal(web_server_base_webserverbase); captive_portal_captiveportal->set_component_source("captive_portal"); App.register_component(captive_portal_captiveportal); // wifi: // networks: // - ssid: !secret 'wifi_ssid' // password: !secret 'wifi_password' // priority: 1.0 // id: wifi_wifiap // - ssid: !secret 'wifi_backup_ssid' // password: !secret 'wifi_backup_password' // id: wifi_wifiap_2 // priority: 0.0 // ap: // ssid: Airterk-Monitor Fallback Hotspot // password: SDRqWmYdf6bT // id: wifi_wifiap_3 // ap_timeout: 1min // id: wifi_wificomponent // domain: .local // reboot_timeout: 15min // power_save_mode: LIGHT // fast_connect: false // passive_scan: false // enable_on_boot: true // use_address: airterk-monitor.local wifi_wificomponent = new wifi::WiFiComponent(); wifi_wificomponent->set_use_address("airterk-monitor.local"); { wifi::WiFiAP wifi_wifiap = wifi::WiFiAP(); wifi_wifiap.set_ssid("@IOT323"); wifi_wifiap.set_password("IOT11223344"); wifi_wifiap.set_priority(1.0f); wifi_wificomponent->add_sta(wifi_wifiap); } { wifi::WiFiAP wifi_wifiap_2 = wifi::WiFiAP(); wifi_wifiap_2.set_ssid("@Room323AX6000"); wifi_wifiap_2.set_password("1122334455"); wifi_wifiap_2.set_priority(0.0f); wifi_wificomponent->add_sta(wifi_wifiap_2); } { wifi::WiFiAP wifi_wifiap_3 = wifi::WiFiAP(); wifi_wifiap_3.set_ssid("Airterk-Monitor Fallback Hotspot"); wifi_wifiap_3.set_password("SDRqWmYdf6bT"); wifi_wificomponent->set_ap(wifi_wifiap_3); } wifi_wificomponent->set_ap_timeout(60000); wifi_wificomponent->set_reboot_timeout(900000); wifi_wificomponent->set_power_save_mode(wifi::WIFI_POWER_SAVE_LIGHT); wifi_wificomponent->set_fast_connect(false); wifi_wificomponent->set_passive_scan(false); wifi_wificomponent->set_enable_on_boot(true); wifi_wificomponent->set_component_source("wifi"); App.register_component(wifi_wificomponent); // mdns: // id: mdns_mdnscomponent // disabled: false // services: [] mdns_mdnscomponent = new mdns::MDNSComponent(); mdns_mdnscomponent->set_component_source("mdns"); App.register_component(mdns_mdnscomponent); // ota: // password: 401bcfd5869c6d823b14d834d8503629 // id: ota_otacomponent // safe_mode: true // port: 3232 // reboot_timeout: 5min // num_attempts: 10 ota_otacomponent = new ota::OTAComponent(); ota_otacomponent->set_port(3232); ota_otacomponent->set_auth_password("401bcfd5869c6d823b14d834d8503629"); ota_otacomponent->set_component_source("ota"); App.register_component(ota_otacomponent); if (ota_otacomponent->should_enter_safe_mode(10, 300000)) return; // api: // encryption: // key: qd/hMS03s8prG2PFzVQzncsD6m5K7XC6Pz4VJ2aVZ/4= // id: api_apiserver // port: 6053 // password: '' // reboot_timeout: 15min api_apiserver = new api::APIServer(); api_apiserver->set_component_source("api"); App.register_component(api_apiserver); api_apiserver->set_port(6053); api_apiserver->set_password(""); api_apiserver->set_reboot_timeout(900000); api_apiserver->set_noise_psk({169, 223, 225, 49, 45, 55, 179, 202, 107, 27, 99, 197, 205, 84, 51, 157, 203, 3, 234, 110, 74, 237, 112, 186, 63, 62, 21, 39, 102, 149, 103, 254}); // web_server: // auth: // username: admin // password: '@dmin321' // port: 8088 // id: web_server_webserver // version: 2 // enable_private_network_access: true // web_server_base_id: web_server_base_webserverbase // include_internal: false // ota: true // log: true // css_url: '' // js_url: https:oi.esphome.io/v2/www.js web_server_webserver = new web_server::WebServer(web_server_base_webserverbase); web_server_webserver->set_component_source("web_server"); App.register_component(web_server_webserver); web_server_base_webserverbase->set_port(8088); web_server_webserver->set_allow_ota(true); web_server_webserver->set_expose_log(true); web_server_base_webserverbase->set_auth_username("admin"); web_server_base_webserverbase->set_auth_password("@dmin321"); web_server_webserver->set_include_internal(false); // number: // sensor: // spi: // - clk_pin: // number: 18 // mode: // output: true // input: false // open_drain: false // pullup: false // pulldown: false // drive_strength: 20.0 // id: esp32_esp32internalgpiopin // ignore_strapping_warning: false // inverted: false // mosi_pin: // number: 23 // mode: // output: true // input: false // open_drain: false // pullup: false // pulldown: false // drive_strength: 20.0 // id: esp32_esp32internalgpiopin_2 // ignore_strapping_warning: false // inverted: false // id: spi_spicomponent // force_sw: false // interface: any // interface_index: 0 spi_spicomponent = new spi::SPIComponent(); spi_spicomponent->set_component_source("spi"); App.register_component(spi_spicomponent); esp32_esp32internalgpiopin = new esp32::ESP32InternalGPIOPin(); esp32_esp32internalgpiopin->set_pin(::GPIO_NUM_18); esp32_esp32internalgpiopin->set_inverted(false); esp32_esp32internalgpiopin->set_drive_strength(::GPIO_DRIVE_CAP_2); esp32_esp32internalgpiopin->set_flags(gpio::Flags::FLAG_OUTPUT); spi_spicomponent->set_clk(esp32_esp32internalgpiopin); esp32_esp32internalgpiopin_2 = new esp32::ESP32InternalGPIOPin(); esp32_esp32internalgpiopin_2->set_pin(::GPIO_NUM_23); esp32_esp32internalgpiopin_2->set_inverted(false); esp32_esp32internalgpiopin_2->set_drive_strength(::GPIO_DRIVE_CAP_2); esp32_esp32internalgpiopin_2->set_flags(gpio::Flags::FLAG_OUTPUT); spi_spicomponent->set_mosi(esp32_esp32internalgpiopin_2); spi_spicomponent->set_interface(&SPI); spi_spicomponent->set_interface_name("SPI"); // i2c: // id: i2c_arduinoi2cbus // sda: 21 // scl: 22 // frequency: 50000.0 // scan: true i2c_arduinoi2cbus = new i2c::ArduinoI2CBus(); i2c_arduinoi2cbus->set_component_source("i2c"); App.register_component(i2c_arduinoi2cbus); i2c_arduinoi2cbus->set_sda_pin(21); i2c_arduinoi2cbus->set_scl_pin(22); i2c_arduinoi2cbus->set_frequency(50000); i2c_arduinoi2cbus->set_scan(true); // json: // {} // esp32: // board: esp32doit-devkit-v1 // framework: // version: 2.0.5 // source: ~3.20005.0 // platform_version: platformio/espressif32@5.4.0 // type: arduino // flash_size: 4MB // variant: ESP32 // preferences: // id: preferences_intervalsyncer // flash_write_interval: 60s preferences_intervalsyncer = new preferences::IntervalSyncer(); preferences_intervalsyncer->set_write_interval(60000); preferences_intervalsyncer->set_component_source("preferences"); App.register_component(preferences_intervalsyncer); // font: // file: // family: Roboto // weight: 400 // italic: false // type: gfonts // id: roboto // 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 // - ° // raw_data_id: uint8_t_2 // raw_glyph_id: font_glyphdata static const uint8_t uint8_t_2[] PROGMEM = {0x30, 0x30, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x30, 0x30, 0x68, 0x68, 0x68, 0x68, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x64, 0x00, 0x46, 0x20, 0x46, 0x60, 0x46, 0x40, 0x64, 0x80, 0x3D, 0x80, 0x01, 0x78, 0x02, 0xC8, 0x06, 0x8C, 0x04, 0x8C, 0x08, 0x8C, 0x18, 0xC8, 0x00, 0x78, 0x04, 0x0C, 0x08, 0x18, 0x30, 0x30, 0x30, 0x20, 0x60, 0x60, 0x60, 0x60, 0x60, 0x20, 0x30, 0x30, 0x30, 0x18, 0x08, 0x0C, 0x04, 0x80, 0x60, 0x20, 0x30, 0x10, 0x18, 0x18, 0x18, 0x08, 0x0C, 0x0C, 0x0C, 0x08, 0x18, 0x18, 0x18, 0x10, 0x30, 0x20, 0x60, 0x80, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x7F, 0xE0, 0x7F, 0xE0, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x40, 0xC0, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x70, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x08, 0x18, 0x10, 0x30, 0x30, 0x20, 0x60, 0x40, 0xC0, 0x1F, 0x00, 0x3F, 0x80, 0x31, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x31, 0xC0, 0x3F, 0x80, 0x1F, 0x00, 0x02, 0x00, 0x1E, 0x00, 0x3E, 0x00, 0x26, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x1F, 0x00, 0x3F, 0x80, 0x71, 0xC0, 0x60, 0xC0, 0x00, 0xC0, 0x00, 0x80, 0x01, 0x80, 0x03, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x7F, 0xE0, 0x7F, 0xE0, 0x1F, 0x00, 0x3F, 0x80, 0x71, 0xC0, 0x60, 0xC0, 0x00, 0xC0, 0x01, 0x80, 0x0F, 0x00, 0x0F, 0x80, 0x01, 0xC0, 0x00, 0xC0, 0x60, 0xC0, 0x71, 0xC0, 0x3F, 0x80, 0x1F, 0x00, 0x01, 0x80, 0x03, 0x80, 0x07, 0x80, 0x05, 0x80, 0x0D, 0x80, 0x19, 0x80, 0x11, 0x80, 0x31, 0x80, 0x61, 0x80, 0x7F, 0xE0, 0x7F, 0xE0, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x1F, 0xC0, 0x1F, 0xC0, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3F, 0x00, 0x3F, 0xC0, 0x10, 0xC0, 0x00, 0xC0, 0x00, 0x40, 0x60, 0xC0, 0x30, 0xC0, 0x3F, 0xC0, 0x0F, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x1C, 0x00, 0x30, 0x00, 0x30, 0x00, 0x6F, 0x00, 0x7F, 0x80, 0x70, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x20, 0xC0, 0x30, 0xC0, 0x1F, 0x80, 0x0F, 0x00, 0x7F, 0xC0, 0x7F, 0xC0, 0x00, 0xC0, 0x00, 0x80, 0x01, 0x80, 0x01, 0x00, 0x03, 0x00, 0x03, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x18, 0x00, 0x1F, 0x00, 0x3F, 0x80, 0x31, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x31, 0x80, 0x1F, 0x80, 0x1F, 0x80, 0x31, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x70, 0xC0, 0x3F, 0x80, 0x1F, 0x00, 0x1E, 0x00, 0x3F, 0x80, 0x71, 0x80, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x71, 0xC0, 0x3F, 0xC0, 0x1E, 0xC0, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x80, 0x1F, 0x00, 0x1C, 0x00, 0x60, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x70, 0x7F, 0xC0, 0x7F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xC0, 0x7F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x05, 0x00, 0x0D, 0x80, 0x0D, 0x80, 0x08, 0x80, 0x18, 0xC0, 0x18, 0xC0, 0x30, 0x60, 0x3F, 0xE0, 0x3F, 0xE0, 0x60, 0x30, 0x60, 0x30, 0xC0, 0x18, 0x3F, 0x80, 0x3F, 0xC0, 0x30, 0xE0, 0x30, 0x60, 0x30, 0x60, 0x30, 0xE0, 0x3F, 0xC0, 0x3F, 0xC0, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x3F, 0xE0, 0x3F, 0x80, 0x0F, 0x80, 0x1F, 0xE0, 0x38, 0x60, 0x30, 0x30, 0x60, 0x30, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x30, 0x30, 0x30, 0x38, 0x60, 0x1F, 0xE0, 0x0F, 0x80, 0x3F, 0x00, 0x3F, 0xC0, 0x30, 0xE0, 0x30, 0x60, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x60, 0x30, 0xE0, 0x3F, 0xC0, 0x3F, 0x00, 0x3F, 0xE0, 0x3F, 0xE0, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3F, 0xC0, 0x3F, 0xC0, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3F, 0xE0, 0x3F, 0xE0, 0x3F, 0xC0, 0x3F, 0xC0, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3F, 0xC0, 0x3F, 0xC0, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x0F, 0x80, 0x1F, 0xE0, 0x38, 0x70, 0x30, 0x30, 0x60, 0x00, 0x60, 0x00, 0x61, 0xF0, 0x61, 0xF0, 0x60, 0x30, 0x60, 0x30, 0x30, 0x30, 0x38, 0x30, 0x1F, 0xF0, 0x07, 0xC0, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x3F, 0xF8, 0x3F, 0xF8, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x41, 0x80, 0x61, 0x80, 0x7F, 0x80, 0x1E, 0x00, 0x30, 0x70, 0x30, 0x60, 0x30, 0xC0, 0x31, 0x80, 0x33, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x3B, 0x00, 0x33, 0x00, 0x31, 0x80, 0x30, 0xC0, 0x30, 0xE0, 0x30, 0x60, 0x30, 0x38, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3F, 0xC0, 0x3F, 0xC0, 0x30, 0x07, 0x00, 0x38, 0x07, 0x00, 0x38, 0x0F, 0x00, 0x2C, 0x0F, 0x00, 0x2C, 0x0B, 0x00, 0x24, 0x1B, 0x00, 0x26, 0x1B, 0x00, 0x26, 0x33, 0x00, 0x33, 0x33, 0x00, 0x33, 0x23, 0x00, 0x31, 0x63, 0x00, 0x31, 0xC3, 0x00, 0x31, 0xC3, 0x00, 0x30, 0xC3, 0x00, 0x70, 0x10, 0x70, 0x10, 0x78, 0x10, 0x6C, 0x10, 0x6C, 0x10, 0x66, 0x10, 0x63, 0x10, 0x63, 0x10, 0x61, 0x90, 0x60, 0xD0, 0x60, 0xD0, 0x60, 0x70, 0x60, 0x30, 0x60, 0x30, 0x0F, 0x80, 0x1F, 0xE0, 0x38, 0x70, 0x30, 0x30, 0x60, 0x30, 0x60, 0x18, 0x60, 0x18, 0x60, 0x18, 0x60, 0x18, 0x60, 0x30, 0x30, 0x30, 0x38, 0x70, 0x1F, 0xE0, 0x0F, 0x80, 0x3F, 0xC0, 0x3F, 0xE0, 0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x70, 0x3F, 0xE0, 0x3F, 0xC0, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x0F, 0x80, 0x1F, 0xE0, 0x38, 0x70, 0x30, 0x30, 0x60, 0x30, 0x60, 0x18, 0x60, 0x18, 0x60, 0x18, 0x60, 0x18, 0x60, 0x30, 0x30, 0x30, 0x38, 0x70, 0x1F, 0xE0, 0x0F, 0xE0, 0x00, 0x70, 0x00, 0x18, 0x00, 0x00, 0x7F, 0x80, 0x7F, 0xC0, 0x60, 0xE0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xE0, 0x7F, 0xC0, 0x7F, 0x80, 0x61, 0x80, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0x60, 0x60, 0x70, 0x0F, 0x80, 0x3F, 0xC0, 0x30, 0xE0, 0x60, 0x60, 0x60, 0x00, 0x38, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x00, 0xE0, 0x00, 0x60, 0x60, 0x60, 0x70, 0xE0, 0x3F, 0xC0, 0x0F, 0x80, 0xFF, 0xE0, 0xFF, 0xE0, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x70, 0x70, 0x30, 0x60, 0x1F, 0xC0, 0x0F, 0x80, 0xE0, 0x38, 0x60, 0x30, 0x60, 0x30, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x18, 0xC0, 0x18, 0xC0, 0x08, 0x80, 0x0D, 0x80, 0x0D, 0x80, 0x05, 0x00, 0x07, 0x00, 0x07, 0x00, 0x60, 0xC1, 0x80, 0x60, 0xC1, 0x80, 0x61, 0xC1, 0x80, 0x61, 0xE1, 0x00, 0x31, 0xE3, 0x00, 0x31, 0x23, 0x00, 0x33, 0x33, 0x00, 0x33, 0x32, 0x00, 0x12, 0x16, 0x00, 0x1E, 0x16, 0x00, 0x1E, 0x1E, 0x00, 0x1C, 0x1C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x60, 0x70, 0x30, 0x60, 0x30, 0xC0, 0x18, 0xC0, 0x0D, 0x80, 0x0F, 0x00, 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x1D, 0x80, 0x18, 0xC0, 0x30, 0xC0, 0x30, 0x60, 0x60, 0x70, 0xE0, 0x70, 0x60, 0x60, 0x30, 0xC0, 0x30, 0xC0, 0x19, 0x80, 0x19, 0x80, 0x0F, 0x00, 0x0F, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x7F, 0xE0, 0x7F, 0xE0, 0x00, 0xC0, 0x01, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0x7F, 0xE0, 0x7F, 0xE0, 0xFF, 0x80, 0xFF, 0x80, 0x1F, 0x00, 0x3F, 0x80, 0x61, 0x80, 0x00, 0x80, 0x1F, 0x80, 0x3F, 0x80, 0x70, 0x80, 0x60, 0x80, 0x61, 0x80, 0x3F, 0xC0, 0x1E, 0xC0, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x6F, 0x00, 0x7F, 0x80, 0x71, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x71, 0xC0, 0x7F, 0x80, 0x6F, 0x00, 0x1F, 0x00, 0x3F, 0x80, 0x71, 0x80, 0x60, 0xC0, 0x60, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, 0xC0, 0x71, 0x80, 0x3F, 0x80, 0x1E, 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x1E, 0xC0, 0x3F, 0xC0, 0x71, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x71, 0xC0, 0x3F, 0xC0, 0x1E, 0xC0, 0x0F, 0x00, 0x3F, 0x80, 0x30, 0xC0, 0x60, 0xC0, 0x7F, 0xC0, 0x7F, 0xC0, 0x60, 0x00, 0x60, 0x00, 0x30, 0x80, 0x3F, 0xC0, 0x0F, 0x00, 0x0E, 0x1E, 0x30, 0x30, 0x7C, 0x7C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x1E, 0xC0, 0x3F, 0xC0, 0x71, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x71, 0xC0, 0x3F, 0xC0, 0x1E, 0xC0, 0x00, 0xC0, 0x21, 0x80, 0x7F, 0x80, 0x1F, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x6F, 0x00, 0x7F, 0x80, 0x71, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x20, 0x70, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x30, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x30, 0xF0, 0xE0, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x61, 0xC0, 0x63, 0x00, 0x66, 0x00, 0x6E, 0x00, 0x6C, 0x00, 0x7C, 0x00, 0x66, 0x00, 0x63, 0x00, 0x63, 0x00, 0x61, 0x80, 0x60, 0xC0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2F, 0x1E, 0x00, 0x3F, 0xBF, 0x00, 0x31, 0xE3, 0x00, 0x20, 0xC1, 0x00, 0x20, 0xC1, 0x00, 0x20, 0xC1, 0x00, 0x20, 0xC1, 0x00, 0x20, 0xC1, 0x00, 0x20, 0xC1, 0x00, 0x20, 0xC1, 0x00, 0x20, 0xC1, 0x00, 0x6F, 0x00, 0x7F, 0x80, 0x71, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x1F, 0x00, 0x3F, 0x80, 0x71, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x71, 0xC0, 0x3F, 0x80, 0x1F, 0x00, 0x6F, 0x00, 0x7F, 0x80, 0x71, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x71, 0xC0, 0x7F, 0x80, 0x6F, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x1E, 0xC0, 0x3F, 0xC0, 0x71, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x71, 0xC0, 0x3F, 0xC0, 0x1E, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x6E, 0x7E, 0x70, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x1E, 0x00, 0x3F, 0x00, 0x61, 0x80, 0x60, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0x03, 0x80, 0x01, 0x80, 0x61, 0x80, 0x7F, 0x80, 0x1E, 0x00, 0x30, 0x30, 0x30, 0xFC, 0xFC, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x1C, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x71, 0xC0, 0x3F, 0xC0, 0x1E, 0xC0, 0xC1, 0x80, 0x61, 0x80, 0x61, 0x80, 0x21, 0x00, 0x33, 0x00, 0x33, 0x00, 0x12, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0xC1, 0x06, 0x63, 0x8C, 0x63, 0x8C, 0x62, 0x8C, 0x26, 0xC8, 0x36, 0xD8, 0x34, 0x58, 0x34, 0x50, 0x1C, 0x70, 0x18, 0x30, 0x18, 0x30, 0x61, 0x80, 0x63, 0x00, 0x33, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x0C, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x33, 0x00, 0x63, 0x80, 0xE1, 0x80, 0xC1, 0x80, 0x41, 0x00, 0x63, 0x00, 0x63, 0x00, 0x22, 0x00, 0x36, 0x00, 0x36, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x18, 0x00, 0x18, 0x00, 0x70, 0x00, 0x60, 0x00, 0x7F, 0x80, 0x7F, 0x80, 0x03, 0x00, 0x07, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0x7F, 0x80, 0x7F, 0x80, 0x38, 0x3C, 0x64, 0x64, 0x3C, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; static const font::GlyphData font_glyphdata[] = {font::GlyphData{ .a_char = " ", .data = uint8_t_2 + 0, .offset_x = 0, .offset_y = 19, .width = 5, .height = 0, }, font::GlyphData{ .a_char = "!", .data = uint8_t_2 + 0, .offset_x = 0, .offset_y = 5, .width = 5, .height = 14, }, font::GlyphData{ .a_char = "\042", .data = uint8_t_2 + 14, .offset_x = 0, .offset_y = 4, .width = 6, .height = 15, }, font::GlyphData{ .a_char = "%", .data = uint8_t_2 + 29, .offset_x = 0, .offset_y = 5, .width = 15, .height = 14, }, font::GlyphData{ .a_char = "(", .data = uint8_t_2 + 57, .offset_x = 0, .offset_y = 3, .width = 7, .height = 21, }, font::GlyphData{ .a_char = ")", .data = uint8_t_2 + 78, .offset_x = 0, .offset_y = 3, .width = 7, .height = 21, }, font::GlyphData{ .a_char = "+", .data = uint8_t_2 + 99, .offset_x = 0, .offset_y = 6, .width = 11, .height = 13, }, font::GlyphData{ .a_char = ",", .data = uint8_t_2 + 125, .offset_x = 0, .offset_y = 16, .width = 4, .height = 5, }, font::GlyphData{ .a_char = "-", .data = uint8_t_2 + 130, .offset_x = 0, .offset_y = 12, .width = 6, .height = 7, }, font::GlyphData{ .a_char = ".", .data = uint8_t_2 + 137, .offset_x = 0, .offset_y = 16, .width = 5, .height = 2, }, font::GlyphData{ .a_char = "/", .data = uint8_t_2 + 139, .offset_x = 0, .offset_y = 5, .width = 8, .height = 15, }, font::GlyphData{ .a_char = "0", .data = uint8_t_2 + 154, .offset_x = 0, .offset_y = 5, .width = 11, .height = 14, }, font::GlyphData{ .a_char = "1", .data = uint8_t_2 + 182, .offset_x = 0, .offset_y = 5, .width = 11, .height = 14, }, font::GlyphData{ .a_char = "2", .data = uint8_t_2 + 210, .offset_x = 0, .offset_y = 5, .width = 11, .height = 14, }, font::GlyphData{ .a_char = "3", .data = uint8_t_2 + 238, .offset_x = 0, .offset_y = 5, .width = 11, .height = 14, }, font::GlyphData{ .a_char = "4", .data = uint8_t_2 + 266, .offset_x = 0, .offset_y = 5, .width = 11, .height = 14, }, font::GlyphData{ .a_char = "5", .data = uint8_t_2 + 294, .offset_x = 0, .offset_y = 5, .width = 11, .height = 14, }, font::GlyphData{ .a_char = "6", .data = uint8_t_2 + 322, .offset_x = 0, .offset_y = 5, .width = 11, .height = 14, }, font::GlyphData{ .a_char = "7", .data = uint8_t_2 + 350, .offset_x = 0, .offset_y = 5, .width = 11, .height = 14, }, font::GlyphData{ .a_char = "8", .data = uint8_t_2 + 378, .offset_x = 0, .offset_y = 5, .width = 11, .height = 14, }, font::GlyphData{ .a_char = "9", .data = uint8_t_2 + 406, .offset_x = 0, .offset_y = 5, .width = 11, .height = 14, }, font::GlyphData{ .a_char = ":", .data = uint8_t_2 + 434, .offset_x = 0, .offset_y = 8, .width = 5, .height = 11, }, font::GlyphData{ .a_char = "=", .data = uint8_t_2 + 445, .offset_x = 0, .offset_y = 10, .width = 11, .height = 9, }, font::GlyphData{ .a_char = "A", .data = uint8_t_2 + 463, .offset_x = 0, .offset_y = 5, .width = 13, .height = 14, }, font::GlyphData{ .a_char = "B", .data = uint8_t_2 + 491, .offset_x = 0, .offset_y = 5, .width = 12, .height = 14, }, font::GlyphData{ .a_char = "C", .data = uint8_t_2 + 519, .offset_x = 0, .offset_y = 5, .width = 13, .height = 14, }, font::GlyphData{ .a_char = "D", .data = uint8_t_2 + 547, .offset_x = 0, .offset_y = 5, .width = 13, .height = 14, }, font::GlyphData{ .a_char = "E", .data = uint8_t_2 + 575, .offset_x = 0, .offset_y = 5, .width = 11, .height = 14, }, font::GlyphData{ .a_char = "F", .data = uint8_t_2 + 603, .offset_x = 0, .offset_y = 5, .width = 11, .height = 14, }, font::GlyphData{ .a_char = "G", .data = uint8_t_2 + 631, .offset_x = 0, .offset_y = 5, .width = 14, .height = 14, }, font::GlyphData{ .a_char = "H", .data = uint8_t_2 + 659, .offset_x = 0, .offset_y = 5, .width = 14, .height = 14, }, font::GlyphData{ .a_char = "I", .data = uint8_t_2 + 687, .offset_x = 0, .offset_y = 5, .width = 5, .height = 14, }, font::GlyphData{ .a_char = "J", .data = uint8_t_2 + 701, .offset_x = 0, .offset_y = 5, .width = 11, .height = 14, }, font::GlyphData{ .a_char = "K", .data = uint8_t_2 + 729, .offset_x = 0, .offset_y = 5, .width = 13, .height = 14, }, font::GlyphData{ .a_char = "L", .data = uint8_t_2 + 757, .offset_x = 0, .offset_y = 5, .width = 11, .height = 14, }, font::GlyphData{ .a_char = "M", .data = uint8_t_2 + 785, .offset_x = 0, .offset_y = 5, .width = 17, .height = 14, }, font::GlyphData{ .a_char = "N", .data = uint8_t_2 + 827, .offset_x = 0, .offset_y = 5, .width = 14, .height = 14, }, font::GlyphData{ .a_char = "O", .data = uint8_t_2 + 855, .offset_x = 0, .offset_y = 5, .width = 14, .height = 14, }, font::GlyphData{ .a_char = "P", .data = uint8_t_2 + 883, .offset_x = 0, .offset_y = 5, .width = 13, .height = 14, }, font::GlyphData{ .a_char = "Q", .data = uint8_t_2 + 911, .offset_x = 0, .offset_y = 5, .width = 14, .height = 17, }, font::GlyphData{ .a_char = "R", .data = uint8_t_2 + 945, .offset_x = 0, .offset_y = 5, .width = 12, .height = 14, }, font::GlyphData{ .a_char = "S", .data = uint8_t_2 + 973, .offset_x = 0, .offset_y = 5, .width = 12, .height = 14, }, font::GlyphData{ .a_char = "T", .data = uint8_t_2 + 1001, .offset_x = 0, .offset_y = 5, .width = 12, .height = 14, }, font::GlyphData{ .a_char = "U", .data = uint8_t_2 + 1029, .offset_x = 0, .offset_y = 5, .width = 13, .height = 14, }, font::GlyphData{ .a_char = "V", .data = uint8_t_2 + 1057, .offset_x = 0, .offset_y = 5, .width = 13, .height = 14, }, font::GlyphData{ .a_char = "W", .data = uint8_t_2 + 1085, .offset_x = 0, .offset_y = 5, .width = 18, .height = 14, }, font::GlyphData{ .a_char = "X", .data = uint8_t_2 + 1127, .offset_x = 0, .offset_y = 5, .width = 13, .height = 14, }, font::GlyphData{ .a_char = "Y", .data = uint8_t_2 + 1155, .offset_x = 0, .offset_y = 5, .width = 12, .height = 14, }, font::GlyphData{ .a_char = "Z", .data = uint8_t_2 + 1183, .offset_x = 0, .offset_y = 5, .width = 12, .height = 14, }, font::GlyphData{ .a_char = "_", .data = uint8_t_2 + 1211, .offset_x = 0, .offset_y = 19, .width = 9, .height = 2, }, font::GlyphData{ .a_char = "a", .data = uint8_t_2 + 1215, .offset_x = 0, .offset_y = 8, .width = 11, .height = 11, }, font::GlyphData{ .a_char = "b", .data = uint8_t_2 + 1237, .offset_x = 0, .offset_y = 4, .width = 11, .height = 15, }, font::GlyphData{ .a_char = "c", .data = uint8_t_2 + 1267, .offset_x = 0, .offset_y = 8, .width = 10, .height = 11, }, font::GlyphData{ .a_char = "d", .data = uint8_t_2 + 1289, .offset_x = 0, .offset_y = 4, .width = 11, .height = 15, }, font::GlyphData{ .a_char = "e", .data = uint8_t_2 + 1319, .offset_x = 0, .offset_y = 8, .width = 11, .height = 11, }, font::GlyphData{ .a_char = "f", .data = uint8_t_2 + 1341, .offset_x = 0, .offset_y = 4, .width = 7, .height = 15, }, font::GlyphData{ .a_char = "g", .data = uint8_t_2 + 1356, .offset_x = 0, .offset_y = 8, .width = 11, .height = 15, }, font::GlyphData{ .a_char = "h", .data = uint8_t_2 + 1386, .offset_x = 0, .offset_y = 4, .width = 11, .height = 15, }, font::GlyphData{ .a_char = "i", .data = uint8_t_2 + 1416, .offset_x = 0, .offset_y = 3, .width = 5, .height = 15, }, font::GlyphData{ .a_char = "j", .data = uint8_t_2 + 1431, .offset_x = -1, .offset_y = 3, .width = 6, .height = 19, }, font::GlyphData{ .a_char = "k", .data = uint8_t_2 + 1450, .offset_x = 0, .offset_y = 4, .width = 11, .height = 15, }, font::GlyphData{ .a_char = "l", .data = uint8_t_2 + 1480, .offset_x = 0, .offset_y = 4, .width = 5, .height = 15, }, font::GlyphData{ .a_char = "m", .data = uint8_t_2 + 1495, .offset_x = 0, .offset_y = 8, .width = 18, .height = 11, }, font::GlyphData{ .a_char = "n", .data = uint8_t_2 + 1528, .offset_x = 0, .offset_y = 8, .width = 11, .height = 11, }, font::GlyphData{ .a_char = "o", .data = uint8_t_2 + 1550, .offset_x = 0, .offset_y = 8, .width = 11, .height = 11, }, font::GlyphData{ .a_char = "p", .data = uint8_t_2 + 1572, .offset_x = 0, .offset_y = 8, .width = 11, .height = 15, }, font::GlyphData{ .a_char = "q", .data = uint8_t_2 + 1602, .offset_x = 0, .offset_y = 8, .width = 11, .height = 15, }, font::GlyphData{ .a_char = "r", .data = uint8_t_2 + 1632, .offset_x = 0, .offset_y = 8, .width = 7, .height = 11, }, font::GlyphData{ .a_char = "s", .data = uint8_t_2 + 1643, .offset_x = 0, .offset_y = 8, .width = 10, .height = 11, }, font::GlyphData{ .a_char = "t", .data = uint8_t_2 + 1665, .offset_x = 0, .offset_y = 5, .width = 7, .height = 14, }, font::GlyphData{ .a_char = "u", .data = uint8_t_2 + 1679, .offset_x = 0, .offset_y = 8, .width = 11, .height = 11, }, font::GlyphData{ .a_char = "v", .data = uint8_t_2 + 1701, .offset_x = 0, .offset_y = 8, .width = 10, .height = 11, }, font::GlyphData{ .a_char = "w", .data = uint8_t_2 + 1723, .offset_x = 0, .offset_y = 8, .width = 15, .height = 11, }, font::GlyphData{ .a_char = "x", .data = uint8_t_2 + 1745, .offset_x = 0, .offset_y = 8, .width = 10, .height = 11, }, font::GlyphData{ .a_char = "y", .data = uint8_t_2 + 1767, .offset_x = 0, .offset_y = 8, .width = 10, .height = 15, }, font::GlyphData{ .a_char = "z", .data = uint8_t_2 + 1797, .offset_x = 0, .offset_y = 8, .width = 10, .height = 11, }, font::GlyphData{ .a_char = "\302\260", .data = uint8_t_2 + 1819, .offset_x = 0, .offset_y = 5, .width = 7, .height = 14, }}; roboto = new font::Font(font_glyphdata, 77, 19, 24); // uart: // rx_pin: // number: 16 // mode: // input: true // output: false // open_drain: false // pullup: false // pulldown: false // drive_strength: 20.0 // id: esp32_esp32internalgpiopin_3 // ignore_strapping_warning: false // inverted: false // tx_pin: // number: 17 // mode: // output: true // input: false // open_drain: false // pullup: false // pulldown: false // drive_strength: 20.0 // id: esp32_esp32internalgpiopin_4 // ignore_strapping_warning: false // inverted: false // baud_rate: 9600 // id: uart_esp32arduinouartcomponent // rx_buffer_size: 256 // stop_bits: 1 // data_bits: 8 // parity: NONE uart_esp32arduinouartcomponent = new uart::ESP32ArduinoUARTComponent(); uart_esp32arduinouartcomponent->set_component_source("uart"); App.register_component(uart_esp32arduinouartcomponent); uart_esp32arduinouartcomponent->set_baud_rate(9600); esp32_esp32internalgpiopin_4 = new esp32::ESP32InternalGPIOPin(); esp32_esp32internalgpiopin_4->set_pin(::GPIO_NUM_17); esp32_esp32internalgpiopin_4->set_inverted(false); esp32_esp32internalgpiopin_4->set_drive_strength(::GPIO_DRIVE_CAP_2); esp32_esp32internalgpiopin_4->set_flags(gpio::Flags::FLAG_OUTPUT); uart_esp32arduinouartcomponent->set_tx_pin(esp32_esp32internalgpiopin_4); esp32_esp32internalgpiopin_3 = new esp32::ESP32InternalGPIOPin(); esp32_esp32internalgpiopin_3->set_pin(::GPIO_NUM_16); esp32_esp32internalgpiopin_3->set_inverted(false); esp32_esp32internalgpiopin_3->set_drive_strength(::GPIO_DRIVE_CAP_2); esp32_esp32internalgpiopin_3->set_flags(gpio::Flags::FLAG_INPUT); uart_esp32arduinouartcomponent->set_rx_pin(esp32_esp32internalgpiopin_3); uart_esp32arduinouartcomponent->set_rx_buffer_size(256); uart_esp32arduinouartcomponent->set_stop_bits(1); uart_esp32arduinouartcomponent->set_data_bits(8); uart_esp32arduinouartcomponent->set_parity(uart::UART_CONFIG_PARITY_NONE); // sensor.wifi_signal: // platform: wifi_signal // name: WiFi Signal dB // id: wifi_signal_db // unit_of_measurement: dB // accuracy_decimals: 0 // update_interval: 5s // entity_category: diagnostic // disabled_by_default: false // force_update: false // device_class: signal_strength // state_class: measurement wifi_signal_db = new wifi_signal::WiFiSignalSensor(); App.register_sensor(wifi_signal_db); wifi_signal_db->set_name("WiFi Signal dB"); wifi_signal_db->set_object_id("wifi_signal_db"); wifi_signal_db->set_disabled_by_default(false); wifi_signal_db->set_entity_category(::ENTITY_CATEGORY_DIAGNOSTIC); wifi_signal_db->set_device_class("signal_strength"); wifi_signal_db->set_state_class(sensor::STATE_CLASS_MEASUREMENT); wifi_signal_db->set_unit_of_measurement("dB"); wifi_signal_db->set_accuracy_decimals(0); wifi_signal_db->set_force_update(false); wifi_signal_db->set_update_interval(5000); wifi_signal_db->set_component_source("wifi_signal.sensor"); App.register_component(wifi_signal_db); // sensor.copy: // platform: copy // source_id: wifi_signal_db // name: WiFi Signal Percent // id: wifi_signal_percent // filters: // - lambda: !lambda |- // return min(max(2 * (x + 100.0), 0.0), 100.0); // type_id: sensor_lambdafilter // unit_of_measurement: '%' // accuracy_decimals: 0 // entity_category: diagnostic // disabled_by_default: false // force_update: false // device_class: signal_strength // state_class: measurement wifi_signal_percent = new copy::CopySensor(); App.register_sensor(wifi_signal_percent); wifi_signal_percent->set_name("WiFi Signal Percent"); wifi_signal_percent->set_object_id("wifi_signal_percent"); wifi_signal_percent->set_disabled_by_default(false); wifi_signal_percent->set_entity_category(::ENTITY_CATEGORY_DIAGNOSTIC); wifi_signal_percent->set_device_class("signal_strength"); wifi_signal_percent->set_state_class(sensor::STATE_CLASS_MEASUREMENT); wifi_signal_percent->set_unit_of_measurement("%"); wifi_signal_percent->set_accuracy_decimals(0); wifi_signal_percent->set_force_update(false); sensor_lambdafilter = new sensor::LambdaFilter([=](float x) -> optional<float> { #line 85 "/config/airterk-monitor.yaml" return min(max(2 * (x + 100.0), 0.0), 100.0); }); wifi_signal_percent->set_filters({sensor_lambdafilter}); wifi_signal_percent->set_component_source("copy.sensor"); App.register_component(wifi_signal_percent); wifi_signal_percent->set_source(wifi_signal_db); // sensor.pmsx003: // platform: pmsx003 // type: PMSX003 // pm_2_5: // id: sensor_pm_2_5 // device_class: pm25 // disabled_by_default: false // force_update: false // unit_of_measurement: µg/m³ // icon: mdi:chemical-weapon // accuracy_decimals: 0 // state_class: measurement // name: sensor_pm_2_5 // internal: true // id: pmsx003_pmsx003component // update_interval: 0s // uart_id: uart_esp32arduinouartcomponent pmsx003_pmsx003component = new pmsx003::PMSX003Component(); pmsx003_pmsx003component->set_update_interval(0); pmsx003_pmsx003component->set_component_source("pmsx003.sensor"); App.register_component(pmsx003_pmsx003component); pmsx003_pmsx003component->set_uart_parent(uart_esp32arduinouartcomponent); pmsx003_pmsx003component->set_type(pmsx003::PMSX003_TYPE_X003); sensor_pm_2_5 = new sensor::Sensor(); App.register_sensor(sensor_pm_2_5); sensor_pm_2_5->set_name("sensor_pm_2_5"); sensor_pm_2_5->set_object_id("sensor_pm_2_5"); sensor_pm_2_5->set_disabled_by_default(false); sensor_pm_2_5->set_internal(true); sensor_pm_2_5->set_icon("mdi:chemical-weapon"); sensor_pm_2_5->set_device_class("pm25"); sensor_pm_2_5->set_state_class(sensor::STATE_CLASS_MEASUREMENT); sensor_pm_2_5->set_unit_of_measurement("\302\265g/m\302\263"); sensor_pm_2_5->set_accuracy_decimals(0); sensor_pm_2_5->set_force_update(false); pmsx003_pmsx003component->set_pm_2_5_sensor(sensor_pm_2_5); pmsx003_pmsx003component->set_update_interval(0); // sensor.copy: // platform: copy // source_id: sensor_pm_2_5 // name: PM 2.5 in room // id: pm2_5_in_room // device_class: pm25 // unit_of_measurement: µg/m³ // filters: // - median: // send_every: 5 // send_first_at: 4 // window_size: 20 // type_id: sensor_medianfilter // - clamp: // min_value: 0.0 // max_value: 999.0 // ignore_out_of_range: false // type_id: sensor_clampfilter // disabled_by_default: false // force_update: false // icon: mdi:chemical-weapon // accuracy_decimals: 0 // state_class: measurement pm2_5_in_room = new copy::CopySensor(); App.register_sensor(pm2_5_in_room); pm2_5_in_room->set_name("PM 2.5 in room"); pm2_5_in_room->set_object_id("pm_25_in_room"); pm2_5_in_room->set_disabled_by_default(false); pm2_5_in_room->set_icon("mdi:chemical-weapon"); pm2_5_in_room->set_device_class("pm25"); pm2_5_in_room->set_state_class(sensor::STATE_CLASS_MEASUREMENT); pm2_5_in_room->set_unit_of_measurement("\302\265g/m\302\263"); pm2_5_in_room->set_accuracy_decimals(0); pm2_5_in_room->set_force_update(false); sensor_medianfilter = new sensor::MedianFilter(20, 5, 4); sensor_clampfilter = new sensor::ClampFilter(0.0f, 999.0f, false); pm2_5_in_room->set_filters({sensor_medianfilter, sensor_clampfilter}); pm2_5_in_room->set_component_source("copy.sensor"); App.register_component(pm2_5_in_room); pm2_5_in_room->set_source(sensor_pm_2_5); // sensor.homeassistant: // platform: homeassistant // entity_id: sensor.airterk_intake_pm_25_outside // id: pm2_5_outside // disabled_by_default: false // force_update: false // accuracy_decimals: 1 // internal: true // name: pm2_5_outside pm2_5_outside = new homeassistant::HomeassistantSensor(); App.register_sensor(pm2_5_outside); pm2_5_outside->set_name("pm2_5_outside"); pm2_5_outside->set_object_id("pm2_5_outside"); pm2_5_outside->set_disabled_by_default(false); pm2_5_outside->set_internal(true); pm2_5_outside->set_accuracy_decimals(1); pm2_5_outside->set_force_update(false); pm2_5_outside->set_component_source("homeassistant.sensor"); App.register_component(pm2_5_outside); pm2_5_outside->set_entity_id("sensor.airterk_intake_pm_25_outside"); // binary_sensor.homeassistant: // platform: homeassistant // entity_id: switch.airterk_intake_switch_intake_fan // id: intake_fan_status // disabled_by_default: false // internal: true // name: intake_fan_status intake_fan_status = new homeassistant::HomeassistantBinarySensor(); App.register_binary_sensor(intake_fan_status); intake_fan_status->set_name("intake_fan_status"); intake_fan_status->set_object_id("intake_fan_status"); intake_fan_status->set_disabled_by_default(false); intake_fan_status->set_internal(true); intake_fan_status->set_component_source("homeassistant.binary_sensor"); App.register_component(intake_fan_status); intake_fan_status->set_entity_id("switch.airterk_intake_switch_intake_fan"); // binary_sensor.gpio: // platform: gpio // pin: // number: 25 // mode: // input: true // pullup: true // output: false // open_drain: false // pulldown: false // drive_strength: 20.0 // id: esp32_esp32internalgpiopin_5 // ignore_strapping_warning: false // inverted: false // id: button_change_auto_mode // filters: // - delayed_on: 15ms // type_id: binary_sensor_delayedonfilter // on_press: // - then: // - switch.toggle: // id: use_filter_auto // type_id: switch__toggleaction // automation_id: automation // trigger_id: binary_sensor_presstrigger // disabled_by_default: false // name: button_change_auto_mode // internal: true button_change_auto_mode = new gpio::GPIOBinarySensor(); App.register_binary_sensor(button_change_auto_mode); button_change_auto_mode->set_name("button_change_auto_mode"); button_change_auto_mode->set_object_id("button_change_auto_mode"); button_change_auto_mode->set_disabled_by_default(false); button_change_auto_mode->set_internal(true); binary_sensor_delayedonfilter = new binary_sensor::DelayedOnFilter(); binary_sensor_delayedonfilter->set_component_source("binary_sensor"); App.register_component(binary_sensor_delayedonfilter); binary_sensor_delayedonfilter->set_delay(15); button_change_auto_mode->add_filters({binary_sensor_delayedonfilter}); binary_sensor_presstrigger = new binary_sensor::PressTrigger(button_change_auto_mode); automation = new Automation<>(binary_sensor_presstrigger); // display.lcd_pcf8574: // platform: lcd_pcf8574 // dimensions: // - 20 // - 4 // address: 0x3F // lambda: !lambda |- // it.printf(0, 0, "-- Smart airterk --"); // it.printf(0, 1, "pm2.5 in:%3.0f out:%3.0f", id(sensor_pm_2_5).state, id(pm2_5_outside).state); // it.printf(0, 2, "Mode auto: %s", id(use_filter_auto).state ? " ON" : "OFF"); // it.printf(0, 3, "Fan exh:%s intk:%s", id(switch_relay_exhale).state ? " ON" : "OFF", id(intake_fan_status).state ? " ON" : "OFF"); // update_interval: 1s // id: lcd_pcf8574_pcf8574lcddisplay // i2c_id: i2c_arduinoi2cbus lcd_pcf8574_pcf8574lcddisplay = new lcd_pcf8574::PCF8574LCDDisplay(); lcd_pcf8574_pcf8574lcddisplay->set_update_interval(1000); lcd_pcf8574_pcf8574lcddisplay->set_component_source("lcd_base"); App.register_component(lcd_pcf8574_pcf8574lcddisplay); lcd_pcf8574_pcf8574lcddisplay->set_dimensions(20, 4); lcd_pcf8574_pcf8574lcddisplay->set_i2c_bus(i2c_arduinoi2cbus); lcd_pcf8574_pcf8574lcddisplay->set_i2c_address(0x3F); // switch.output: // platform: output // output: output_relay_exhale // id: switch_relay_exhale // name: Switch relay exhale // restore_mode: ALWAYS_OFF // disabled_by_default: false switch_relay_exhale = new output::OutputSwitch(); App.register_switch(switch_relay_exhale); switch_relay_exhale->set_name("Switch relay exhale"); switch_relay_exhale->set_object_id("switch_relay_exhale"); switch_relay_exhale->set_disabled_by_default(false); switch_relay_exhale->set_restore_mode(switch_::SWITCH_ALWAYS_OFF); switch_relay_exhale->set_component_source("output.switch"); App.register_component(switch_relay_exhale); // switch.template: // platform: template // id: use_filter_auto // name: Use filter auto // optimistic: true // restore_mode: RESTORE_DEFAULT_OFF // disabled_by_default: false // assumed_state: false use_filter_auto = new template_::TemplateSwitch(); App.register_switch(use_filter_auto); use_filter_auto->set_name("Use filter auto"); use_filter_auto->set_object_id("use_filter_auto"); use_filter_auto->set_disabled_by_default(false); use_filter_auto->set_restore_mode(switch_::SWITCH_RESTORE_DEFAULT_OFF); use_filter_auto->set_component_source("template.switch"); App.register_component(use_filter_auto); use_filter_auto->set_optimistic(true); use_filter_auto->set_assumed_state(false); // output: // output.gpio: // platform: gpio // pin: // number: 26 // mode: // output: true // input: false // open_drain: false // pullup: false // pulldown: false // drive_strength: 20.0 // id: esp32_esp32internalgpiopin_6 // ignore_strapping_warning: false // inverted: false // id: output_relay_exhale // inverted: false output_relay_exhale = new gpio::GPIOBinaryOutput(); output_relay_exhale->set_inverted(false); output_relay_exhale->set_component_source("gpio.output"); App.register_component(output_relay_exhale); esp32_esp32internalgpiopin_6 = new esp32::ESP32InternalGPIOPin(); esp32_esp32internalgpiopin_6->set_pin(::GPIO_NUM_26); esp32_esp32internalgpiopin_6->set_inverted(false); esp32_esp32internalgpiopin_6->set_drive_strength(::GPIO_DRIVE_CAP_2); esp32_esp32internalgpiopin_6->set_flags(gpio::Flags::FLAG_OUTPUT); output_relay_exhale->set_pin(esp32_esp32internalgpiopin_6); // socket: // implementation: bsd_sockets // network: // enable_ipv6: false switch__toggleaction = new switch_::ToggleAction<>(use_filter_auto); automation->add_actions({switch__toggleaction}); button_change_auto_mode->set_component_source("gpio.binary_sensor"); App.register_component(button_change_auto_mode); esp32_esp32internalgpiopin_5 = new esp32::ESP32InternalGPIOPin(); esp32_esp32internalgpiopin_5->set_pin(::GPIO_NUM_25); esp32_esp32internalgpiopin_5->set_inverted(false); esp32_esp32internalgpiopin_5->set_drive_strength(::GPIO_DRIVE_CAP_2); esp32_esp32internalgpiopin_5->set_flags((gpio::Flags::FLAG_INPUT | gpio::Flags::FLAG_PULLUP)); button_change_auto_mode->set_pin(esp32_esp32internalgpiopin_5); lcd_pcf8574_pcf8574lcddisplay->set_writer([=](lcd_pcf8574::PCF8574LCDDisplay & it) -> void { #line 142 "/config/airterk-monitor.yaml" it.printf(0, 0, "-- Smart airterk --"); it.printf(0, 1, "pm2.5 in:%3.0f out:%3.0f", sensor_pm_2_5->state, pm2_5_outside->state); it.printf(0, 2, "Mode auto: %s", use_filter_auto->state ? " ON" : "OFF"); it.printf(0, 3, "Fan exh:%s intk:%s", switch_relay_exhale->state ? " ON" : "OFF", intake_fan_status->state ? " ON" : "OFF"); }); switch_relay_exhale->set_output(output_relay_exhale); // =========== AUTO GENERATED CODE END ============ App.setup(); } void loop() { App.loop(); }
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.43 |
proxy
|
phpinfo
|
Settings