From f2102ff9e8df395d6d6b87a44d11859c4bf32d0e Mon Sep 17 00:00:00 2001 From: Otto Winter Date: Wed, 14 Nov 2018 22:12:27 +0100 Subject: [PATCH] SEO Optimization (#82) --- .gitlab-ci.yml | 2 + _static/changelog-1.9.0.png | Bin 0 -> 50174 bytes conf.py | 2 + esphomeyaml/changelog/index.rst | 6 + esphomeyaml/changelog/v1.7.0.rst | 5 + esphomeyaml/changelog/v1.8.0.rst | 5 + esphomeyaml/components/ads1115.rst | 5 + .../binary_sensor/esp32_ble_tracker.rst | 4 + .../components/binary_sensor/esp32_touch.rst | 4 + esphomeyaml/components/binary_sensor/gpio.rst | 4 + .../components/binary_sensor/index.rst | 4 + .../components/binary_sensor/nextion.rst | 4 + .../components/binary_sensor/pn532.rst | 4 + .../components/binary_sensor/rdm6300.rst | 4 + .../binary_sensor/remote_receiver.rst | 4 + .../components/binary_sensor/status.rst | 4 + .../components/binary_sensor/template.rst | 4 + esphomeyaml/components/cover/index.rst | 4 + esphomeyaml/components/cover/template.rst | 4 + esphomeyaml/components/dallas.rst | 5 + esphomeyaml/components/debug.rst | 4 + esphomeyaml/components/deep_sleep.rst | 4 + esphomeyaml/components/display/index.rst | 4 + esphomeyaml/components/display/lcd_gpio.rst | 4 + .../components/display/lcd_pcf8574.rst | 4 + esphomeyaml/components/display/max7219.rst | 4 + esphomeyaml/components/display/nextion.rst | 4 + .../components/display/ssd1306_i2c.rst | 4 + .../components/display/ssd1306_spi.rst | 4 + .../components/display/waveshare_epaper.rst | 4 + esphomeyaml/components/esp32_ble_beacon.rst | 4 + esphomeyaml/components/esp32_ble_tracker.rst | 4 + esphomeyaml/components/esp32_touch.rst | 4 + esphomeyaml/components/esphomeyaml.rst | 4 + esphomeyaml/components/fan/binary.rst | 4 + esphomeyaml/components/fan/index.rst | 4 + esphomeyaml/components/fan/speed.rst | 4 + esphomeyaml/components/i2c.rst | 5 + esphomeyaml/components/light/binary.rst | 4 + esphomeyaml/components/light/cwww.rst | 4 + .../components/light/fastled_clockless.rst | 4 + esphomeyaml/components/light/fastled_spi.rst | 4 + esphomeyaml/components/light/index.rst | 4 + .../components/light/monochromatic.rst | 4 + esphomeyaml/components/light/rgb.rst | 4 + esphomeyaml/components/light/rgbw.rst | 4 + esphomeyaml/components/light/rgbww.rst | 4 + esphomeyaml/components/logger.rst | 4 + esphomeyaml/components/mqtt.rst | 5 + esphomeyaml/components/my9231.rst | 5 + esphomeyaml/components/ota.rst | 5 + esphomeyaml/components/output/esp8266_pwm.rst | 4 + esphomeyaml/components/output/gpio.rst | 4 + esphomeyaml/components/output/index.rst | 4 + esphomeyaml/components/output/ledc.rst | 4 + esphomeyaml/components/output/my9231.rst | 4 + esphomeyaml/components/output/pca9685.rst | 4 + esphomeyaml/components/pca9685.rst | 5 + esphomeyaml/components/pcf8574.rst | 5 + esphomeyaml/components/pn532.rst | 5 + esphomeyaml/components/power_supply.rst | 5 + esphomeyaml/components/rdm6300.rst | 5 + esphomeyaml/components/remote_receiver.rst | 5 + esphomeyaml/components/remote_transmitter.rst | 5 + esphomeyaml/components/sensor/adc.rst | 4 + esphomeyaml/components/sensor/ads1115.rst | 5 + esphomeyaml/components/sensor/bh1750.rst | 5 + esphomeyaml/components/sensor/ble_rssi.rst | 5 + esphomeyaml/components/sensor/bme280.rst | 5 + esphomeyaml/components/sensor/bme680.rst | 5 + esphomeyaml/components/sensor/bmp085.rst | 5 + esphomeyaml/components/sensor/bmp280.rst | 5 + esphomeyaml/components/sensor/cse7766.rst | 5 + esphomeyaml/components/sensor/custom.rst | 5 + esphomeyaml/components/sensor/dallas.rst | 5 + esphomeyaml/components/sensor/dht.rst | 5 + esphomeyaml/components/sensor/dht12.rst | 5 + esphomeyaml/components/sensor/duty_cycle.rst | 4 + esphomeyaml/components/sensor/esp32_hall.rst | 5 + esphomeyaml/components/sensor/hdc1080.rst | 5 + esphomeyaml/components/sensor/hlw8012.rst | 5 + esphomeyaml/components/sensor/hmc5883l.rst | 5 + esphomeyaml/components/sensor/htu21d.rst | 5 + esphomeyaml/components/sensor/hx711.rst | 5 + esphomeyaml/components/sensor/ina219.rst | 5 + esphomeyaml/components/sensor/ina3221.rst | 5 + esphomeyaml/components/sensor/index.rst | 4 + esphomeyaml/components/sensor/max6675.rst | 4 + esphomeyaml/components/sensor/mhz19.rst | 5 + esphomeyaml/components/sensor/mpu6050.rst | 4 + .../components/sensor/mqtt_subscribe.rst | 5 + esphomeyaml/components/sensor/ms5611.rst | 5 + esphomeyaml/components/sensor/pmsx003.rst | 4 + .../components/sensor/pulse_counter.rst | 4 + .../components/sensor/rotary_encoder.rst | 4 + esphomeyaml/components/sensor/sht3xd.rst | 4 + esphomeyaml/components/sensor/tcs34725.rst | 5 + esphomeyaml/components/sensor/template.rst | 13 ++ .../components/sensor/total_daily_energy.rst | 4 + esphomeyaml/components/sensor/tsl2561.rst | 5 + esphomeyaml/components/sensor/ultrasonic.rst | 5 + esphomeyaml/components/sensor/uptime.rst | 4 + esphomeyaml/components/sensor/wifi_signal.rst | 4 + .../components/sensor/xiaomi_miflora.rst | 5 + .../components/sensor/xiaomi_mijia.rst | 5 + esphomeyaml/components/spi.rst | 5 + esphomeyaml/components/status_led.rst | 4 + esphomeyaml/components/stepper/index.rst | 5 + esphomeyaml/components/switch/gpio.rst | 4 + esphomeyaml/components/switch/index.rst | 4 + esphomeyaml/components/switch/output.rst | 4 + .../components/switch/remote_transmitter.rst | 5 + esphomeyaml/components/switch/restart.rst | 4 + esphomeyaml/components/switch/shutdown.rst | 4 + esphomeyaml/components/switch/template.rst | 6 +- esphomeyaml/components/switch/uart.rst | 4 + esphomeyaml/components/text_sensor/index.rst | 4 + .../components/text_sensor/mqtt_subscribe.rst | 5 + .../components/text_sensor/template.rst | 4 + .../components/text_sensor/version.rst | 4 + esphomeyaml/components/time.rst | 5 + esphomeyaml/components/uart.rst | 5 + esphomeyaml/components/web_server.rst | 5 + esphomeyaml/components/wifi.rst | 5 + esphomeyaml/cookbook/bruh.rst | 4 + esphomeyaml/cookbook/dual-r2-cover.rst | 5 + esphomeyaml/cookbook/garage-door.rst | 4 + esphomeyaml/cookbook/pir.rst | 5 + esphomeyaml/cookbook/power_meter.rst | 4 + esphomeyaml/cookbook/relay.rst | 5 + esphomeyaml/cookbook/temt6000.rst | 5 + esphomeyaml/devices/esp32.rst | 4 + esphomeyaml/devices/esp8266.rst | 5 + esphomeyaml/devices/nodemcu_esp32.rst | 4 + esphomeyaml/devices/nodemcu_esp8266.rst | 5 + esphomeyaml/devices/sonoff.rst | 4 + esphomeyaml/devices/sonoff_4ch.rst | 4 + esphomeyaml/devices/sonoff_basic.rst | 4 + esphomeyaml/devices/sonoff_s20.rst | 4 + esphomeyaml/guides/automations.rst | 4 + esphomeyaml/guides/cli.rst | 3 + esphomeyaml/guides/configuration-types.rst | 4 + esphomeyaml/guides/contributing.rst | 4 + esphomeyaml/guides/faq.rst | 4 + .../guides/getting_started_command_line.rst | 4 + esphomeyaml/guides/getting_started_hassio.rst | 4 + esphomeyaml/guides/migrate_espeasy.rst | 4 + esphomeyaml/guides/migrate_espurna.rst | 4 + esphomeyaml/guides/migrate_sonoff_tasmota.rst | 4 + esphomeyaml/images/download.svg | 1 + esphomeyaml/images/esphomeyaml-logo-full.svg | 158 ++++++++++++++++++ esphomeyaml/images/logo-full.svg | 153 +++++++++++++++++ esphomeyaml/images/puzzle.svg | 1 + esphomeyaml/index.rst | 33 +--- github.py | 8 +- index.rst | 60 +++++-- seo.py | 108 ++++++++++++ web-api/index.rst | 4 + 158 files changed, 1134 insertions(+), 49 deletions(-) create mode 100644 _static/changelog-1.9.0.png create mode 100644 esphomeyaml/images/download.svg create mode 100644 esphomeyaml/images/esphomeyaml-logo-full.svg create mode 100644 esphomeyaml/images/logo-full.svg create mode 100644 esphomeyaml/images/puzzle.svg create mode 100644 seo.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a7db2fd21..9f57d37c2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -39,6 +39,7 @@ deploy-release: TARGET_REPO: OttoWinter/esphomedocs PRIVATE_KEY: ${GITHUB_PRIVATE_KEY} CNAME: esphomelib.com + BASE_URL: https://esphomelib.com only: - current @@ -48,5 +49,6 @@ deploy-beta: TARGET_REPO: OttoWinter/esphomedocs-beta PRIVATE_KEY: ${GITHUB_BETA_PRIVATE_KEY} CNAME: beta.esphomelib.com + BASE_URL: https://beta.esphomelib.com only: - rc diff --git a/_static/changelog-1.9.0.png b/_static/changelog-1.9.0.png new file mode 100644 index 0000000000000000000000000000000000000000..b487767a6a9e5f25e5b47a365804e1a8d7848038 GIT binary patch literal 50174 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

gr<2Z{ug0|n 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 KRI6zD;eP;TN(|Wm literal 0 HcmV?d00001 diff --git a/conf.py b/conf.py index cf8c6d7bd..1093647d9 100644 --- a/conf.py +++ b/conf.py @@ -44,6 +44,7 @@ extensions = [ 'breathe', 'disqus', 'github', + 'seo', ] breathe_projects = {"esphomelib": "./_doxyxml/"} @@ -207,3 +208,4 @@ texinfo_documents = [ author, 'esphomelib', 'One line description of project.', 'Miscellaneous'), ] +html_baseurl = os.getenv('BASE_URL', 'https://esphomelib.com') diff --git a/esphomeyaml/changelog/index.rst b/esphomeyaml/changelog/index.rst index f26374434..d8ad38466 100644 --- a/esphomeyaml/changelog/index.rst +++ b/esphomeyaml/changelog/index.rst @@ -1,6 +1,12 @@ Changelog - Version 1.9.0 ========================= +.. seo:: + :description: Changelog for esphomelib version 1.9.0. + :image: /_static/_changelog-1.9.0.png + :author: Otto Winter + :author_twitter: @OttoWinter_ + .. imgtable:: Beta Releases, guides/faq.html#how-do-i-update-to-the-latest-beta-release, new-box.svg diff --git a/esphomeyaml/changelog/v1.7.0.rst b/esphomeyaml/changelog/v1.7.0.rst index d1f272ed5..bce2cb389 100644 --- a/esphomeyaml/changelog/v1.7.0.rst +++ b/esphomeyaml/changelog/v1.7.0.rst @@ -1,6 +1,11 @@ Version 1.7.0 ============= +.. seo:: + :description: Changelog for esphomelib version 1.7.0. + :author: Otto Winter + :author_twitter: @OttoWinter_ + Wow, what a week! As you may know, I wrote a blog post on the `Home Assistant web site `__ and since then, the amount of esphomelib users has grown sixfold according to the number of GitHub clones! diff --git a/esphomeyaml/changelog/v1.8.0.rst b/esphomeyaml/changelog/v1.8.0.rst index 52c0c8655..fd92f02bb 100644 --- a/esphomeyaml/changelog/v1.8.0.rst +++ b/esphomeyaml/changelog/v1.8.0.rst @@ -1,6 +1,11 @@ Version 1.8.0 ============= +.. seo:: + :description: Changelog for esphomelib version 1.8.0. + :author: Otto Winter + :author_twitter: @OttoWinter_ + .. imgtable:: Waveshare E-Paper, components/display/waveshare_epaper, waveshare_epaper.jpg diff --git a/esphomeyaml/components/ads1115.rst b/esphomeyaml/components/ads1115.rst index d52f56fa7..b1de82cd2 100644 --- a/esphomeyaml/components/ads1115.rst +++ b/esphomeyaml/components/ads1115.rst @@ -1,6 +1,11 @@ ADS1115 Hub =========== +.. seo:: + :description: Instructions for setting up ADS1115 analog voltage multiplexer hubs. + :image: ads1115.jpg + :keywords: ADS1115 + The ``ads1115`` domain creates a global hub so that you can later create individual sensors using the :doc:`ADS1115 Sensor Platform `. To use this hub, first setup the :ref:`I²C Bus ` and connect the sensor to the pins specified there. diff --git a/esphomeyaml/components/binary_sensor/esp32_ble_tracker.rst b/esphomeyaml/components/binary_sensor/esp32_ble_tracker.rst index 218990a90..069513dbd 100644 --- a/esphomeyaml/components/binary_sensor/esp32_ble_tracker.rst +++ b/esphomeyaml/components/binary_sensor/esp32_ble_tracker.rst @@ -1,6 +1,10 @@ ESP32 Bluetooth Low Energy Device ================================= +.. seo:: + :description: Instructions for setting up BLE binary sensors for the ESP32. + :image: bluetooth.svg + The ``esp32_ble_tracker`` binary sensor platform lets you track the presence of a bluetooth low energy device. diff --git a/esphomeyaml/components/binary_sensor/esp32_touch.rst b/esphomeyaml/components/binary_sensor/esp32_touch.rst index 84044ea10..6087ebe90 100644 --- a/esphomeyaml/components/binary_sensor/esp32_touch.rst +++ b/esphomeyaml/components/binary_sensor/esp32_touch.rst @@ -1,6 +1,10 @@ ESP32 Touch Pad Binary Sensor ============================= +.. seo:: + :description: Instructions for setting up the touch pad on the ESP32. + :image: touch.svg + The ``esp32_touch`` binary sensor platform lets you use the touch peripheral of the ESP32 to detect if a certain pin is being "touched". diff --git a/esphomeyaml/components/binary_sensor/gpio.rst b/esphomeyaml/components/binary_sensor/gpio.rst index 9cbb101dc..adcc83a45 100644 --- a/esphomeyaml/components/binary_sensor/gpio.rst +++ b/esphomeyaml/components/binary_sensor/gpio.rst @@ -1,6 +1,10 @@ GPIO Binary Sensor ================== +.. seo:: + :description: Instructions for setting up GPIO binary sensors with esphomelib. + :image: pin.svg + The GPIO Binary Sensor platform allows you to use any input pin on your device as a binary sensor. diff --git a/esphomeyaml/components/binary_sensor/index.rst b/esphomeyaml/components/binary_sensor/index.rst index 10d42bc91..7c01f77d9 100644 --- a/esphomeyaml/components/binary_sensor/index.rst +++ b/esphomeyaml/components/binary_sensor/index.rst @@ -1,6 +1,10 @@ Binary Sensor Component ======================= +.. seo:: + :description: Information about the base representation of all binary sensors. + :image: folder-open.svg + With esphomelib you can use different types of binary sensors. They will automatically appear in the Home Assistant front-end and have several configuration options. diff --git a/esphomeyaml/components/binary_sensor/nextion.rst b/esphomeyaml/components/binary_sensor/nextion.rst index 1cf65c517..ccc6b9c98 100644 --- a/esphomeyaml/components/binary_sensor/nextion.rst +++ b/esphomeyaml/components/binary_sensor/nextion.rst @@ -1,6 +1,10 @@ Nextion Touch Component ======================= +.. seo:: + :description: Instructions for setting up Nextion touch binary sensors. + :image: nextion.jpg + The ``nextion`` binary sensor platform lets you track when a component on the display is touched or not. The binary sensor will turn on when the component with the given component and page id is pressed on, and will turn off as soon as the finger is released. diff --git a/esphomeyaml/components/binary_sensor/pn532.rst b/esphomeyaml/components/binary_sensor/pn532.rst index 90070e1f4..21b03d215 100644 --- a/esphomeyaml/components/binary_sensor/pn532.rst +++ b/esphomeyaml/components/binary_sensor/pn532.rst @@ -1,6 +1,10 @@ PN532 NFC/RFID Tag ================== +.. seo:: + :description: Instructions for setting up NFC tags for the PN532 integration. + :image: pn532.jpg + The ``pn532`` binary sensor platform lets you track if an NFC/RFID tag with a given unique id (``uid``) is currently being detected by the PN532 or not. diff --git a/esphomeyaml/components/binary_sensor/rdm6300.rst b/esphomeyaml/components/binary_sensor/rdm6300.rst index 7d8433cf1..4fc4b169e 100644 --- a/esphomeyaml/components/binary_sensor/rdm6300.rst +++ b/esphomeyaml/components/binary_sensor/rdm6300.rst @@ -1,6 +1,10 @@ RDM6300 NFC/RFID Tag ==================== +.. seo:: + :description: Instructions for setting up NFC tags for the RDM6300 integration. + :image: rdm6300.jpg + The ``rdm6300`` binary sensor platform lets you track if an NFC/RFID tag with a given unique id (``uid``) is currently being detected by the RDM6300 or not. diff --git a/esphomeyaml/components/binary_sensor/remote_receiver.rst b/esphomeyaml/components/binary_sensor/remote_receiver.rst index 991970c78..882ac5158 100644 --- a/esphomeyaml/components/binary_sensor/remote_receiver.rst +++ b/esphomeyaml/components/binary_sensor/remote_receiver.rst @@ -1,6 +1,10 @@ Remote Receiver Binary Sensor ============================= +.. seo:: + :description: Instructions for setting up remote receiver binary sensors for infrared and RF codes. + :image: remote.svg + The ``remote_receiver`` binary sensor lets you track when a button on a remote control is pressed. Each time the pre-defined signal is received, the binary sensor will briefly go ON and diff --git a/esphomeyaml/components/binary_sensor/status.rst b/esphomeyaml/components/binary_sensor/status.rst index 9b28ccd6d..27624520f 100644 --- a/esphomeyaml/components/binary_sensor/status.rst +++ b/esphomeyaml/components/binary_sensor/status.rst @@ -1,6 +1,10 @@ Status Binary Sensor ==================== +.. seo:: + :description: Instructions for setting up MQTT status binary sensors. + :image: server-network.svg + The Status Binary Sensor exposes the node state (if it’s connected to MQTT or not) for Home Assistant. It uses the :ref:`MQTT birth and last will messages ` to do this. diff --git a/esphomeyaml/components/binary_sensor/template.rst b/esphomeyaml/components/binary_sensor/template.rst index 29a59969f..1094d086b 100644 --- a/esphomeyaml/components/binary_sensor/template.rst +++ b/esphomeyaml/components/binary_sensor/template.rst @@ -1,6 +1,10 @@ Template Binary Sensor ====================== +.. seo:: + :description: Instructions for setting up template binary sensors. + :image: description.svg + The ``template`` binary sensor platform allows you to define any :ref:`lambda template ` and construct a binary sensor out if it. diff --git a/esphomeyaml/components/cover/index.rst b/esphomeyaml/components/cover/index.rst index 542557346..5e640d38c 100644 --- a/esphomeyaml/components/cover/index.rst +++ b/esphomeyaml/components/cover/index.rst @@ -1,6 +1,10 @@ Cover Component =============== +.. seo:: + :description: Instructions for setting up base covers in esphomelib. + :image: folder-opn.svg + The ``cover`` component is a generic representation of covers in esphomelib/yaml. A cover can (currently) either be *closed* or *open* and supports three types of commands: *open*, *close* and *stop*. diff --git a/esphomeyaml/components/cover/template.rst b/esphomeyaml/components/cover/template.rst index 3bf7e7a62..0f0b4972b 100644 --- a/esphomeyaml/components/cover/template.rst +++ b/esphomeyaml/components/cover/template.rst @@ -1,6 +1,10 @@ Template Cover ============== +.. seo:: + :description: Instructions for setting up template covers in esphomelib. + :image: description.svg + The ``template`` cover platform allows you to create simple covers out of just a few actions and a value lambda. Once defined, it will automatically appear in Home Assistant as a cover and can be controlled through the frontend. diff --git a/esphomeyaml/components/dallas.rst b/esphomeyaml/components/dallas.rst index fdac28f01..706cd0a5f 100644 --- a/esphomeyaml/components/dallas.rst +++ b/esphomeyaml/components/dallas.rst @@ -1,6 +1,11 @@ Dallas Temperature Component ============================ +.. seo:: + :description: Instructions for setting up dallas temperature sensor hubs that can expose many temperature sensors on a single pin using the one wire protocol. + :image: dallas.jpg + :keywords: Dallas, ds18b20, onewire + The ``dallas`` component allows you to use your `DS18b20 `__ (`datasheet `__) diff --git a/esphomeyaml/components/debug.rst b/esphomeyaml/components/debug.rst index 9ab5dbfe9..bca6cbc03 100644 --- a/esphomeyaml/components/debug.rst +++ b/esphomeyaml/components/debug.rst @@ -1,6 +1,10 @@ Debug Component =============== +.. seo:: + :description: Instructions for setting up the debug component in esphomelib + :image: bug-report.svg + The ``debug`` component can be used to debug problems with esphomelib. At startup, it prints a bunch of useful information like reset reason, free heap size, esphomelib version and so on. diff --git a/esphomeyaml/components/deep_sleep.rst b/esphomeyaml/components/deep_sleep.rst index 863482d78..2a845c638 100644 --- a/esphomeyaml/components/deep_sleep.rst +++ b/esphomeyaml/components/deep_sleep.rst @@ -1,6 +1,10 @@ Deep Sleep Component ==================== +.. seo:: + :description: Instructions for setting up the deep sleep support for minimizing power consumption on ESPs. + :image: hotel.svg + The ``deep_sleep`` component can be used to automatically enter a deep sleep mode on the ESP8266/ESP32 after a certain amount of time. This is especially useful with nodes that operate on batteries and therefore need to conserve as much energy as possible. diff --git a/esphomeyaml/components/display/index.rst b/esphomeyaml/components/display/index.rst index 5ba2440b2..e3d24df0f 100644 --- a/esphomeyaml/components/display/index.rst +++ b/esphomeyaml/components/display/index.rst @@ -1,6 +1,10 @@ Display Component ================= +.. seo:: + :description: Instructions for setting up the display integration. + :image: folder-open.svg + The ``display`` component houses esphomelib's powerful rendering and display engine. Fundamentally, there are these types of displays: diff --git a/esphomeyaml/components/display/lcd_gpio.rst b/esphomeyaml/components/display/lcd_gpio.rst index 2789abad1..431bfbc93 100644 --- a/esphomeyaml/components/display/lcd_gpio.rst +++ b/esphomeyaml/components/display/lcd_gpio.rst @@ -1,6 +1,10 @@ GPIO Character-Based LCD Display ================================ +.. seo:: + :description: Instructions for setting up GPIO character-based LCD displays. + :image: lcd.jpg + The ``lcd_gpio`` display platform allows you to use standard character-based LCD displays like `this one `__ with esphomelib. This integration is only for LCD displays that display individual characters on a screen (usually 16-20 columns and 2-4 rows), and not for LCD displays that can control each pixel individually. Also, this is the GPIO version of the LCD diff --git a/esphomeyaml/components/display/lcd_pcf8574.rst b/esphomeyaml/components/display/lcd_pcf8574.rst index d2d8bc61a..d2c70cb11 100644 --- a/esphomeyaml/components/display/lcd_pcf8574.rst +++ b/esphomeyaml/components/display/lcd_pcf8574.rst @@ -1,6 +1,10 @@ PCF8574 Character-Based LCD Display =================================== +.. seo:: + :description: Instructions for setting up the touch pad on the ESP32. + :image: lcd.jpg + The ``lcd_pcf8574`` display platform allows you to use standard character-based LCD displays like `this one `__ with esphomelib. This integration is only for LCD displays that display individual characters on a screen (usually 16-20 columns and 2-4 rows), and not for LCD displays that can control each pixel individually. diff --git a/esphomeyaml/components/display/max7219.rst b/esphomeyaml/components/display/max7219.rst index 2257e749d..e0807389c 100644 --- a/esphomeyaml/components/display/max7219.rst +++ b/esphomeyaml/components/display/max7219.rst @@ -1,6 +1,10 @@ MAX7219 7-Segment Display ========================= +.. seo:: + :description: Instructions for setting up MAX7129 7-segment displays. + :image: max7219.jpg + The ``max7219`` display platform allows you to use MAX7219 7-segment display drivers (`datasheet `__, `hobbycomponents `__) with esphomelib. Please note that this integration is *only* for 7-segment display, not matrix configurations. diff --git a/esphomeyaml/components/display/nextion.rst b/esphomeyaml/components/display/nextion.rst index 52804e755..13240f14c 100644 --- a/esphomeyaml/components/display/nextion.rst +++ b/esphomeyaml/components/display/nextion.rst @@ -1,6 +1,10 @@ Nextion TFT LCD Display ======================= +.. seo:: + :description: Instructions for setting up Nextion TFT LCD displays + :image: nextion.jpg + .. warning:: This integration is experimental as I don't have the hardware to test it (yet). diff --git a/esphomeyaml/components/display/ssd1306_i2c.rst b/esphomeyaml/components/display/ssd1306_i2c.rst index 5f03571c6..71a582fc3 100644 --- a/esphomeyaml/components/display/ssd1306_i2c.rst +++ b/esphomeyaml/components/display/ssd1306_i2c.rst @@ -1,6 +1,10 @@ SSD1306 OLED Display over I²C ============================= +.. seo:: + :description: Instructions for setting up SSD1306 OLED display drivers using the i2c bus. + :image: ssd1306.jpg + The ``ssd1306_i2c`` display platform allows you to use SSD1306 (`datasheet `__, `Adafruit `__) and SH1106 (`datasheet `__, `electrodragon `__) diff --git a/esphomeyaml/components/display/ssd1306_spi.rst b/esphomeyaml/components/display/ssd1306_spi.rst index 3e52bae6c..338e72fe2 100644 --- a/esphomeyaml/components/display/ssd1306_spi.rst +++ b/esphomeyaml/components/display/ssd1306_spi.rst @@ -1,6 +1,10 @@ SSD1306 OLED Display over SPI ============================= +.. seo:: + :description: Instructions for setting up SSD1306 OLED display drivers using an SPI bus + :image: ssd1306.jpg + The ``ssd1306_spi`` display platform allows you to use SSD1306 (`datasheet `__, `Adafruit `__) and SH1106 (`datasheet `__, `electrodragon `__) diff --git a/esphomeyaml/components/display/waveshare_epaper.rst b/esphomeyaml/components/display/waveshare_epaper.rst index 7a82f681c..98dc4bcde 100644 --- a/esphomeyaml/components/display/waveshare_epaper.rst +++ b/esphomeyaml/components/display/waveshare_epaper.rst @@ -1,6 +1,10 @@ Waveshare E-Paper Display ========================= +.. seo:: + :description: Instructions for setting up Waveshare E-Paper displays in esphomelib. + :image: waveshare_epaper.jpg + The ``waveshare_epaper`` display platform allows you to use some E-Paper displays sold by `Waveshare `__ with esphomelib. Similar modules sold by other vendors might also work but not have been tested yet. Currently only diff --git a/esphomeyaml/components/esp32_ble_beacon.rst b/esphomeyaml/components/esp32_ble_beacon.rst index 01f3c704e..5d2a49e13 100644 --- a/esphomeyaml/components/esp32_ble_beacon.rst +++ b/esphomeyaml/components/esp32_ble_beacon.rst @@ -1,6 +1,10 @@ ESP32 Bluetooth Low Energy Beacon ================================= +.. seo:: + :description: Instructions for setting up Bluetooth Low Energy iBeacons using the BLE feature on ESP32s. + :image: bluetooth.svg + The ``esp32_ble_beacon`` component creates a Bluetooth Low Energy Beacon with your ESP32 device. Beacons are BLE devices that repeatedly just send out a pre-defined packet of data. This packet can then be received by devices like smartphones and can then be used to track a phone's location. diff --git a/esphomeyaml/components/esp32_ble_tracker.rst b/esphomeyaml/components/esp32_ble_tracker.rst index 540b4f95d..83e69edd0 100644 --- a/esphomeyaml/components/esp32_ble_tracker.rst +++ b/esphomeyaml/components/esp32_ble_tracker.rst @@ -1,6 +1,10 @@ ESP32 Bluetooth Low Energy Tracker Hub ====================================== +.. seo:: + :description: Instructions for setting up ESP32 bluetooth low energy device trackers using esphomelib. + :image: bluetooth.svg + The ``esp32_ble_tracker`` component creates a global hub so that you can track bluetooth low energy devices using your ESP32 node. diff --git a/esphomeyaml/components/esp32_touch.rst b/esphomeyaml/components/esp32_touch.rst index f0b90330d..8de673099 100644 --- a/esphomeyaml/components/esp32_touch.rst +++ b/esphomeyaml/components/esp32_touch.rst @@ -1,6 +1,10 @@ ESP32 Touch Pad Hub =================== +.. seo:: + :description: Instructions for setting up the touch pad feature on the ESP32. + :image: touch.svg + The ``esp32_touch`` component creates a global hub for detecting touches on the eight touch pads of the ESP32 as :doc:`binary senors `. diff --git a/esphomeyaml/components/esphomeyaml.rst b/esphomeyaml/components/esphomeyaml.rst index 2e6b71810..ffd80e70d 100644 --- a/esphomeyaml/components/esphomeyaml.rst +++ b/esphomeyaml/components/esphomeyaml.rst @@ -1,6 +1,10 @@ esphomeyaml Core Configuration ============================== +.. seo:: + :description: Instructions for setting up the core esphomeyaml configuration. + :image: cloud-circle.svg + Here you specify some core information that esphomeyaml needs to create firmwares. Most importantly, this is the section of the configuration where you specify the **name** of the node, the **platform** and diff --git a/esphomeyaml/components/fan/binary.rst b/esphomeyaml/components/fan/binary.rst index ee07165fe..fcc2f43e2 100644 --- a/esphomeyaml/components/fan/binary.rst +++ b/esphomeyaml/components/fan/binary.rst @@ -1,6 +1,10 @@ Binary Fan ========== +.. seo:: + :description: Instructions for setting up binary fans. + :image: fan.svg + The ``binary`` fan platform lets you represent any binary :ref:`output` as a fan. .. figure:: images/fan-ui.png diff --git a/esphomeyaml/components/fan/index.rst b/esphomeyaml/components/fan/index.rst index 52e7f5b1e..537dad95c 100644 --- a/esphomeyaml/components/fan/index.rst +++ b/esphomeyaml/components/fan/index.rst @@ -1,6 +1,10 @@ Fan Component ============= +.. seo:: + :description: Instructions for setting up the base fan component. + :image: folder-open.svg + With the ``fan`` domain you can create components that appear as fans in the Home Assistant frontend. A fan can be switched ON or OFF, optionally has a speed setting (``LOW``, ``MEDIUM``, ``HIGH``) and can have an diff --git a/esphomeyaml/components/fan/speed.rst b/esphomeyaml/components/fan/speed.rst index 5f208c236..f72854250 100644 --- a/esphomeyaml/components/fan/speed.rst +++ b/esphomeyaml/components/fan/speed.rst @@ -1,6 +1,10 @@ Speed Fan ========= +.. seo:: + :description: Instructions for setting up speed-controllable fans. + :image: fan.svg + The ``speed`` fan platform lets you represent any float :ref:`output` as a fan that supports speed settings. diff --git a/esphomeyaml/components/i2c.rst b/esphomeyaml/components/i2c.rst index c8f68a635..16c4725a3 100644 --- a/esphomeyaml/components/i2c.rst +++ b/esphomeyaml/components/i2c.rst @@ -3,6 +3,11 @@ I²C Bus ======= +.. seo:: + :description: Instructions for setting up the i2c bus to communicate with 2-wire devices in esphomelib + :image: i2c.svg + :keywords: i2c, iic, bus + This component sets up the i²c bus for your ESP32 or ESP8266. In order for those components to work correctly, you need to define the i²c bus in your configuration. diff --git a/esphomeyaml/components/light/binary.rst b/esphomeyaml/components/light/binary.rst index 6a87561ad..52acb3565 100644 --- a/esphomeyaml/components/light/binary.rst +++ b/esphomeyaml/components/light/binary.rst @@ -1,6 +1,10 @@ Binary Light ============ +.. seo:: + :description: Instructions for setting up binary ON/OFF lights in esphomelib. + :image: lightbulb.svg + The ``binary`` light platform creates a simple ON/OFF-only light from a :ref:`binary output component `. diff --git a/esphomeyaml/components/light/cwww.rst b/esphomeyaml/components/light/cwww.rst index 94ea86b8c..ca601ad7b 100644 --- a/esphomeyaml/components/light/cwww.rst +++ b/esphomeyaml/components/light/cwww.rst @@ -1,6 +1,10 @@ Cold White + Warm White Light ============================= +.. seo:: + :description: Instructions for setting up Cold White + Warm White lights. + :image: brightness-medium.svg + The ``cwww`` light platform creates an Cold-White+Warm-White light from 2 :ref:`float output components ` (one for each channel). The two channels will be mixed using the color temperature configuration options. diff --git a/esphomeyaml/components/light/fastled_clockless.rst b/esphomeyaml/components/light/fastled_clockless.rst index 44b21abb6..fab18bf50 100644 --- a/esphomeyaml/components/light/fastled_clockless.rst +++ b/esphomeyaml/components/light/fastled_clockless.rst @@ -1,6 +1,10 @@ FastLED Clockless Light ======================= +.. seo:: + :description: Instructions for setting up FastLED addressable lights like NEXTION. + :image: color_lens.svg + The ``fastled_clockless`` light platform allows you to create RGB lights in esphomelib for a :ref:`number of supported chipsets `. diff --git a/esphomeyaml/components/light/fastled_spi.rst b/esphomeyaml/components/light/fastled_spi.rst index d2ed11c39..f4a806132 100644 --- a/esphomeyaml/components/light/fastled_spi.rst +++ b/esphomeyaml/components/light/fastled_spi.rst @@ -1,6 +1,10 @@ FastLED SPI Light ================= +.. seo:: + :description: Instructions for setting up other FastLED addressable lights. + :image: color_lens.svg + The ``fastled_spi`` light platform allows you to create RGB lights in esphomelib for a :ref:`number of supported chipsets `. diff --git a/esphomeyaml/components/light/index.rst b/esphomeyaml/components/light/index.rst index a06214f0b..28444de67 100644 --- a/esphomeyaml/components/light/index.rst +++ b/esphomeyaml/components/light/index.rst @@ -1,6 +1,10 @@ Light Component =============== +.. seo:: + :description: Instructions for setting up lights and light effects in esphomelib. + :image: folder-open.svg + The ``light`` domain in esphomeyaml lets you create lights that will automatically be shown in Home Assistant’s frontend and have many features such as RGB colors, transitions, flashing and effects. diff --git a/esphomeyaml/components/light/monochromatic.rst b/esphomeyaml/components/light/monochromatic.rst index 433d559d4..fddc877fc 100644 --- a/esphomeyaml/components/light/monochromatic.rst +++ b/esphomeyaml/components/light/monochromatic.rst @@ -1,6 +1,10 @@ Monochromatic Light =================== +.. seo:: + :description: Instructions for setting up monochromatic (brightness-only) lights. + :image: brightness-medium.svg + The ``monochromatic`` light platform creates a simple brightness-only light from an :ref:`float output component `. diff --git a/esphomeyaml/components/light/rgb.rst b/esphomeyaml/components/light/rgb.rst index 99819c196..8fa28ce1f 100644 --- a/esphomeyaml/components/light/rgb.rst +++ b/esphomeyaml/components/light/rgb.rst @@ -1,6 +1,10 @@ RGB Light ========= +.. seo:: + :description: Instructions for setting up RGB lights in esphomelib. + :image: rgb.png + The ``rgb`` light platform creates an RGB light from 3 :ref:`float output components ` (one for each color channel). diff --git a/esphomeyaml/components/light/rgbw.rst b/esphomeyaml/components/light/rgbw.rst index 86dca3215..3f0ddf4ad 100644 --- a/esphomeyaml/components/light/rgbw.rst +++ b/esphomeyaml/components/light/rgbw.rst @@ -1,6 +1,10 @@ RGBW Light ========== +.. seo:: + :description: Instructions for setting up RGB + White-Channel lights. + :image: rgbw.png + The ``rgbw`` light platform creates an RGBW light from 4 :ref:`float output components ` (one for each channel). .. code:: yaml diff --git a/esphomeyaml/components/light/rgbww.rst b/esphomeyaml/components/light/rgbww.rst index 656007891..89bfd8cc4 100644 --- a/esphomeyaml/components/light/rgbww.rst +++ b/esphomeyaml/components/light/rgbww.rst @@ -1,6 +1,10 @@ RGBWW Light =========== +.. seo:: + :description: Instructions for setting up RGBWW lights. + :image: rgbw.png + The ``rgbww`` light platform creates an RGBWW (cold white + warm white) light from 5 :ref:`float output components ` (one for each channel). The cold white and warm white channels will be mixed using the color temperature configuration options. diff --git a/esphomeyaml/components/logger.rst b/esphomeyaml/components/logger.rst index 3fccdce99..fa33f9394 100644 --- a/esphomeyaml/components/logger.rst +++ b/esphomeyaml/components/logger.rst @@ -1,6 +1,10 @@ Logger Component ================ +.. seo:: + :description: Instructions for setting up the central logging component in esphomelib. + :image: file-document-box.svg + The logger component automatically logs all log messages through the serial port and through MQTT topics. By default, all logs with a severity higher than ``DEBUG`` will be shown. Decreasing the log level diff --git a/esphomeyaml/components/mqtt.rst b/esphomeyaml/components/mqtt.rst index 00406e705..fdff7a415 100644 --- a/esphomeyaml/components/mqtt.rst +++ b/esphomeyaml/components/mqtt.rst @@ -1,6 +1,11 @@ MQTT Client Component ===================== +.. seo:: + :description: Instructions for setting up the MQTT client to communicate with the local network in esphomelib. + :image: mqtt.png + :keywords: MQTT + The MQTT Client Component sets up the MQTT connection to your broker and is currently required for esphomelib to work. In most cases, you will just be able to copy over the `MQTT diff --git a/esphomeyaml/components/my9231.rst b/esphomeyaml/components/my9231.rst index 1d38e3796..310b1f84c 100644 --- a/esphomeyaml/components/my9231.rst +++ b/esphomeyaml/components/my9231.rst @@ -1,6 +1,11 @@ MY9231/MY9291 LED driver Component ================================== +.. seo:: + :description: Instructions for setting up MY9231 and MY9291 LED drives in esphomelib. + :image: my9231.svg + :keywords: MY9231, MY9291, Sonoff B1, Ai-thinker AiLight WiFi light bulb, Arilux E27 Smart Bulb + The MY9231/MY9291 component represents a MY9231/MY9291 LED diver chain (`MY9231 description `__, `MY9291 description `__) in diff --git a/esphomeyaml/components/ota.rst b/esphomeyaml/components/ota.rst index 7c9988b89..b0fa19b23 100644 --- a/esphomeyaml/components/ota.rst +++ b/esphomeyaml/components/ota.rst @@ -1,6 +1,11 @@ OTA Update Component ==================== +.. seo:: + :description: Instructions for setting up Over-The-Air (OTA) updates for ESPs to upload firmwares remotely. + :image: system-update.svg + :keywords: Xiaomi, Mi Flora, BLE, Bluetooth + With the OTA (Over The Air) update component you can upload your firmware binaries to your node without having to use an USB cable for uploads. esphomeyaml natively supports this through its ``run`` and diff --git a/esphomeyaml/components/output/esp8266_pwm.rst b/esphomeyaml/components/output/esp8266_pwm.rst index 7522d9ffb..5e2b22c48 100644 --- a/esphomeyaml/components/output/esp8266_pwm.rst +++ b/esphomeyaml/components/output/esp8266_pwm.rst @@ -1,6 +1,10 @@ ESP8266 Software PWM Output =========================== +.. seo:: + :description: Instructions for setting up ESP8266 software-based PWMs. + :image: pwm.png + The ESP8266 Software PWM platform allows you to use a software PWM on the pins GPIO0-GPIO16 on your ESP8266. As this is only a software PWM and not a hardware PWM (like the :doc:`ESP32 LEDC PWM `) and has a few diff --git a/esphomeyaml/components/output/gpio.rst b/esphomeyaml/components/output/gpio.rst index e5d76a25c..153d971a6 100644 --- a/esphomeyaml/components/output/gpio.rst +++ b/esphomeyaml/components/output/gpio.rst @@ -1,6 +1,10 @@ GPIO Output =========== +.. seo:: + :description: Instructions for setting up binary outputs for GPIO pins. + :image: pin.svg + The GPIO output component is quite simple: It exposes a single GPIO pin as an output component. Note that output components are **not** switches and will not show up in Home Assistant. See :doc:`GPIO Switch `. diff --git a/esphomeyaml/components/output/index.rst b/esphomeyaml/components/output/index.rst index c4be23a44..08c3f71a4 100644 --- a/esphomeyaml/components/output/index.rst +++ b/esphomeyaml/components/output/index.rst @@ -3,6 +3,10 @@ Output Component ================ +.. seo:: + :description: Instructions for setting up generic outputs in esphomelib + :image: folder-open.svg + Each platform of the ``output`` domain exposes some output to esphomelib. These are grouped into two categories: ``binary`` outputs (that can only be ON/OFF) and ``float`` outputs (like PWM, can output diff --git a/esphomeyaml/components/output/ledc.rst b/esphomeyaml/components/output/ledc.rst index 2a2f61a02..1f364e6ea 100644 --- a/esphomeyaml/components/output/ledc.rst +++ b/esphomeyaml/components/output/ledc.rst @@ -1,6 +1,10 @@ ESP32 LEDC Output ================= +.. seo:: + :description: Instructions for setting up LEDC hardware PWM outputs on the ESP32. + :image: pwm.png + The LEDC output component exposes a `LEDC PWM channel `__ of the ESP32 as an output component. diff --git a/esphomeyaml/components/output/my9231.rst b/esphomeyaml/components/output/my9231.rst index 55009f0f4..b7da82510 100644 --- a/esphomeyaml/components/output/my9231.rst +++ b/esphomeyaml/components/output/my9231.rst @@ -1,6 +1,10 @@ MY9231/MY9291 Output ==================== +.. seo:: + :description: Instructions for setting up MY931 and MY9231 outputs. + :image: my9231.svg + The MY931/MY9291 output component exposes a MY931/MY9291 channel of a global :doc:`/esphomeyaml/components/my9231` as a float output. diff --git a/esphomeyaml/components/output/pca9685.rst b/esphomeyaml/components/output/pca9685.rst index 416b43467..a6db27eff 100644 --- a/esphomeyaml/components/output/pca9685.rst +++ b/esphomeyaml/components/output/pca9685.rst @@ -1,6 +1,10 @@ PCA9685 PWM Output ================== +.. seo:: + :description: Instructions for setting up PCA9685 PWM controller outputs. + :image: pca9685.jpg + The PCA9685 output component exposes a PCA9685 PWM channel of a global :doc:`PCA9685 hub ` as a float output. diff --git a/esphomeyaml/components/pca9685.rst b/esphomeyaml/components/pca9685.rst index 23fe6af00..9a2e849a6 100644 --- a/esphomeyaml/components/pca9685.rst +++ b/esphomeyaml/components/pca9685.rst @@ -1,6 +1,11 @@ PCA9685 PWM Component ===================== +.. seo:: + :description: Instructions for setting up PCA9685 LED PWM drivers. + :image: pca9685.jpg + :keywords: PCA9685 + The PCA9685 component represents a PCA9685 12-bit PWM driver (`datasheet `__, `adafruit `__) in esphomelib. It diff --git a/esphomeyaml/components/pcf8574.rst b/esphomeyaml/components/pcf8574.rst index ee509fac9..21e03866c 100644 --- a/esphomeyaml/components/pcf8574.rst +++ b/esphomeyaml/components/pcf8574.rst @@ -1,6 +1,11 @@ PCF8574 I/O Expander ==================== +.. seo:: + :description: Instructions for setting up PCA8574 digital port expanders in esphomelib. + :image: pcf8574.jpg + :keywords: Xiaomi, Mi Flora, BLE, Bluetooth + The PCF8574 component allows you to use PCF8574 or PCF8575 I/O expanders (`datasheet `__, `Sparkfun`_) in esphomeyaml. It uses :ref:`I²C Bus ` for communication. diff --git a/esphomeyaml/components/pn532.rst b/esphomeyaml/components/pn532.rst index e63179ad9..23c0a01b3 100644 --- a/esphomeyaml/components/pn532.rst +++ b/esphomeyaml/components/pn532.rst @@ -1,6 +1,11 @@ PN532 NFC/RFID Controller Hub ============================= +.. seo:: + :description: Instructions for setting up PN532 NFC tag readers in esphomelib + :image: pn532.jpg + :keywords: PN532, NFC, RFID + The ``pn532`` component allows you to use PN532 NFC/RFID controllers (`datasheet `__, `adafruit `__) with esphomelib. This component is a global hub that establishes the connection to the PN532 via :ref:`SPI ` and diff --git a/esphomeyaml/components/power_supply.rst b/esphomeyaml/components/power_supply.rst index d1ce29a3d..8569ba415 100644 --- a/esphomeyaml/components/power_supply.rst +++ b/esphomeyaml/components/power_supply.rst @@ -1,6 +1,11 @@ Power Supply Component ====================== +.. seo:: + :description: Instructions for setting up power supplies which will automatically turn on together with outputs. + :image: power.svg + :keywords: power, ATX + The ``power_supply`` component allows you to have a high power mode for certain outputs. For example, if you’re using an `ATX power supply `__ to power your LED strips, diff --git a/esphomeyaml/components/rdm6300.rst b/esphomeyaml/components/rdm6300.rst index 1739f785f..0b871e6a8 100644 --- a/esphomeyaml/components/rdm6300.rst +++ b/esphomeyaml/components/rdm6300.rst @@ -1,6 +1,11 @@ RDM6300 NFC/RFID Hub ==================== +.. seo:: + :description: Instructions for setting up RDM6300 NFC/RFID tag readers in esphomelib. + :image: rdm6300.jpg + :keywords: RDM6300, NFC, RFID + The ``rdm6300`` component allows you to use RDM6300 NFC/RFID controllers (`datasheet `__, `iTead `__) with esphomelib. This component is a global hub that establishes the connection to the RDM6300 via :ref:`UART ` and diff --git a/esphomeyaml/components/remote_receiver.rst b/esphomeyaml/components/remote_receiver.rst index 291c9b2ed..753bbd5b8 100644 --- a/esphomeyaml/components/remote_receiver.rst +++ b/esphomeyaml/components/remote_receiver.rst @@ -1,6 +1,11 @@ Remote Receiver Component ========================= +.. seo:: + :description: Instructions for setting up remote receivers in esphomelib. + :image: remote.svg + :keywords: RF, infrared + The ``remote_receiver`` component lets you receive and decode any remote signal, these can for example be infrared remotes or 433MHz signals. diff --git a/esphomeyaml/components/remote_transmitter.rst b/esphomeyaml/components/remote_transmitter.rst index a26534d05..fb3783387 100644 --- a/esphomeyaml/components/remote_transmitter.rst +++ b/esphomeyaml/components/remote_transmitter.rst @@ -1,6 +1,11 @@ Remote Transmitter Component ============================ +.. seo:: + :description: Instructions for setting up remote transmitters in esphomelib + :image: remote.svg + :keywords: RF, infrared + The ``remote_transmitter`` component lets you send infrared messages to control devices in your home. First, you need to setup a global hub that specifies which pin your remote sender is connected to. Afterwards you can create :doc:`individual diff --git a/esphomeyaml/components/sensor/adc.rst b/esphomeyaml/components/sensor/adc.rst index 984594c61..03b889e25 100644 --- a/esphomeyaml/components/sensor/adc.rst +++ b/esphomeyaml/components/sensor/adc.rst @@ -1,6 +1,10 @@ Analog To Digital Sensor ======================== +.. seo:: + :description: Instructions for setting up built-in analog voltage sensors. + :image: flash.svg + The Analog To Digital (``adc``) Sensor allows you to use the built-in ADC in your device to measure a voltage on certain pins. On the ESP8266 only pin A0 (GPIO17) supports this. On the ESP32 pins GPIO32 through diff --git a/esphomeyaml/components/sensor/ads1115.rst b/esphomeyaml/components/sensor/ads1115.rst index e8cac52a3..f97e0b9fc 100644 --- a/esphomeyaml/components/sensor/ads1115.rst +++ b/esphomeyaml/components/sensor/ads1115.rst @@ -1,6 +1,11 @@ ADS1115 Sensor ============== +.. seo:: + :description: Instructions for setting up ADS1115 multiplexed analog voltage sensors. + :image: ads1115.jpg + :keywords: ADS1115 + The ``ads1115`` sensor allows you to use your ADS1115 sigma-delta ADC sensors (`datasheet `__, `Adafruit`_) with esphomelib. First, setup a :doc:`ADS1115 Hub ` for your ADS1115 sensor and then use this diff --git a/esphomeyaml/components/sensor/bh1750.rst b/esphomeyaml/components/sensor/bh1750.rst index af5d4a498..224baf865 100644 --- a/esphomeyaml/components/sensor/bh1750.rst +++ b/esphomeyaml/components/sensor/bh1750.rst @@ -1,6 +1,11 @@ BH1750 Ambient Light Sensor =========================== +.. seo:: + :description: Instructions for setting up BH1750 ambient light sensors in esphomelib. + :image: bh1750.jpg + :keywords: BH1750 + The ``bh1750`` sensor platform allows you to use your BH1750 (`datasheet `__, `Aliexpress`_, `mklec`_) ambient light sensor with esphomelib. The :ref:`I²C bus ` is required to be set up in diff --git a/esphomeyaml/components/sensor/ble_rssi.rst b/esphomeyaml/components/sensor/ble_rssi.rst index 3dfa6d450..e1a2629e4 100644 --- a/esphomeyaml/components/sensor/ble_rssi.rst +++ b/esphomeyaml/components/sensor/ble_rssi.rst @@ -1,6 +1,11 @@ ESP32 Bluetooth Low Energy RSSI Sensor ====================================== +.. seo:: + :description: Instructions for setting up RSSI sensors for the ESP32 BLE. + :image: bluetooth.svg + :keywords: ESP32 + The ``ble_rssi`` sensor platform lets you track the RSSI value or signal strength of a BLE device. See :ref:`the binary sensor setup ` for instructions for setting up this platform. diff --git a/esphomeyaml/components/sensor/bme280.rst b/esphomeyaml/components/sensor/bme280.rst index 2f3090f74..204fb72b2 100644 --- a/esphomeyaml/components/sensor/bme280.rst +++ b/esphomeyaml/components/sensor/bme280.rst @@ -1,6 +1,11 @@ BME280 Temperature+Pressure+Humidity Sensor =========================================== +.. seo:: + :description: Instructions for setting up BME280 temperature, pressure and humidity sensors + :image: bme280.jpg + :keywords: BME280 + The ``bme280`` sensor platform allows you to use your BME280 (`datasheet `__, `Adafruit`_) temperature, pressure and humidity sensors with esphomelib. The :ref:`I²C ` is diff --git a/esphomeyaml/components/sensor/bme680.rst b/esphomeyaml/components/sensor/bme680.rst index 2ad22d8ad..d4a8d516e 100644 --- a/esphomeyaml/components/sensor/bme680.rst +++ b/esphomeyaml/components/sensor/bme680.rst @@ -1,6 +1,11 @@ BME680 Temperature+Pressure+Humidity+Gas Sensor =============================================== +.. seo:: + :description: Instructions for setting up BME680 temperature, humidity, pressure and gas sensors. + :image: bme680.jpg + :keywords: BME680 + The ``bme680`` sensor platform allows you to use your BME680 (`datasheet `__, `Adafruit`_) temperature, pressure and humidity sensors with esphomelib. The :ref:`I²C ` is required to be set up in diff --git a/esphomeyaml/components/sensor/bmp085.rst b/esphomeyaml/components/sensor/bmp085.rst index 10109b4e6..d6b1ef376 100644 --- a/esphomeyaml/components/sensor/bmp085.rst +++ b/esphomeyaml/components/sensor/bmp085.rst @@ -1,6 +1,11 @@ BMP085 Temperature+Pressure Sensor ================================== +.. seo:: + :description: Instructions for setting up BMP085 temperature and temperature sensors + :image: bmp180.jpg + :keywords: BMP085, BMP180 + The BMP085 sensor platform allows you to use your BMP085 (`datasheet `__, `adafruit `__) and BMP180 diff --git a/esphomeyaml/components/sensor/bmp280.rst b/esphomeyaml/components/sensor/bmp280.rst index 3e4f62ae1..a82a8350e 100644 --- a/esphomeyaml/components/sensor/bmp280.rst +++ b/esphomeyaml/components/sensor/bmp280.rst @@ -1,6 +1,11 @@ BMP280 Temperature+Pressure Sensor ================================== +.. seo:: + :description: Instructions for setting up BMP280 temperature and pressure sensors with esphomelib + :image: bmp280.jpg + :keywords: BMP280 + The ``bmp280`` sensor platform allows you to use your BMP280 (`datasheet `__, `Adafruit`_) temperature and pressure sensors with esphomelib. The :ref:`I²C ` is diff --git a/esphomeyaml/components/sensor/cse7766.rst b/esphomeyaml/components/sensor/cse7766.rst index 45ccedcee..ea231bf8f 100644 --- a/esphomeyaml/components/sensor/cse7766.rst +++ b/esphomeyaml/components/sensor/cse7766.rst @@ -1,6 +1,11 @@ CSE7766 Power Sensor ==================== +.. seo:: + :description: Instructions for setting up CSE7766 power sensors for the Sonoff Pow R2 + :image: cse7766.svg + :keywords: cse7766, Sonoff Pow R2 + .. warning:: This integration is experimental as I don't have the hardware to test it (yet). diff --git a/esphomeyaml/components/sensor/custom.rst b/esphomeyaml/components/sensor/custom.rst index 423907c14..b0f599628 100644 --- a/esphomeyaml/components/sensor/custom.rst +++ b/esphomeyaml/components/sensor/custom.rst @@ -1,6 +1,11 @@ Custom Sensor Component ======================= +.. seo:: + :description: Instructions for setting up Custom C++ sensors with esphomelib. + :image: language-cpp.svg + :keywords: C++, Custom + .. warning:: While I do try to keep the esphomeyaml configuration options as stable as possible diff --git a/esphomeyaml/components/sensor/dallas.rst b/esphomeyaml/components/sensor/dallas.rst index 30f9fcc82..1fe836a72 100644 --- a/esphomeyaml/components/sensor/dallas.rst +++ b/esphomeyaml/components/sensor/dallas.rst @@ -1,6 +1,11 @@ Dallas Temperature Sensor ========================= +.. seo:: + :description: Instructions for setting up DS18b20 and similar temperature sensors + :image: dallas.jpg + :keywords: dallas, ds18b20 + The ``dallas`` sensor allows you to use ds18b20 and similar sensors. First, you need to define a :doc:`dallas sensor component `. The dallas sensor component (or "hub") is an internal model that defines which pins the ds18b20 diff --git a/esphomeyaml/components/sensor/dht.rst b/esphomeyaml/components/sensor/dht.rst index 38bc7936d..f2c1c97ec 100644 --- a/esphomeyaml/components/sensor/dht.rst +++ b/esphomeyaml/components/sensor/dht.rst @@ -1,6 +1,11 @@ DHT Temperature+Humidity Sensor =============================== +.. seo:: + :description: Instructions for setting up DHT11 and DHT22 temperature and humidity sensors. + :image: dht.jpg + :keywords: DHT11, DHT22, AM2302, RHT03 + The DHT Temperature+Humidity sensor allows you to use your DHT11 (`datasheet `__, `adafruit `__), DHT22 diff --git a/esphomeyaml/components/sensor/dht12.rst b/esphomeyaml/components/sensor/dht12.rst index 5695495c3..63da3cb22 100644 --- a/esphomeyaml/components/sensor/dht12.rst +++ b/esphomeyaml/components/sensor/dht12.rst @@ -1,6 +1,11 @@ DHT12 Temperature+Humidity Sensor ================================= +.. seo:: + :description: Instructions for setting up DHT12 temperature and humidity sensors + :image: dht12.jpg + :keywords: dht12 + The ``dht12`` Temperature+Humidity sensor allows you to use your DHT12 (`datasheet `__, `electrodragon`_) i2c-based sensor with esphomelib. diff --git a/esphomeyaml/components/sensor/duty_cycle.rst b/esphomeyaml/components/sensor/duty_cycle.rst index fe3e8367b..0ab62c94b 100644 --- a/esphomeyaml/components/sensor/duty_cycle.rst +++ b/esphomeyaml/components/sensor/duty_cycle.rst @@ -1,6 +1,10 @@ Duty Cycle Sensor ================= +.. seo:: + :description: Instructions for setting up duty cycle sensors in esphomelib + :image: percent.svg + The duty cycle sensor allows you to measure for what percentage of time a signal on a GPIO pin is HIGH or LOW. diff --git a/esphomeyaml/components/sensor/esp32_hall.rst b/esphomeyaml/components/sensor/esp32_hall.rst index 142d7064b..8efeb91b2 100644 --- a/esphomeyaml/components/sensor/esp32_hall.rst +++ b/esphomeyaml/components/sensor/esp32_hall.rst @@ -1,6 +1,11 @@ ESP32 Hall Sensor ================= +.. seo:: + :description: Instructions for setting up the integrated hall-effect sensor of the ESP32. + :image: magnet.svg + :keywords: esp32, hall + The ``esp32_hall`` sensor platform allows you to use the integrated `hall effect sensor `__ of the ESP32 chip to measure the magnitude and direction of magnetic field around the diff --git a/esphomeyaml/components/sensor/hdc1080.rst b/esphomeyaml/components/sensor/hdc1080.rst index 729aac741..a1e93b966 100644 --- a/esphomeyaml/components/sensor/hdc1080.rst +++ b/esphomeyaml/components/sensor/hdc1080.rst @@ -1,6 +1,11 @@ HDC1080 Temperature+Humidity Sensor =================================== +.. seo:: + :description: Instructions for setting up HDC1080 temperature and humidity sensors. + :image: hdc1080.jpg + :keywords: HDC1080 + The HDC1080 Temperature+Humidity sensor allows you to use your HDC1080 (`datasheet `__, `adafruit `__) sensors with diff --git a/esphomeyaml/components/sensor/hlw8012.rst b/esphomeyaml/components/sensor/hlw8012.rst index bcbc894ad..ad0d27a3f 100644 --- a/esphomeyaml/components/sensor/hlw8012.rst +++ b/esphomeyaml/components/sensor/hlw8012.rst @@ -1,6 +1,11 @@ HLW8012 Power Sensor ==================== +.. seo:: + :description: Instructions for setting up HLW8012 power sensors for the Sonoff Pow R1 + :image: hlw8012.svg + :keywords: HLW8012, Sonoff Pow R1 + The ``hlw8012`` sensor platform allows you to use your HLW8012 voltage/current and power sensors (`datasheet `__) sensors with esphomelib. This sensor is commonly found in Sonoff POWs. diff --git a/esphomeyaml/components/sensor/hmc5883l.rst b/esphomeyaml/components/sensor/hmc5883l.rst index 886dd3dbf..c0b2561f6 100644 --- a/esphomeyaml/components/sensor/hmc5883l.rst +++ b/esphomeyaml/components/sensor/hmc5883l.rst @@ -1,6 +1,11 @@ HMC5883L Magnetometer ===================== +.. seo:: + :description: Instructions for setting up HMC5883L IMU compass sensors. + :image: hmc5883l.jpg + :keywords: HMC5883L + The ``hmc5883l`` allows you to use your HMC5883L triple-axis magnetometers (`datasheet `__, `Adafruit`_) with diff --git a/esphomeyaml/components/sensor/htu21d.rst b/esphomeyaml/components/sensor/htu21d.rst index e09a53819..44315444a 100644 --- a/esphomeyaml/components/sensor/htu21d.rst +++ b/esphomeyaml/components/sensor/htu21d.rst @@ -1,6 +1,11 @@ HTU21D Temperature+Humidity Sensor ================================== +.. seo:: + :description: Instructions for setting up HTU21D temperature and humidity sensors. + :image: htu21d.jpg + :keywords: HTU21D + The HTU21D Temperature+Humidity sensor allows you to use your HTU21D (`datasheet `__, `adafruit `__) sensors with diff --git a/esphomeyaml/components/sensor/hx711.rst b/esphomeyaml/components/sensor/hx711.rst index 7f2b8a01d..2d0f02680 100644 --- a/esphomeyaml/components/sensor/hx711.rst +++ b/esphomeyaml/components/sensor/hx711.rst @@ -1,6 +1,11 @@ HX711 Load Cell Amplifier ========================= +.. seo:: + :description: Instructions for setting up HX711 load cell amplifiers with esphomelib + :image: hx711.svg + :keywords: HX711 + The ``hx711`` sensor platform allows you to use your HX711 load cell amplifier (`datasheet `__, `Sparkfun`_) with esphomelib diff --git a/esphomeyaml/components/sensor/ina219.rst b/esphomeyaml/components/sensor/ina219.rst index c950dafed..d76e34c1e 100644 --- a/esphomeyaml/components/sensor/ina219.rst +++ b/esphomeyaml/components/sensor/ina219.rst @@ -1,6 +1,11 @@ INA219 DC Current Sensor ======================== +.. seo:: + :description: Instructions for setting up INA219 DC current sensors + :image: ina219.jpg + :keywords: ina219 + The ``ina219`` sensor platform allows you to use your INA219 High Side DC Current Sensor (`datasheet `__, `Adafruit`_) sensors with diff --git a/esphomeyaml/components/sensor/ina3221.rst b/esphomeyaml/components/sensor/ina3221.rst index c2b6781c3..66cac134a 100644 --- a/esphomeyaml/components/sensor/ina3221.rst +++ b/esphomeyaml/components/sensor/ina3221.rst @@ -1,6 +1,11 @@ INA3221 3-Channel DC Current Sensor =================================== +.. seo:: + :description: Instructions for setting up INA3221 3-channel DC current sensors. + :image: ina3221.jpg + :keywords: ina3221 + The ``ina3221`` sensor platform allows you to use your INA3221 3-Channel DC Current Sensor (`datasheet `__, `switchdoc`_) sensors with diff --git a/esphomeyaml/components/sensor/index.rst b/esphomeyaml/components/sensor/index.rst index 48750ab5d..9baac52ce 100644 --- a/esphomeyaml/components/sensor/index.rst +++ b/esphomeyaml/components/sensor/index.rst @@ -1,6 +1,10 @@ Sensor Component ================ +.. seo:: + :description: Instructions for setting up sensor components in esphomelib. + :image: folder-open.svg + esphomelib has support for many different sensors. Each of them is a platform of the ``sensor`` domain and each sensor has several base configuration options. diff --git a/esphomeyaml/components/sensor/max6675.rst b/esphomeyaml/components/sensor/max6675.rst index 8794ebc7c..b8623f106 100644 --- a/esphomeyaml/components/sensor/max6675.rst +++ b/esphomeyaml/components/sensor/max6675.rst @@ -1,6 +1,10 @@ MAX6675 K-Type Thermocouple Temperature Sensor ============================================== +.. seo:: + :description: Instructions for setting up MAX6675 Thermocouple temperature sensors. + :image: max6675.jpg + The ``max6675`` temperature sensor allows you to use your max6675 thermocouple temperature sensor (`datasheet `__, `sainsmart`_) with esphomelib diff --git a/esphomeyaml/components/sensor/mhz19.rst b/esphomeyaml/components/sensor/mhz19.rst index 5826953dc..b91ebd98e 100644 --- a/esphomeyaml/components/sensor/mhz19.rst +++ b/esphomeyaml/components/sensor/mhz19.rst @@ -1,6 +1,11 @@ MH-Z19 CO_2 and Temperature Sensor ================================== +.. seo:: + :description: Instructions for setting up MH-Z19 CO2 and temperature sensors + :image: mhz19.jpg + :keywords: mh-z19 + The ``mhz19`` sensor platform allows you to use MH-Z19 CO_2 and temperature sensors (`refspace`_) with esphomelib. diff --git a/esphomeyaml/components/sensor/mpu6050.rst b/esphomeyaml/components/sensor/mpu6050.rst index 964f78b25..8a134a1c8 100644 --- a/esphomeyaml/components/sensor/mpu6050.rst +++ b/esphomeyaml/components/sensor/mpu6050.rst @@ -1,6 +1,10 @@ MPU6050 Accelerometer/Gyroscope Sensor ====================================== +.. seo:: + :description: Instructions for setting up MPU6050 Accelerometer and Gyroscope sensors. + :image: mpu6050.jpg + The ``mpu6050`` sensor platform allows you to use your MPU6050 Accelerometer/Gyroscope (`datasheet `__, `Sparkfun`_) sensors with diff --git a/esphomeyaml/components/sensor/mqtt_subscribe.rst b/esphomeyaml/components/sensor/mqtt_subscribe.rst index 3f6f99ebf..6eb8f6ca5 100644 --- a/esphomeyaml/components/sensor/mqtt_subscribe.rst +++ b/esphomeyaml/components/sensor/mqtt_subscribe.rst @@ -1,6 +1,11 @@ MQTT Subscribe Sensor ===================== +.. seo:: + :description: Instructions for setting up MQTT subscribe sensors + :image: mqtt.png + :keywords: MQTT + The ``mqtt_subscribe`` sensor platform allows you to get external data into esphomelib. The sensor will subscribe to messages on the given MQTT topic and parse each message into a floating point number. diff --git a/esphomeyaml/components/sensor/ms5611.rst b/esphomeyaml/components/sensor/ms5611.rst index 1ba04b44e..a9ec892cb 100644 --- a/esphomeyaml/components/sensor/ms5611.rst +++ b/esphomeyaml/components/sensor/ms5611.rst @@ -1,6 +1,11 @@ MS5611 Atmospheric Pressure Sensor ================================== +.. seo:: + :description: Instructions for setting up MS5611 atmospheric pressure sensors. + :image: ms5611.jpg + :keywords: MS5611 + The ``ms5611`` sensor platform allows you to use your MS5611 atmospheric pressure sensors (`datasheet `__, `hobbytronics`_) temperature and pressure sensors with esphomelib. The :ref:`I²C ` is diff --git a/esphomeyaml/components/sensor/pmsx003.rst b/esphomeyaml/components/sensor/pmsx003.rst index 68ec3bf2f..7c7e72ae5 100644 --- a/esphomeyaml/components/sensor/pmsx003.rst +++ b/esphomeyaml/components/sensor/pmsx003.rst @@ -1,6 +1,10 @@ PMSX003 Particulate Matter Sensor ================================= +.. seo:: + :description: Instructions for setting up PMSX003 Particulate matter sensors + :image: pmsx003.svg + .. warning:: This integration is experimental as I don't have the hardware to test it (yet). diff --git a/esphomeyaml/components/sensor/pulse_counter.rst b/esphomeyaml/components/sensor/pulse_counter.rst index 36168f3cc..96b980e46 100644 --- a/esphomeyaml/components/sensor/pulse_counter.rst +++ b/esphomeyaml/components/sensor/pulse_counter.rst @@ -1,6 +1,10 @@ Pulse Counter Sensor ==================== +.. seo:: + :description: Instructions for setting up pulse counter sensors. + :image: pulse.svg + The pulse counter sensor allows you to count the number of pulses and the frequency of a signal on any pin. diff --git a/esphomeyaml/components/sensor/rotary_encoder.rst b/esphomeyaml/components/sensor/rotary_encoder.rst index c1e7a501e..fef21eced 100644 --- a/esphomeyaml/components/sensor/rotary_encoder.rst +++ b/esphomeyaml/components/sensor/rotary_encoder.rst @@ -1,6 +1,10 @@ Rotary Encoder Sensor ===================== +.. seo:: + :description: Instructions for setting up rotary encoders. + :image: rotary_encoder.jpg + The ``rotary_encoder`` sensor platform allows you to use any continuous-rotation rotary encoders with esphomeyaml. These devices usually have two pins with which they encode the rotation. Every time the knob of the rotary encoder is turned, the diff --git a/esphomeyaml/components/sensor/sht3xd.rst b/esphomeyaml/components/sensor/sht3xd.rst index 1ecb0ab49..f4463c367 100644 --- a/esphomeyaml/components/sensor/sht3xd.rst +++ b/esphomeyaml/components/sensor/sht3xd.rst @@ -1,6 +1,10 @@ SHT3X-D Temperature+Humidity Sensor =================================== +.. seo:: + :description: Instructions for setting up SHT31-D temperature and humidity sensors + :image: sht3xd.jpg + The ``sht3xd`` sensor platform Temperature+Humidity sensor allows you to use your Sensiron SHT31-D (`datasheet `__, `Adafruit`_ ) sensors with diff --git a/esphomeyaml/components/sensor/tcs34725.rst b/esphomeyaml/components/sensor/tcs34725.rst index d2e8f12f5..55c92bd9c 100644 --- a/esphomeyaml/components/sensor/tcs34725.rst +++ b/esphomeyaml/components/sensor/tcs34725.rst @@ -1,6 +1,11 @@ TCS34725 RGB Color Sensor ========================= +.. seo:: + :description: Instructions for setting up TCS34725 RGB color sensors. + :image: tcs34725.jpg + :keywords: tcs34725 + The ``tcs34725`` sensor platform allows you to use your TCS34725 RGB color sensors (`datasheet `__, `Adafruit`_) temperature and pressure sensors with esphomelib. The :ref:`I²C ` is diff --git a/esphomeyaml/components/sensor/template.rst b/esphomeyaml/components/sensor/template.rst index 80add8f38..db60898a9 100644 --- a/esphomeyaml/components/sensor/template.rst +++ b/esphomeyaml/components/sensor/template.rst @@ -1,6 +1,10 @@ Template Sensor =============== +.. seo:: + :description: Instructions for setting up template sensors with esphomelib. + :image: description.svg + The ``template`` sensor platform allows you to create a sensor with templated values using :ref:`lambdas `. @@ -36,6 +40,15 @@ Configuration variables: - **id** (*Optional*,:ref:`config-id`): Manually specify the ID used for code generation. - All other options from :ref:`Sensor ` and :ref:`MQTT Component `. +.. note:: + + You can use the ``publish_state()`` method to set the value of a template + sensor from other automations: + + .. code:: cpp + + id(my_sensor).publish_state(42.0); + See Also -------- diff --git a/esphomeyaml/components/sensor/total_daily_energy.rst b/esphomeyaml/components/sensor/total_daily_energy.rst index 351de1c96..7e7a16442 100644 --- a/esphomeyaml/components/sensor/total_daily_energy.rst +++ b/esphomeyaml/components/sensor/total_daily_energy.rst @@ -1,6 +1,10 @@ Total Daily Energy Sensor ========================= +.. seo:: + :description: Instructions for setting up sensors that track the total daily energy usage per day and accumulate the power usage. + :image: sigma.svg + The ``total_daily_energy`` sensor is a helper sensor that can use the energy value of other sensors like the :doc:`HLW8012 `, :doc:`CSE7766 `, etc and integrate it over time. diff --git a/esphomeyaml/components/sensor/tsl2561.rst b/esphomeyaml/components/sensor/tsl2561.rst index e198e3ab0..11246a748 100644 --- a/esphomeyaml/components/sensor/tsl2561.rst +++ b/esphomeyaml/components/sensor/tsl2561.rst @@ -1,6 +1,11 @@ TSL2561 Ambient Light Sensor ============================ +.. seo:: + :description: Instructions for setting up TSL2561 ambient light sensors in esphomelib. + :image: tsl2561.jpg + :keywords: TSL2561 + The ``tsl2561`` sensor platform allows you to use your TSL2561 (`datasheet `__, `Adafruit`_) diff --git a/esphomeyaml/components/sensor/ultrasonic.rst b/esphomeyaml/components/sensor/ultrasonic.rst index e9b0dde1a..5e543bd41 100644 --- a/esphomeyaml/components/sensor/ultrasonic.rst +++ b/esphomeyaml/components/sensor/ultrasonic.rst @@ -1,6 +1,11 @@ Ultrasonic Distance Sensor ========================== +.. seo:: + :description: Instructions for setting up ultrasonic distance measurement sensors in esphomelib. + :image: ultrasonic.jpg + :keywords: ultrasonic, hc-sr04 + The ultrasonic distance sensor allows you to use simple ultrasonic sensors like the HC-SR04 (`datasheet `__, diff --git a/esphomeyaml/components/sensor/uptime.rst b/esphomeyaml/components/sensor/uptime.rst index 694b9f39a..0fd7a4b82 100644 --- a/esphomeyaml/components/sensor/uptime.rst +++ b/esphomeyaml/components/sensor/uptime.rst @@ -1,6 +1,10 @@ Uptime Sensor ============= +.. seo:: + :description: Instructions for setting up a sensor that tracks the uptime of the ESP. + :image: timer.svg + The ``uptime`` sensor allows you to track the time the ESP has stayed up for in seconds. Time rollovers are automatically handled. diff --git a/esphomeyaml/components/sensor/wifi_signal.rst b/esphomeyaml/components/sensor/wifi_signal.rst index e79ba7d5b..f4ba8e0be 100644 --- a/esphomeyaml/components/sensor/wifi_signal.rst +++ b/esphomeyaml/components/sensor/wifi_signal.rst @@ -1,6 +1,10 @@ WiFi Signal Sensor ================== +.. seo:: + :description: Instructions for setting up WiFi signal sensors that track the RSSI connection strength value to the network. + :image: network-wifi.svg + The ``wifi_signal`` sensor platform allows you to read the signal strength of the currently connected :doc:`WiFi Access Point `. diff --git a/esphomeyaml/components/sensor/xiaomi_miflora.rst b/esphomeyaml/components/sensor/xiaomi_miflora.rst index 3c581b894..a6e41257d 100644 --- a/esphomeyaml/components/sensor/xiaomi_miflora.rst +++ b/esphomeyaml/components/sensor/xiaomi_miflora.rst @@ -1,6 +1,11 @@ Xiaomi MiFlora BLE Sensor ========================= +.. seo:: + :description: Instructions for setting up Xiaomi Mi Flora bluetooth-based plant monitors in esphomelib. + :image: xiaomi_miflora.jpg + :keywords: Xiaomi, Mi Flora, BLE, Bluetooth + The ``xiaomi_miflora`` sensor platform lets you track the output of Xiaomi MiFlora Bluetooth Low Energy devices using the :doc:`/esphomeyaml/components/esp32_ble_tracker`. This component will track the temperature, humidity and optionally the battery level of the MiFlora device every time the sensor diff --git a/esphomeyaml/components/sensor/xiaomi_mijia.rst b/esphomeyaml/components/sensor/xiaomi_mijia.rst index a43fc22c8..6488e0a8f 100644 --- a/esphomeyaml/components/sensor/xiaomi_mijia.rst +++ b/esphomeyaml/components/sensor/xiaomi_mijia.rst @@ -1,6 +1,11 @@ Xiaomi MiJia BLE Sensor ======================= +.. seo:: + :description: Instructions for setting up Xiaomi Mi Jia bluetooth-based temperature and humidity sensors in esphomelib. + :image: xiaomi_miflora.jpg + :keywords: Xiaomi, Mi Jia, BLE, Bluetooth + The ``xiaomi_mijia`` sensor platform lets you track the output of Xiaomi MiJia Bluetooth Low Energy devices using the :doc:`/esphomeyaml/components/esp32_ble_tracker`. This component will track the temperature, humidity and optionally the battery level of the MiJia device every time the sensor diff --git a/esphomeyaml/components/spi.rst b/esphomeyaml/components/spi.rst index 9c1300d64..3c8ef1b2a 100644 --- a/esphomeyaml/components/spi.rst +++ b/esphomeyaml/components/spi.rst @@ -3,6 +3,11 @@ SPI Bus ======= +.. seo:: + :description: Instructions for setting up an SPI bus in esphomelib + :image: spi.svg + :keywords: SPI + SPI is a very common high-speed protocol for a lot of devices. The SPI bus usually consists of 4 wires: - **CLK**: Is used to tell the receiving device when to read data. All devices on the bus can diff --git a/esphomeyaml/components/status_led.rst b/esphomeyaml/components/status_led.rst index b79aa4557..78eecd229 100644 --- a/esphomeyaml/components/status_led.rst +++ b/esphomeyaml/components/status_led.rst @@ -1,6 +1,10 @@ Status LED ========== +.. seo:: + :description: Instructions for setting up status LEDs in esphomelib to monitor the status of an ESP. + :image: led-on.svg + The ``status_led`` hooks into all esphomelib components and can indicate the status of the device. Specifically, it will: diff --git a/esphomeyaml/components/stepper/index.rst b/esphomeyaml/components/stepper/index.rst index a9f0ad839..30270acce 100644 --- a/esphomeyaml/components/stepper/index.rst +++ b/esphomeyaml/components/stepper/index.rst @@ -1,6 +1,11 @@ Stepper Component ================= +.. seo:: + :description: Instructions for setting up stepper motor drivers in esphomelib + :image: folder-open.svg + :keywords: stepper motor, stepper driver, a4988 + The ``stepper`` component allows you to use stepper motors with esphomelib. Currently only the A4988 stepper driver (`datasheet `__) diff --git a/esphomeyaml/components/switch/gpio.rst b/esphomeyaml/components/switch/gpio.rst index 98d93aad4..9de35392a 100644 --- a/esphomeyaml/components/switch/gpio.rst +++ b/esphomeyaml/components/switch/gpio.rst @@ -1,6 +1,10 @@ GPIO Switch =========== +.. seo:: + :description: Instructions for setting up GPIO pin switches in esphomelib that control GPIO outputs. + :image: pin.svg + The ``gpio`` switch platform allows you to use any pin on your node as a switch. You can for example hook up a relay to a GPIO pin and use it through this platform. diff --git a/esphomeyaml/components/switch/index.rst b/esphomeyaml/components/switch/index.rst index 306db0e4c..171fec568 100644 --- a/esphomeyaml/components/switch/index.rst +++ b/esphomeyaml/components/switch/index.rst @@ -1,6 +1,10 @@ Switch Component ================ +.. seo:: + :description: Instructions for setting up generic switches in esphomelib. + :image: folder-open.svg + The ``switch`` domain includes all platforms that should show up like a switch and can only be turned ON or OFF. diff --git a/esphomeyaml/components/switch/output.rst b/esphomeyaml/components/switch/output.rst index 525eef3ed..37019dc9e 100644 --- a/esphomeyaml/components/switch/output.rst +++ b/esphomeyaml/components/switch/output.rst @@ -1,6 +1,10 @@ Generic Output Switch ===================== +.. seo:: + :description: Instructions for setting up generic output switches in esphomelib that control an output component. + :image: upload.svg + The ``output`` switch platform allows you to use any output component as a switch. .. figure:: images/output-ui.png diff --git a/esphomeyaml/components/switch/remote_transmitter.rst b/esphomeyaml/components/switch/remote_transmitter.rst index b15342294..e69196462 100644 --- a/esphomeyaml/components/switch/remote_transmitter.rst +++ b/esphomeyaml/components/switch/remote_transmitter.rst @@ -1,6 +1,11 @@ Remote Transmitter Switch ========================= +.. seo:: + :description: Instructions for setting up switches that send out pre-defined sequences of IR or RF signals + :image: remote.svg + :keywords: Infrared, IR, RF, Remote, TX + The ``remote_transmitter`` switch platform allows you to create switches that send a pre-defined remote control sequence using the :doc:`/esphomeyaml/components/remote_transmitter`. Every time diff --git a/esphomeyaml/components/switch/restart.rst b/esphomeyaml/components/switch/restart.rst index 2600f4dd8..50bb79b5f 100644 --- a/esphomeyaml/components/switch/restart.rst +++ b/esphomeyaml/components/switch/restart.rst @@ -1,6 +1,10 @@ Restart Switch ============== +.. seo:: + :description: Instructions for setting up switches that can remotely reboot the ESP in esphomelib. + :image: restart.svg + The ``restart`` switch platform allows you to restart your node remotely through Home Assistant. diff --git a/esphomeyaml/components/switch/shutdown.rst b/esphomeyaml/components/switch/shutdown.rst index 3864cd1c8..2dfc44953 100644 --- a/esphomeyaml/components/switch/shutdown.rst +++ b/esphomeyaml/components/switch/shutdown.rst @@ -1,6 +1,10 @@ Shutdown Switch =============== +.. seo:: + :description: Instructions for setting up switches that can remotely shut down the ESP. + :image: power_settings.svg + The ``shutdown`` switch platform allows you to shutdown your node remotely through Home Assistant. It does this by putting the node into deep sleep mode with no wakeup source selected. After enabling, the only way to startup the ESP again is by diff --git a/esphomeyaml/components/switch/template.rst b/esphomeyaml/components/switch/template.rst index 1d2a0a05d..b4d429e3c 100644 --- a/esphomeyaml/components/switch/template.rst +++ b/esphomeyaml/components/switch/template.rst @@ -1,6 +1,10 @@ Template Switch =============== +.. seo:: + :description: Instructions for setting up template switches that can execute arbitrary actions when turned on or off. + :image: description.svg + The ``template`` switch platform allows you to create simple switches out of just actions and an optional value lambda. Once defined, it will automatically appear in Home Assistant as a switch and can be controlled through the frontend. @@ -11,7 +15,7 @@ as a switch and can be controlled through the frontend. switch: - platform: template name: "Template Switch" - lambda: >- + lambda: |- if (id(some_binary_sensor).state) { return true; } else { diff --git a/esphomeyaml/components/switch/uart.rst b/esphomeyaml/components/switch/uart.rst index 0d4d69baf..02883b515 100644 --- a/esphomeyaml/components/switch/uart.rst +++ b/esphomeyaml/components/switch/uart.rst @@ -1,6 +1,10 @@ UART Switch =========== +.. seo:: + :description: Instructions for setting up UART switches in esphomelib that can output arbitrary UART sequences when activated. + :image: uart.svg + The ``uart`` switch platform allows you to send a pre-defined sequence of bytes on a :doc:`UART bus ` when triggered. diff --git a/esphomeyaml/components/text_sensor/index.rst b/esphomeyaml/components/text_sensor/index.rst index 54e23fb3c..10005d2c1 100644 --- a/esphomeyaml/components/text_sensor/index.rst +++ b/esphomeyaml/components/text_sensor/index.rst @@ -1,6 +1,10 @@ Text Sensor Component ===================== +.. seo:: + :description: Instructions for setting up text sensors that represent their state as a string of text. + :image: folder-open.svg + Text sensors are a lot like normal :doc:`sensors `. But where the "normal" sensors only represent sensors that output **numbers**, this component can represent any *text*. diff --git a/esphomeyaml/components/text_sensor/mqtt_subscribe.rst b/esphomeyaml/components/text_sensor/mqtt_subscribe.rst index 9ff2b6456..e94b1ab8b 100644 --- a/esphomeyaml/components/text_sensor/mqtt_subscribe.rst +++ b/esphomeyaml/components/text_sensor/mqtt_subscribe.rst @@ -1,6 +1,11 @@ MQTT Subscribe Text Sensor ========================== +.. seo:: + :description: Instructions for setting up MQTT Subscribe text sensors that show the content of a MQTT message as their state. + :image: mqtt.png + :keywords: MQTT + The ``mqtt_subscribe`` text sensor platform allows you to get external data into esphomelib. The sensor will subscribe to messages on the given MQTT topic and save the most recent value in its ``id(mysensor).value``. diff --git a/esphomeyaml/components/text_sensor/template.rst b/esphomeyaml/components/text_sensor/template.rst index 30b56eeac..c24bd19ad 100644 --- a/esphomeyaml/components/text_sensor/template.rst +++ b/esphomeyaml/components/text_sensor/template.rst @@ -1,6 +1,10 @@ Template Text Sensor ==================== +.. seo:: + :description: Instructions for setting up template text sensors in esphomelib + :image: description.svg + The ``template`` text sensor platform allows you to create a text sensor with templated values using :ref:`lambdas `. diff --git a/esphomeyaml/components/text_sensor/version.rst b/esphomeyaml/components/text_sensor/version.rst index 2bff668fc..b6e6479b7 100644 --- a/esphomeyaml/components/text_sensor/version.rst +++ b/esphomeyaml/components/text_sensor/version.rst @@ -1,6 +1,10 @@ Version Text Sensor =================== +.. seo:: + :description: Instructions for setting up version text sensors. + :image: new-box.svg + The ``version`` text sensor platform exposes the esphomelib version the firmware was compiled against as a text sensor. diff --git a/esphomeyaml/components/time.rst b/esphomeyaml/components/time.rst index 9a118b6f7..0cdfa8859 100644 --- a/esphomeyaml/components/time.rst +++ b/esphomeyaml/components/time.rst @@ -3,6 +3,11 @@ Time ==== +.. seo:: + :description: Instructions for setting up real time clock sources in esphomelib like network based time. + :image: clock-outline.svg + :keywords: NTP, SNTP, RTC + The ``time`` component allows you to set up real time clock time sources for esphomelib. You can then get the current time in :ref:`lambdas `. Currently only sntp (internet-based) time is supported. diff --git a/esphomeyaml/components/uart.rst b/esphomeyaml/components/uart.rst index 4d71ac169..796104f86 100644 --- a/esphomeyaml/components/uart.rst +++ b/esphomeyaml/components/uart.rst @@ -3,6 +3,11 @@ UART Bus ======== +.. seo:: + :description: Instructions for setting up a UART serial bus on ESPs + :image: uart.svg + :keywords: UART, serial bus + UART is a common serial protocol for a lot of devices. For example, when uploading a binary to your ESP you have probably used UART to access the chip. UART (or for Arduino often also called Serial) usually consists of 2 pins: diff --git a/esphomeyaml/components/web_server.rst b/esphomeyaml/components/web_server.rst index e6997eba4..768c36084 100644 --- a/esphomeyaml/components/web_server.rst +++ b/esphomeyaml/components/web_server.rst @@ -1,6 +1,11 @@ Web Server Component ==================== +.. seo:: + :description: Instructions for setting up a web server in esphomelib. + :image: http.svg + :keywords: web server, http, REST API + The ``web_server`` component creates a simple web server on the node that can be accessed through any browser and a simple `REST API`_. Please note that enabling this component will take up *a lot* of memory and can lead to problems, especially on the ESP8266. diff --git a/esphomeyaml/components/wifi.rst b/esphomeyaml/components/wifi.rst index 36f080311..59e5b4ab8 100644 --- a/esphomeyaml/components/wifi.rst +++ b/esphomeyaml/components/wifi.rst @@ -1,6 +1,11 @@ WiFi Component ============== +.. seo:: + :description: Instructions for setting up the WiFi configuration for your ESP node in esphomelib. + :image: network-wifi.svg + :keywords: WiFi, WLAN, ESP8266, ESP32 + This core esphomelib component sets up WiFi connections to access points for you. It needs to be in your configuration or otherwise esphomeyaml will fail in the config validation stage. diff --git a/esphomeyaml/cookbook/bruh.rst b/esphomeyaml/cookbook/bruh.rst index ece6f6f18..775bab2eb 100644 --- a/esphomeyaml/cookbook/bruh.rst +++ b/esphomeyaml/cookbook/bruh.rst @@ -1,6 +1,10 @@ BRUH Multisensor ================ +.. seo:: + :description: Instructions for re-creating a BRUH multisensor using esphomelib. + :image: bruh.png + The BRUH Multisensor is a great introductory project into Home Automation with an amazing setup tutorial. And fortunately esphomelib has complete support for all the stuff used by the Multisensor 🎉 diff --git a/esphomeyaml/cookbook/dual-r2-cover.rst b/esphomeyaml/cookbook/dual-r2-cover.rst index cbabc1b3e..4a21c6921 100644 --- a/esphomeyaml/cookbook/dual-r2-cover.rst +++ b/esphomeyaml/cookbook/dual-r2-cover.rst @@ -1,6 +1,11 @@ Dual relay cover motor control ============================== +.. seo:: + :description: An example of how to integrate covers that are controlled by two relays into esphomelib. + :image: sonoff_dual_r2.jpg + :keywords: Relay, Sonoff Dual R2, Cover + The following is a possible configuration file for common covers that use a motor with 2 inputs. Only one should be powered at a time (interlocking) to either move the cover up or down. For this the `Sonoff Dual R2 `__ can be used which has two independent diff --git a/esphomeyaml/cookbook/garage-door.rst b/esphomeyaml/cookbook/garage-door.rst index bb108e16d..98f0b4596 100644 --- a/esphomeyaml/cookbook/garage-door.rst +++ b/esphomeyaml/cookbook/garage-door.rst @@ -1,6 +1,10 @@ Simple Garage Door ================== +.. seo:: + :description: Instructions for setting up a simple garage door in esphomelib. + :image: window-open.svg + The following is a possible configuration file for garage doors that are controlled by two relays: One for opening and another one for closing the garage door. When either one of them is turned on for a short period of time, the close/open action begins. diff --git a/esphomeyaml/cookbook/pir.rst b/esphomeyaml/cookbook/pir.rst index 78b4fb239..186dceb4e 100644 --- a/esphomeyaml/cookbook/pir.rst +++ b/esphomeyaml/cookbook/pir.rst @@ -1,6 +1,11 @@ Passive Infrared Sensor ======================= +.. seo:: + :description: Instructions for setting up PIR (passive infrared) motion detection sensors in esphomelib + :image: pir.jpg + :keywords: PIR + .. figure:: images/pir-header.jpg :align: center :width: 75.0% diff --git a/esphomeyaml/cookbook/power_meter.rst b/esphomeyaml/cookbook/power_meter.rst index ad8afca6a..31ef0904e 100644 --- a/esphomeyaml/cookbook/power_meter.rst +++ b/esphomeyaml/cookbook/power_meter.rst @@ -1,6 +1,10 @@ Non-Invasive Power Meter ======================== +.. seo:: + :description: Instructions for hacking your power meter at home to measure your power usage. + :image: power_meter.jpg + So an essential part of making your home smart is knowing how much power it uses over the day. Tracking this can be difficult, often you need to install a completely new power meter which can often cost a bunch of money. However, quite a few power meters diff --git a/esphomeyaml/cookbook/relay.rst b/esphomeyaml/cookbook/relay.rst index 39d8ae347..efd828f05 100644 --- a/esphomeyaml/cookbook/relay.rst +++ b/esphomeyaml/cookbook/relay.rst @@ -1,6 +1,11 @@ Relay ===== +.. seo:: + :description: Instructions for using relays in esphomelib. + :image: relay.jpg + :keywords: Relay + .. figure:: images/relay-full.jpg :align: center :width: 80.0% diff --git a/esphomeyaml/cookbook/temt6000.rst b/esphomeyaml/cookbook/temt6000.rst index 749f0aa54..b904d34f5 100644 --- a/esphomeyaml/cookbook/temt6000.rst +++ b/esphomeyaml/cookbook/temt6000.rst @@ -1,6 +1,11 @@ TEMT6000 ======== +.. seo:: + :description: Instructions for setting up TEMT6000 ambient light sensors in esphomelib using the ADC sensor component. + :image: temt6000.jpg + :keywords: TEMT6000 + The TEMT6000 is a simple and cheap ambient light sensor. The sensor itself changes its resistance based on how much light hits the sensor. In order for us to read this resistance the breakout boards you can buy these chips on diff --git a/esphomeyaml/devices/esp32.rst b/esphomeyaml/devices/esp32.rst index 7ab887790..4c08c0fba 100644 --- a/esphomeyaml/devices/esp32.rst +++ b/esphomeyaml/devices/esp32.rst @@ -1,6 +1,10 @@ Generic ESP32 ============= +.. seo:: + :description: Information about how to use generic ESP32 boards in esphomelib. + :image: esp32.svg + All ESP32-based devices are supported by esphomeyaml. Simply select ``ESP32`` when the esphomeyaml wizard asks you for your platform and choose a board type from `this link `__ when the wizard diff --git a/esphomeyaml/devices/esp8266.rst b/esphomeyaml/devices/esp8266.rst index 274029edd..44c269ffd 100644 --- a/esphomeyaml/devices/esp8266.rst +++ b/esphomeyaml/devices/esp8266.rst @@ -1,6 +1,11 @@ Generic ESP8266 =============== +.. seo:: + :description: Instructions for using generic ESP8266s with esphomelib. + :image: esp8266.svg + :keywords: ESP8266 + All ESP8266-based devices are supported by esphomeyaml. Simply select ``ESP8266`` when the esphomeyaml wizard asks you for your platform and choose a board type from `this link `__ when the wizard diff --git a/esphomeyaml/devices/nodemcu_esp32.rst b/esphomeyaml/devices/nodemcu_esp32.rst index e8a6c9a9f..9b6e71c27 100644 --- a/esphomeyaml/devices/nodemcu_esp32.rst +++ b/esphomeyaml/devices/nodemcu_esp32.rst @@ -1,6 +1,10 @@ NodeMCU ESP32 ============= +.. seo:: + :description: Instructions for using NodeMCU ESP32 boards in esphomelib and a description of all their pins and uses. + :image: nodemcu_esp32.jpg + The NodeMCU ESP32 board (in some cases also known as ESP32-DevkitC) is fully supported by esphomeyaml. Simply select ``ESP32`` when the esphomeyaml wizard asks you for your platform and |nodemcu-32s|_ as the board type. diff --git a/esphomeyaml/devices/nodemcu_esp8266.rst b/esphomeyaml/devices/nodemcu_esp8266.rst index 61a830ab7..46434babf 100644 --- a/esphomeyaml/devices/nodemcu_esp8266.rst +++ b/esphomeyaml/devices/nodemcu_esp8266.rst @@ -1,6 +1,11 @@ NodeMCU ESP8266 =============== +.. seo:: + :description: Instructions for using nodemcu ESP8266 boards in esphomelib together with a description of their pins and uses. + :image: nodemcu_esp8266.jpg + :keywords: NodeMCU, ESP8266 + The NodeMCU board is fully supported by esphomeyaml. Simply select ``ESP8266`` when the esphomeyaml wizard asks you for your platform and |nodemcuv2|_ as the board type. diff --git a/esphomeyaml/devices/sonoff.rst b/esphomeyaml/devices/sonoff.rst index 78302a0f3..e1aba6319 100644 --- a/esphomeyaml/devices/sonoff.rst +++ b/esphomeyaml/devices/sonoff.rst @@ -1,6 +1,10 @@ Generic Sonoff ============== +.. seo:: + :description: Instructions for using generic Sonoff devices with esphomelib. + :image: sonoff.svg + In principle esphomelib supports all Sonoff devices, but as these devices are quite expensive and shipping from China takes a long time, I've only set up dedicated guides for the :doc:`Sonoff S20 ` and :doc:`Sonoff 4CH `. diff --git a/esphomeyaml/devices/sonoff_4ch.rst b/esphomeyaml/devices/sonoff_4ch.rst index ce1f03202..0a30b7170 100644 --- a/esphomeyaml/devices/sonoff_4ch.rst +++ b/esphomeyaml/devices/sonoff_4ch.rst @@ -1,6 +1,10 @@ Using With Sonoff 4CH ===================== +.. seo:: + :description: Instructions for putting Sonoff 4CH devices into flash mode and installing esphomelib on them. + :image: sonoff_4ch.jpg + esphomeyaml can also be used with Sonoff 4CH wireless switches. These devices are basically just an ESP8266 chip with 4 relays to control power output, a few buttons on the top and a few status LEDs. diff --git a/esphomeyaml/devices/sonoff_basic.rst b/esphomeyaml/devices/sonoff_basic.rst index 2aeb48434..3f5b56610 100644 --- a/esphomeyaml/devices/sonoff_basic.rst +++ b/esphomeyaml/devices/sonoff_basic.rst @@ -1,6 +1,10 @@ Using With Sonoff Basic ======================= +.. seo:: + :description: Instructions for putting Sonoff basic devices into flash mode and installing esphomelib on them. + :image: sonoff_basic.jpg + esphomeyaml can be used with Sonoff Basic. These devices are basically just an ESP8266 chip with a relay to control the connection, a small button on the front and a green LED light. diff --git a/esphomeyaml/devices/sonoff_s20.rst b/esphomeyaml/devices/sonoff_s20.rst index d002c5f5a..349b7481c 100644 --- a/esphomeyaml/devices/sonoff_s20.rst +++ b/esphomeyaml/devices/sonoff_s20.rst @@ -1,6 +1,10 @@ Using With Sonoff S20 ===================== +.. seo:: + :description: Instructions for putting Sonoff S20 devices into flash mode and installing esphomelib on them. + :image: sonoff_s20.jpg + esphomeyaml can also be used with Sonoff S20 smart sockets. These devices are basically just an ESP8266 chip with a relay to control the socket, a small button on the front and a blue and green LED light. diff --git a/esphomeyaml/guides/automations.rst b/esphomeyaml/guides/automations.rst index 153f5ad2f..75a2f20bc 100644 --- a/esphomeyaml/guides/automations.rst +++ b/esphomeyaml/guides/automations.rst @@ -3,6 +3,10 @@ Automations And Templates ========================= +.. seo:: + :description: Getting started guide for automations in esphomelib. + :image: auto-fix.svg + Automations and templates are two very powerful concepts of esphomelib/yaml. Automations allow you to perform actions under certain conditions and templates are a way to easily customize everything about your node without having to dive into the full esphomelib C++ diff --git a/esphomeyaml/guides/cli.rst b/esphomeyaml/guides/cli.rst index 3b2e1db71..9df0df204 100644 --- a/esphomeyaml/guides/cli.rst +++ b/esphomeyaml/guides/cli.rst @@ -1,6 +1,9 @@ Command Line Interface ====================== +.. seo:: + :description: Documentation for the command line interface of esphomelib. + Base Usage ---------- diff --git a/esphomeyaml/guides/configuration-types.rst b/esphomeyaml/guides/configuration-types.rst index f19a2e2cf..5186693a6 100644 --- a/esphomeyaml/guides/configuration-types.rst +++ b/esphomeyaml/guides/configuration-types.rst @@ -1,6 +1,10 @@ Configuration Types =================== +.. seo:: + :description: Documentation of different configuration types in esphomelib + :image: settings.svg + esphomeyaml’s configuration files have several configuration types. This page describes them. diff --git a/esphomeyaml/guides/contributing.rst b/esphomeyaml/guides/contributing.rst index 7dbcedae7..7c82acdd0 100644 --- a/esphomeyaml/guides/contributing.rst +++ b/esphomeyaml/guides/contributing.rst @@ -1,6 +1,10 @@ Contributing ============ +.. seo:: + :description: Getting started guide for contributing to the esphomelib project + :image: github-circle.svg + Contributions to the esphomelib suite are very welcome! All the code for the projects is hosted on GitHub and you can find the sources here: diff --git a/esphomeyaml/guides/faq.rst b/esphomeyaml/guides/faq.rst index 2a75ef833..8b40963ee 100644 --- a/esphomeyaml/guides/faq.rst +++ b/esphomeyaml/guides/faq.rst @@ -1,6 +1,10 @@ Frequently Asked Questions ========================== +.. seo:: + :description: Frequently asked questions in esphomelib. + :image: question_answer.svg + Tips for using esphomeyaml -------------------------- diff --git a/esphomeyaml/guides/getting_started_command_line.rst b/esphomeyaml/guides/getting_started_command_line.rst index c38549c24..3dc007de1 100644 --- a/esphomeyaml/guides/getting_started_command_line.rst +++ b/esphomeyaml/guides/getting_started_command_line.rst @@ -1,6 +1,10 @@ Getting Started with esphomeyaml ================================ +.. seo:: + :description: Getting Started guide for installing esphomeyaml using the command line and creating a basic configuration. + :image: console.svg + esphomeyaml is the perfect solution for creating custom firmwares for your ESP8266/ESP32 boards. In this guide we’ll go through how to setup a basic “node” in a few simple steps. diff --git a/esphomeyaml/guides/getting_started_hassio.rst b/esphomeyaml/guides/getting_started_hassio.rst index 211eb0ece..677e91b77 100644 --- a/esphomeyaml/guides/getting_started_hassio.rst +++ b/esphomeyaml/guides/getting_started_hassio.rst @@ -1,6 +1,10 @@ Getting Started with esphomeyaml through HassIO =============================================== +.. seo:: + :description: Getting Started guide for installing esphomeyaml as a HassIO Add-on and creating a basic configuration. + :image: home-assistant.svg + esphomeyaml is the perfect solution for creating custom firmwares for your ESP8266/ESP32 boards. In this guide we’ll go through how to setup a basic "node" by use of the HassIO add-on. diff --git a/esphomeyaml/guides/migrate_espeasy.rst b/esphomeyaml/guides/migrate_espeasy.rst index eda44ba0b..d86a881d8 100644 --- a/esphomeyaml/guides/migrate_espeasy.rst +++ b/esphomeyaml/guides/migrate_espeasy.rst @@ -1,6 +1,10 @@ Migrating from ESPEasy ====================== +.. seo:: + :description: Migration guide for installing esphomelib on ESPs running ESPEasy. + :image: espeasy.svg + Migrating from previous ESPEasy setups is very easy. You just need to have esphomeyaml create a binary for you and then upload that in the ESPEasy web interface. diff --git a/esphomeyaml/guides/migrate_espurna.rst b/esphomeyaml/guides/migrate_espurna.rst index 99c9f1b01..1feb3bf3d 100644 --- a/esphomeyaml/guides/migrate_espurna.rst +++ b/esphomeyaml/guides/migrate_espurna.rst @@ -1,6 +1,10 @@ Migrating from ESPurna ====================== +.. seo:: + :description: Migration guide for installing esphomelib on ESPs running ESPurna. + :image: espurna.svg + Migrating from previous ESPurna setups is very easy. You just need to have esphomeyaml create a binary for you and then upload that in the ESPurna web interface. diff --git a/esphomeyaml/guides/migrate_sonoff_tasmota.rst b/esphomeyaml/guides/migrate_sonoff_tasmota.rst index 65c980994..457d31c45 100644 --- a/esphomeyaml/guides/migrate_sonoff_tasmota.rst +++ b/esphomeyaml/guides/migrate_sonoff_tasmota.rst @@ -1,6 +1,10 @@ Migrating from Sonoff Tasmota ============================= +.. seo:: + :description: Migration guide for installing esphomelib on ESPs running Sonoff Tasmota. + :image: tasmota.svg + Migrating from previous Sonoff Tasmota setups is very easy. You just need to have esphomeyaml create a binary for you and then upload that in the Tasmota web interface. diff --git a/esphomeyaml/images/download.svg b/esphomeyaml/images/download.svg new file mode 100644 index 000000000..67c94404a --- /dev/null +++ b/esphomeyaml/images/download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/esphomeyaml/images/esphomeyaml-logo-full.svg b/esphomeyaml/images/esphomeyaml-logo-full.svg new file mode 100644 index 000000000..7a07949ca --- /dev/null +++ b/esphomeyaml/images/esphomeyaml-logo-full.svg @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/esphomeyaml/images/logo-full.svg b/esphomeyaml/images/logo-full.svg new file mode 100644 index 000000000..9b29bb533 --- /dev/null +++ b/esphomeyaml/images/logo-full.svg @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/esphomeyaml/images/puzzle.svg b/esphomeyaml/images/puzzle.svg new file mode 100644 index 000000000..1ed0d45f4 --- /dev/null +++ b/esphomeyaml/images/puzzle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/esphomeyaml/index.rst b/esphomeyaml/index.rst index 60fdb97e6..25fe047f2 100644 --- a/esphomeyaml/index.rst +++ b/esphomeyaml/index.rst @@ -1,38 +1,19 @@ esphomeyaml =========== +.. image:: images/esphomeyaml-logo-full.svg + +.. seo:: + :description: esphomeyaml Component index - Reimagining DIY Home Automation + :image: /_static/logo-full.png + .. raw:: html GitHub stars Release Discord Chat -Hi there! This is the documentation for esphomeyaml, a project that aims to make using ESP8266/ESP32 boards with -Home Assistant very easy with no programming experience required. - -esphomeyaml will: - - * Read your configuration file and warn you about potential errors (like using the invalid pins.) - * Create a custom C++ sketch file for you using esphomeyaml's powerful C++ generation engine. - * Compile the sketch file for you using `platformio `__. - * Upload the binary to your ESP via Over the Air updates. - * Automatically start remote logs via MQTT. - - -Features --------- - - * **No programming experience required:** just edit YAML configuration - files like you're used to with Home Assistant. - * **Flexible:** Use `esphomelib `__'s powerful core to create custom sensors/outputs. - * **Fast and efficient:** Written in C++ and keeps memory consumption to a minimum. - * **Small binaries:** Only the sensors/devices you actually use will appear in the binary. - * **Made for Home Assistant:** Almost all Home Assistant features are supported out of the box. Including RGB lights and many more. - * **Easy reproducible configuration:** No need to go through a long setup process for every single node. Just copy a configuration file and run a single command. - * **Smart Over The Air Updates:** esphomeyaml has OTA updates deeply integrated into the system. It even automatically enters a recovery mode if a boot loop is detected. - * **Powerful logging engine:** View colorful logs and debug issues remotely. - * **It's Open Source 😺** - +.. _guides: Guides ------ diff --git a/github.py b/github.py index efb19b398..181783a57 100644 --- a/github.py +++ b/github.py @@ -63,10 +63,10 @@ class ImageTableDirective(Table): continue name, page, image = row link = page.strip() - if not link.startswith('http'): + if not link.startswith('http') and not link.startswith('/'): link = '/esphomeyaml/{}'.format(link) - if '.html' not in link: - link += '.html' + if '.html' not in link: + link += '.html' items.append({ 'name': name.strip(), 'link': link, @@ -100,7 +100,7 @@ class ImageTableDirective(Table): link = cell['link'] image = cell['image'] reference_node = nodes.reference(refuri=link) - img = nodes.image(uri=directives.uri(image)) + img = nodes.image(uri=directives.uri(image), alt=name) img['classes'].append('component-image') reference_node += img para = nodes.paragraph() diff --git a/index.rst b/index.rst index cab53b479..44bdf5391 100644 --- a/index.rst +++ b/index.rst @@ -1,33 +1,57 @@ -esphomelib API Reference -======================== +esphomelib +========== -Welcome to the esphomelib API docs! ------------------------------------ +.. seo:: + :description: esphomeyaml Homepage - Reimagining DIY Home Automation + :image: /_static/logo-full.png -esphomeyaml docs can be found here: `esphomeyaml docs`_. +.. image:: /esphomeyaml/images/logo-full.svg -Here you will find all of esphomelib's API documentation together with some examples. +What is esphomelib? +------------------- -Eventually, guides will also be setup here on how to create your own custom components and some basic stuff. +Esphomelib is a framework for creating custom firmwares for your WiFi-enabled +ESP microcontrollers. Its primary focus is making the process to get your ESP +running as simple as possible, with many helper tools to ensure you will have the +best user experience. -.. _esphomeyaml docs: /esphomeyaml/index.html +Esphomelib is split up into two main parts: esphomelib, the C++ framework backing the entire +framework, and esphomeyaml, a tool that automatically creates firmwares for you just +from simple configuration files - so **no programming experience required**! -Web Server API --------------- +.. imgtable:: -See `Web Server API`_ for documentation of the web server REST API. + Esphomeyaml Component Index, /esphomeyaml/index, logo.svg + Getting Started, /esphomeyaml/index.html#guides, download.svg + Esphomelib API Reference, /api/index, puzzle.svg -.. _Web Server API: /web-api/index.html +esphomeyaml will: + + * Read your configuration file and warn you about potential errors (like using the invalid pins.) + * Create a custom C++ sketch file for you using esphomeyaml's powerful C++ generation engine. + * Compile the sketch file for you using `platformio `__. + * Upload the binary to your ESP via Over the Air updates. + * If you're using `Home Assistant `__, esphomelib + will automatically add all components to the home assistant UI. + +Features +-------- + + * **No programming experience required:** just edit YAML configuration files like you're used to with Home Assistant. + * **Smart:** + * **Fast and efficient:** Written in C++ and keeps memory consumption to a minimum. + * **Small binaries:** Only the sensors/devices you actually use will appear in the binary. + * **Made for Home Assistant:** Almost all Home Assistant features are supported out of the box. Including RGB lights and many more. + * **Powerful logging engine:** View colorful logs and debug issues remotely. + * **Automations:** Using esphomeyaml's :ref:`automation engine `, you can have automations run on the ESP + with an intuitive script syntax. + * **Flexible:** Use `esphomelib `__'s powerful core to create custom sensors/outputs. + * **It's Open Source 😺** -Indices and tables -================== .. toctree:: - :maxdepth: 2 + :hidden: esphomeyaml/index web-api/index api/index - -* :ref:`genindex` -* :ref:`search` diff --git a/seo.py b/seo.py new file mode 100644 index 000000000..95c8109e7 --- /dev/null +++ b/seo.py @@ -0,0 +1,108 @@ +import re + +from docutils import nodes +from docutils.parsers.rst import Directive, directives +from docutils.writers._html_base import HTMLTranslator + + +class SEONode(nodes.General, nodes.Element): + def __init__(self, title=None, description=None, image=None, + author=None, author_twitter=None, keywords=None): + super(SEONode, self).__init__() + self.title = title + self.description = description + self.image = image + self.author = author + self.author_twitter = author_twitter + self.keywords = keywords + + +def seo_visit(self: HTMLTranslator, node: SEONode): + def encode_text(text): + special_characters = {ord('&'): '&', + ord('<'): '<', + ord('"'): '"', + ord('>'): '>'} + return text.translate(special_characters) + + def create_content_meta(name, content): + if content is None: + return + self.meta.append('\n'.format(name, encode_text(content))) + + def create_itemprop_meta(name, content): + if content is None: + return + self.meta.append('\n'.format(name, encode_text(content))) + + def create_property_meta(name, content): + if content is None: + return + self.meta.append('\n'.format(name, encode_text(content))) + + # Base + create_content_meta("description", node.description) + create_content_meta("keywords", node.keywords) + + # Schema.org + create_itemprop_meta("name", node.title) + create_itemprop_meta("description", node.description) + create_itemprop_meta("image", node.image) + + # Twitter + create_content_meta("twitter:title", node.title) + create_content_meta("twitter:image:src", node.image) + create_content_meta("twitter:card", "summary_large_image") + create_content_meta("twitter:site", "@OttoWinter_") + create_content_meta("twitter:creator", node.author_twitter) + create_content_meta("twitter:description", node.description) + + # Open Graph + create_property_meta("og:title", node.title) + create_property_meta("og:image", node.image) + create_property_meta("og:type", "article" if node.author is not None else "website") + create_property_meta("og:site_name", "esphomelib") + create_property_meta("og:description", node.description) + + # Misc + create_content_meta("HandheldFriendly", "True") + create_content_meta("MobileOptimized", "320") + create_content_meta("theme-color", "#DFDFDF") + + +def seo_depart(self, _): + pass + + +class SEODirective(Directive): + option_spec = { + 'title': directives.unchanged, + 'description': directives.unchanged, + 'image': directives.path, + 'author': directives.unchanged, + 'author_twitter': directives.unchanged, + 'keywords': directives.unchanged, + } + + def run(self): + env = self.state.document.settings.env + title_match = re.match(r'.+(.+).+', str(self.state.document)) + if title_match is not None and 'title' not in self.options: + self.options['title'] = title_match.group(1) + + image = self.options.get('image') + if image is not None: + if not image.startswith('/'): + image = '/_images/' + image + self.options['image'] = env.config.html_baseurl + image + description = self.options.get('description') + if description is not None and len(description) >= 200: + self.options['description'] = description[:200].rsplit(' ', 1)[0] + '...' + + return [SEONode(**self.options)] + + +def setup(app): + app.add_directive('seo', SEODirective) + app.add_node(SEONode, html=(seo_visit, seo_depart)) + return {'version': '1.0'} diff --git a/web-api/index.rst b/web-api/index.rst index 0d9675e2e..a32133065 100644 --- a/web-api/index.rst +++ b/web-api/index.rst @@ -1,6 +1,10 @@ Web Server API ============== +.. seo:: + :description: Migration guide for installing esphomelib on ESPs running ESPEasy. + :image: espeasy.svg + Since version 1.3, esphomelib includes a built-in web server that can be used to view states and send commands. In addition to visible the web-frontend available under the root index of the web server, there's also two other features the web server currently offers: A real time event