From fef91d48d918e54137967185604b4995d4e055e5 Mon Sep 17 00:00:00 2001 From: rlowens <35885181+rlowens@users.noreply.github.com> Date: Sat, 19 Oct 2019 12:21:24 -0600 Subject: [PATCH 1/8] Hint how to include HA secrets.yaml instead (#362) * Hint how to include HA secrets.yaml instead * Moved tip to its own section * Formatting * formatting --- guides/faq.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/guides/faq.rst b/guides/faq.rst index 6ef2c8e2c..64898b746 100644 --- a/guides/faq.rst +++ b/guides/faq.rst @@ -177,6 +177,18 @@ To install the dev version of ESPHome: The latest dev docs are here: `next.esphome.io `__ +How do I use my Home Assistant secrets.yaml? +-------------------------------------------- + +If you want to keep all your secrets in one place, make a ``secrets.yaml`` file in the +esphome directory with these contents (so it pulls in the contents of your main Home Assistant +``secrets.yaml`` file from one directory higher): + +.. code-block:: yaml + + <<: !include ../secrets.yaml + + Does ESPHome support [this device/feature]? ------------------------------------------- From b52828f634b540a42b008c3d55535c411144da84 Mon Sep 17 00:00:00 2001 From: Mauricio Bonani Date: Sat, 19 Oct 2019 16:05:40 -0400 Subject: [PATCH 2/8] Fix typo (#352) --- guides/automations.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/automations.rst b/guides/automations.rst index ce4a309bd..2dcda1d3e 100644 --- a/guides/automations.rst +++ b/guides/automations.rst @@ -333,7 +333,7 @@ All Actions - :ref:`delay ` - :ref:`lambda ` -- :ref:`if ` / :ref:`while ` / :ref:`wait_util ` +- :ref:`if ` / :ref:`while ` / :ref:`wait_until ` - :ref:`component.update ` - :ref:`script.execute ` / :ref:`script.stop ` - :ref:`logger.log ` From 6fa87d7ead1a94f553efc82f32761c8a791a0294 Mon Sep 17 00:00:00 2001 From: Danny Sauer Date: Sat, 19 Oct 2019 15:06:34 -0500 Subject: [PATCH 3/8] Minor typo (#349) Missing "r" on "lower" --- guides/contributing.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/contributing.rst b/guides/contributing.rst index 70a0bbff6..471ec453e 100644 --- a/guides/contributing.rst +++ b/guides/contributing.rst @@ -559,7 +559,7 @@ Standard for the esphome-core codebase: - function, method and variable names are ``lower_snake_case`` - class/struct/enum names should be ``UpperCamelCase`` - constants should be ``UPPER_SNAKE_CASE`` - - fields should be ``protected`` and ``lowe_snake_case_with_trailing_underscore_`` (DO NOT use private) + - fields should be ``protected`` and ``lower_snake_case_with_trailing_underscore_`` (DO NOT use private) - It's preferred to use long variable/function names over short and non-descriptive ones. - All uses of class members and member functions should be prefixed with ``this->`` to distinguish them from global functions in code review. From 641fd161a3f5f47a45aeaa5c443a04dd7fe711ad Mon Sep 17 00:00:00 2001 From: Justahobby01 <44276845+Justahobby01@users.noreply.github.com> Date: Sat, 19 Oct 2019 15:07:30 -0500 Subject: [PATCH 4/8] Clarify NodeMCU ESP8266 VIN pin (#340) ``VIN``: This pin can be used to use an external power supply with the board. Supply a voltage from 3.3V to 12V to this pin and the linear voltage regulator on the board will power the board. changed for more clarity to: ``VIN``: This board can be powered by an external power supply by using this pin. Supply a voltage between 3.3V to 12V to this pin and the linear voltage regulator on the board will power the board. --- devices/nodemcu_esp8266.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devices/nodemcu_esp8266.rst b/devices/nodemcu_esp8266.rst index fb6776680..7e3397197 100644 --- a/devices/nodemcu_esp8266.rst +++ b/devices/nodemcu_esp8266.rst @@ -49,7 +49,7 @@ Note that in certain conditions you *can* use the pins marked as ``INTERNAL`` in not be pulled low on startup. You can, however, still use them as output pins. - ``A0``: This pin can be used as a normal GPIO pin (like ``D1`` etc) but additionally can measure voltages from 0 to 1.0V using the :doc:`/components/sensor/adc`. -- ``VIN``: This pin can be used to use an external power supply with the board. Supply a voltage from +- ``VIN``: This board can be powered by an external power supply by using this pin. Supply a voltage between 3.3V to 12V to this pin and the linear voltage regulator on the board will power the board. - ``ENABLE``/``RESET``: When these pins are triggered, the board resets. The difference between the pins is how they can handle voltages above 3.3V. From 9220e764523731f10ee5dea15007c640933e507f Mon Sep 17 00:00:00 2001 From: Dale Higgs Date: Sat, 19 Oct 2019 15:15:45 -0500 Subject: [PATCH 5/8] Add TorchStar LED controller to 'Generic Sonoff' page (#351) * Add TorchStar LED controller to devices * Lint --- devices/sonoff.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/devices/sonoff.rst b/devices/sonoff.rst index 60505c0c9..2bc8a36d4 100644 --- a/devices/sonoff.rst +++ b/devices/sonoff.rst @@ -355,6 +355,19 @@ Teckin SP20 (US) See :doc:`/components/sensor/hlw8012` for measuring power. Example config: `teckin_sp20_us.yaml `__ +TorchStar LED Controller (Nov 2018) +----------------------------------- + +.. pintable:: + + GPIO13, Button (inverted), + GPIO16, Blue LED (inverted), + GPIO4, Red LED (inverted), + GPIO14, Red Channel, + GPIO12, Green Channel, + GPIO5, Blue Channel, + GPIO15, White Channel, + See Also -------- From 52cbfe59cd8661319927bdaa53a7a99bc66f6812 Mon Sep 17 00:00:00 2001 From: cryptelli Date: Sun, 20 Oct 2019 07:18:52 +1100 Subject: [PATCH 6/8] Cookbook Guide for Zemismart LED RGBW Downlights (#297) * Cookbook Guide for Zemismart LED RGBW Downlights * Linting --- ...zemismart-rgbw-downlight-homeassistant.jpg | Bin 0 -> 31561 bytes cookbook/images/zemismart-rgbw-downlight.jpg | Bin 0 -> 14701 bytes cookbook/zemismart-rgbw-downlights.rst | 196 ++++++++++++++++++ images/cookbook-zemismart-rgbw-downlight.jpg | Bin 0 -> 5228 bytes index.rst | 1 + 5 files changed, 197 insertions(+) create mode 100644 cookbook/images/zemismart-rgbw-downlight-homeassistant.jpg create mode 100644 cookbook/images/zemismart-rgbw-downlight.jpg create mode 100644 cookbook/zemismart-rgbw-downlights.rst create mode 100644 images/cookbook-zemismart-rgbw-downlight.jpg diff --git a/cookbook/images/zemismart-rgbw-downlight-homeassistant.jpg b/cookbook/images/zemismart-rgbw-downlight-homeassistant.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c8f1ab0ad572ec8f89375ebedfacfe48576e9713 GIT binary patch literal 31561 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
@AzDPY>9AyZg(Mnb8B^QsO0*LRKy- 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 direct. + +.. figure:: images/zemismart-rgbw-downlight.jpg + :align: center + :width: 50.0% + +Originally intended to be used with their companion app once flashed using `tuya-convert `__ ESPHome generated +firmware can be uploaded allowing you to control the smart plugs via Home Assistant. + +1. Create the ESPHome Firmware +------------------------------ + +#. Refer to either :doc:`/guides/getting_started_command_line` or :doc:`/guides/getting_started_hassio` before moving onto the next step. +#. Select a plug configuration below based on the plug/s you have and copy all of the text in the code block and paste into your + ``name_of_esphome_configuration.yaml`` file. +#. Compile the firmware, again depending on your chosen setup refer to the guides in the first point. + +2. Flashing +----------- + +2.1 Prerequisites +***************** + +#. Before you begin you'll need one of the following linux machines running the latest copy of `Raspbian Stretch Lite + `__ + + a. Raspberry Pi 2B/B+ with `USB WiFi Dongle `__. + b. Raspberry Pi 3B/B+. + +.. note:: + + As per the `tuya-convert documentation `__: + + Any Linux with a Wifi adapter which can act as an Access Point should also work. Please note that we have tested the Raspberry Pi with clean installations + only. If you use your Raspberry Pi for anything else, we recommend using another SD card with a clean installation. + +#. A microSD card (minimum 2GB, 8GB+ recommended). +#. Any WiFi device which can connect to the SSID generated by the Raspberry Pi and eventually the flashed tuya device. **This cannot be an iOS / Apple device. + Android devices will work.** + +2.2 Installing the OS +********************* + +#. It's recommended to read the documentation provided by the Raspberry Pi Foundation on the best way to flash the OS to the microSD card depending on your + platform - `Installing operating system images `__. +#. After you've flashed the microSD card browse to the "boot" partition and add a blank file called "ssh" **(without any extension)** which will enable the + SSH server upon first boot, extended information on this step can be found `here + `__. +#. Plug the microSD card into the Raspberry Pi, connect network cable and power, the Raspberry Pi will start to boot. + +2.3 Connecting to the Pi via SSH +******************************** + +#. Download and install `Putty `__. +#. Open Putty. +#. Enter the IP of Raspberry Pi in the box that says "Host Name", leaving the port set to 22 (default for SSH). A list of recommended ways can be found `here + `__, but the easiest is to download and use `Fing `__ + (`Android `__ / `iOS + `__). +#. In the "Saved Sessions" input box, name the Raspberry Pi connection and then press "Save". +#. Select your new saved session from the list. +#. Press "Open". + +2.4 Configuring the Pi +********************** + +#. In the putty window login with the **pi** as the user and **raspberry** for the password. +#. Type ``sudo apt-get update && sudo apt-get dist-upgrade -y`` and wait for the upgrades to install. +#. Type ``sudo apt-get install git`` and wait for it to install. + +2.5 Setup and Install tuya-convert +********************************** + +#. In the putty window type ``git clone https://github.com/ct-Open-Source/tuya-convert`` press enter and wait while the repository is cloned. +#. Type ``cd tuya-convert`` and press enter. +#. Type ``./install_prereq.sh`` press enter and wait as the script gathers all the required components needed to function. + +2.6 Upload ESPHome Firmware using SFTP +************************************** + +#. Download `FileZilla `__ or `WinSCP `__ or use your preferred FTP + client. +#. Depending on the program you need to connect to the Pi using the IP address as the hostname and the username and password the same as you used to connect + via SSH and ensure your connection type is set to **SFTP** +#. Browse to ``/root/tuya-convert/files``. +#. Upload your compiled ``firmware.bin`` file to this directory. For command line based installs you can access the file under + ``//.pioenvs//firmware.bin`` alternatively Hass.io users can download the file directly from the web ui. + +2.7 Use tuya-convert to install ESPHome Firmware +************************************************ + +#. Type ``./start_flash.sh`` +#. Type ``yes`` to accept the warning. +#. Connect your alternative WiFi device (non iOS / Apple based) to the ``vtrust-flash`` SSID using ``flashmeifyoucan`` as the password. This is the network + being broadcast by the Pi from the tuya flash script. +#. If you haven't already plug your downlight into a powerpoint and turn it on and follow the instructions below: + + #. Once turned on a stable white light will be emitted. + #. Switch off, then back on **3** times ensuring each off-on cycle is no longer 10 seconds apart and between each the light visibly turns off. + #. The light should have entered into a fast flashing state, if this is the case continue onto **Step 5** below. *Otherwise please turn the downlight off-on + within 3 minutes which will restore it back to a stable white light.* + + +#. Press enter on your putty window to start the flash process and wait. If the connection is successful you should see a large amount of scrolling text, this + is the script backing up the factory shipped firmware. +#. Once the process is complete you can type ``curl http://10.42.42.42/flashURL?url=http://10.42.42.1/files/firmware.bin`` +#. The plug will restart and if everything is working correctly after a few seconds you should be able to press the button triggering the relay and turning the + blue led on. + +3. Downlight Configuration +-------------------------- + +Thanks to `@1972rx2 `__ for creating the below ESPHome configuration +which this cookbook article by `@cryptelli `__ is based on. + + +3.1 Zemismart LED RGBW Downlight YAML +************************************* + +.. code-block:: yaml + + esphome: + name: downlight01 + platform: ESP8266 + board: esp01_1m + + wifi: + ssid: "YOUR SSID" + password: "YOUR WIFI PASSWORD" + + # Enable logging + logger: + + # Enable Home Assistant API + api: + + ota: + + my9231: + data_pin: GPIO13 + clock_pin: GPIO15 + num_channels: 4 + num_chips: 1 + + output: + - platform: my9231 + id: output_blue + channel: 1 + - platform: my9231 + id: output_red + channel: 3 + - platform: my9231 + id: output_green + channel: 2 + - platform: my9231 + id: output_white + channel: 0 + + light: + - platform: rgbw + name: Downlight01 + red: output_red + green: output_green + blue: output_blue + white: output_white + +4. Adding to Home Assistant +--------------------------- + +You can now add your downlight to Home Assistant using the below instructions: + +#. In the left hand sidebar, select **Configuration**. +#. Select **Integrations** +#. Click the **Orange** plus button *(lower right hand corner)* and look for **ESPHome** in the list of available integrations and select. +#. Type the host of the downlight, in most cases this is simply the IP address. +#. Leave the port set to the default of ``6053``. +#. Click **Submit** + +If you've gotten this far, congratulations! Below is the card you should see inside Home Assistant which allows you to control the downlight. + + +.. figure:: images/zemismart-rgbw-downlight-homeassistant.jpg + :align: center + :width: 50.0% + +See Also +-------- + +- :doc:`/components/light/index` +- :doc:`/components/light/rgbw` +- :doc:`/components/output/index` +- :doc:`/components/output/my9231` +- :ghedit:`Edit` diff --git a/images/cookbook-zemismart-rgbw-downlight.jpg b/images/cookbook-zemismart-rgbw-downlight.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1141e279ab6467a66a305d7b095a5b129919450e GIT binary patch literal 5228 zcmb7GcUTi^vriy&gbg4aOz0g#Gg71qh=LTA-a$ZmlOkP|F1?5#MFi;rA`)q#h!ByE z^m>5MyC?|Ugmb=g&Uc^Z{&8pb$-X-?znRJIZ)e`~vGX|)ps99K4Fm>*K^nLNbUq1E z0TDxph>0M?#6-j-B*diT0694s895ylH6_46$H>S)M^Dep#(jmEg_D(@9wr3i$!!JxkdOhAaMmjq{Iz#IN$!MWg!=Mx}GLNJH`AOvvtr#gQFFBTHl6=Jc) ze*0D17FQQO9Lf0PGK6@gTO=MdtsAZ0d>;DW-v50EOS42J8`1ougk=prT?Y{mSXyX% z`&>IL`wI=$%_fB*e^NVLp&wYc_`<%}ft5#gS&2!`CaC27Sr5cc3iz6P0Bo zf<|3UWx(SwDrumK+UFuZ`6S1?uti`0cPK?30v%zgYUzq-Y}?9R)uiUj@=!&b54%BJ zkgr0*dQ_%d){tQYnk_(^ zA300;6|$PWHMSn-Uw>QGn7p&}{)bo&>-*m;7Dg+&8x04QIUWX^?1yOWoz@9@!)D8hDVT|t}>0^3|2UCBb^~O#jhd2F)=#-mwn$E zhD{=2#LIgTU#Wh=r_|`^=cb>oX?Et7o0E5T@(e*GtVJ1k4*TPl->+c59v0@|{6Lj5 z3%VvM!X$!$F*iCHE*opSsHQh3`y6o@yKpGz_$C_XLcnDosYb#xHs{*`M?mzA5IMG= zeNqICDGZRLRQ~hw>@y;$)#iYUmn4`zf^3i%v5EYYK{({;-4O-~1;`neS5}xOOY1he z-VP2};agiBeKOEna~{9h7+W3Mm( z0uvGv5JA8Y!avP8(h@?TG(=*=01Tl>3m2E*pyQNs=T@@BahepzbTARYIq3P&xDe{8 z9KnaIfYK~q6${DZgev1xE`uKa$+vf;yqOb9O1tG%h*b4+?mpTpbagHsELr^{SFPzvtMT92$(C1$ z>$b%|x>S#1n|WL1X(FNCvKl|RCX;{+VhK<0{NfoZP(ZH2UA|V>RN-6(c63k zyp`e^ZAsGFVfk88=eSy2vcQ~~9&32K#`cQ)N4m-{_u3Xjk43rPrR~0Z^dmmhx#S_x z+K%>_I~f$dZv4&Fb5~pBEq-aKY|MuQ@!ChLFCtCFLV_A|ci0IZ?+>>K-*4HP4?DYJ zuU~L#!`8m^IYq+-62CIpdJZzpc4jKl*JLZu`8cG+CMoO2;IINan)P+n4+OoN;har* z`guonHrqxf{>U5Y8k*DFML%?v@u-Il;u0ENuRhK<%m3vi;5IM~t+q8A5ZowW41Kn% zt*tbc=r-W9QC@AB7W2c%`^!#i7iCt~vtQa|XsOOOl~gmyruS-Z$A{KQUD}J%ChIjz zu`_5M%4W{x_XLBoXqDNaq;>QKBU?afzTiDHRs_tHl_S_AoR~NcP^(B%^n1r14F?xT zD8q41F`bsx_XRJ9cUo5~y_F))lXDUj6v8QRZ>rj`9JjD@6X^L{W`}3-ofV3w+rQf< z7zCwJbcZ7@$cD2hfQQLXXvbsuGaI9aZY}2GKv$qR&O&hA^>4uifx_To2pm%P0!V-d zuF>ui+QBtUBg51TOHkS~YOhhoSnY-{Y!^|Gc;*ujkPt%%$^KzJ6i%ZEfpH+jtvmo) zF(n;c&+sHPonAGkvWlg9Xjt;VUmpRn0>PPfV!h@oEoM%w*B#qGbKYo=Kge#36AqHC z%m2Way`ePr+J8cFInV8p^}x(`Xl(Sbv220&bMCEe)=5;_o-uU5d=u8R)F)>C`14mED z-ZJ(=6C>Y$iY0u@n(yu+o2bI~0%g%KRa9F zYlW$9xJWhKt)|ZwS7^Mte_K4#`oRi`&N;~H$kfV11ddh6+`B)HtqQtz`SH5GsD6X) z2e+r{5BGbLeFeAn*m;FDmmH94nyP&4~&FOeXxnf_kaLMYmJAlNBbA zrV9d31nn>bNIia(K1u zlKI0o?a%{FinMy42lcDzH4{5q_j{kY_RK#PKF)v}uZ`ZTa$Wdnc3?_nia6EX7W>_h zE7f=oGFQM6PYA#f4Mao;0TUAa$vzxg0T>*iB&KWS5tfv%s8hXTi5{5Wb^lMVRDhqw zdeqcaCOB8pjKylHRGX+at#vq6rD>joNvU|xW%)X2I@wUjl9pQJ$DAGV*OAX%$y|Rq z^dv7`=EOt(^L~zrtUUb zbdc)l*!B8M-*a6rnx)^lwW z?><FiP{sz<^fr?MRtvF5}O`1Lro&&!2xewzF82eR;AyMB*K=+cb9Q@?Z{*Y!bo z7^&9G*cuH#0KK%njpX-i`D#N{)XQ3FW*-sUeNa8@b&y#_qR%GYprH&zOm@E7J;k1> z&V*3(EU{#}#7kIE{D{4MJ#{<@-4OvNRSt^UenOvX8p8Y4GKRGp;}ycjO>wnAr}-Sz zBt7T+TdRpYi~xv$OV^011rHGop;P@sywZ9)FR{6JepBf>QAdDF>t~$XqnI<89^Ng{ zfhhxUQioi|pTNg+P_hn9TdvqJ-5RF3aVdb^<#X&&x8dCqy*$k@Qe|Q4K-ay{HVMn} zZRO(UVS>V%X-}<{sZP9v1QWs-w)?$mU4C@C7T(51)qA5EMrLa&y+W&EEj;-xbj2n% zE`77HTmWyf((Bew$$;lC`O6nP^DS@!p1uI4U(fJg7!{vVc=HmcG;8w4?Sj-#6TmO9 z5JaOp(F=%+u&Y5~*}IHaJchG(jEX}d0^Nk}O*dw3n?r7-bSE=qZy;ZVPmmQo{$>H) zWMS}a1fs9O(Eak@WKFX!h8~dNtj0Qr!_4dK;?GPoF?MSs!-;YOEX`OK!tE4m_MPk| zAf9V=c}2J-dQt(`c#0Hnb{vt-T`vtD8p&DZ(WN&E9R`{wGUwyGLQoFOmV-~$0Z zjCScvUcooHXcU9xHP^26{GLd||Bsd(QQWt7vDXIScQC+ypWHuZkDTJeEQSAQ_7eVO z>XUnYp&$D8r;_gi1p<8&@WSbPa7tvsE$K<#f|EWuJTR1!tTY`7M-5#7=WaLqub@hK zD);;N_P=GJ;WbQ!m1vH4INiCScQIJnOsF(SP@QaM^$QkDo3KTcF z@ELIx#z`Vn<&<%S;Y*dt?a#_~YZaYKj0&GOl@;T{_4er9S5$ybe#@xsKlF5m!VURY{PpQm?D z*gh1Ck1l}ktY88N@!y*PT!{#{5&+Y+62o`aYV?4j&iu~q-+dK0lhV8(z?+MUZXXNB z6Va!bMSCNAizPdBhj|gzdS#yU`bb4lQKShV6-ssWFjPP3rkLw!**7+y$R}TENR&jL z{feUW7?$wJH}>XEv-+NXKa^Q|=Ewsb#auQFGhZx9t~jQyiJveS8bu}@lIroq%FIlt zzI;>{W%8uVjN`f(IcE0PHFs5S!3Di1)PA*7gp*CHUs3vHIYzgp-p-8Pl_YC^wmXWU zqWTsjC_SucGyew!ArT1Zc!ERodxs`dvT70sMok7GGq*-v! zrmi_JVLn7J(`M+-6zDy#zEL1MssF8oU+17@Ik`rGTeCL%mp?4a(Q~1gh4WX!_JKm# zOF6NJxItSJKoXRs}&8?ykh442rZ8HhJ@MVb?k+B}|;X1MDR>Vi|pdG^mT@i7Xrsnym%b*=%U_p?Oiv`kV z#Mt)>)zuf4ah)XlV?ZNg3+ii&f?l`*2PQ*jgqY8R(!jhbsxzu+`cqc>=g29qrJfja z+f=F2LT6F#{&ar~+i&Gza=BLwgv{i}TCSy&y`zw~*$8@}kBHmzBn)D%EnW^N6~~WB zH^di(vx;1~jI5_;-?OKp5fPU?W-~hv!6g~`(|y$L}I;&~p{ z?sD3E;f(g(&z%a*kdmS6%{u*Uv%PGGWEe~u^+U3eio6YnU~Vh_lNv0;pwnKiEkdtA ziH5W%oYW5jsBB(ec0=yaYTs!Q)wMJ`)PXgDDms6AF7^0ih3yI{V}m-sCI&p&6;t*t zIaMMP;L=Eviv9wIh$#_WZx0^aLZl8E&+fQL?m7k5>R)zB#iUP-8b(wkR|B=6DU|=0 z3M<${Ns;>EDo{M1`zqTXTtCuixHQ@+SruXPq_E8cc|Wo2wm?pqo_^_mhrtg~nTpkp z*hE_wx|+IMX-k;gitgf98lDjkV!LMUY9vK0gXSPW&(+G7E_zB;|60JopU7+J+q*bs znZyimy=^R=W;6|#wj!_*MnG!0!rrVguD4j&;8jv}Y@zt1FGGSp#c=xI8B*dSl1_83 z9tfub-68_oPA*ket%*|d*RPQJM2?`bN>6$-B-pb#4PLV{c^MzG*^u=>0N}kX*j?8R zn5`9{c?{3_40uniHPY}=38oxwOnTewx8V|k`{7^EnysWKw*zkLI8r$`3>x0z3F6V>e8?&GRGua; zQa@>K*Y1)mOLOwvtlz1Y(L|Tvlp)^V?D{bi8<$~#HoacX@lnyCgcCSEcBg^{|{z(4?zF` literal 0 HcmV?d00001 diff --git a/index.rst b/index.rst index 7ba640e66..45c0daffc 100644 --- a/index.rst +++ b/index.rst @@ -327,6 +327,7 @@ Cookbook Mirabella Genio Bulb, cookbook/mirabella-genio-bulb, cookbook-mirabella-genio-b22-rgbw.jpg Garage Door, cookbook/garage-door, window-open.svg Brilliant / Mirabella Genio Smart Plugs, cookbook/brilliant-mirabella-genio-smart-plugs, cookbook-brilliant-mirabella-genio-smart-plugs.jpg + Zemismart RGBW Downlights, cookbook/zemismart-rgbw-downlights, cookbook-zemismart-rgbw-downlight.jpg Teckin SB50, cookbook/teckin_sb50, teckin_sb50.jpg Do you have other awesome automations or cool setups? Please feel free to add them to the From 9e003f20100cbf81a79919edcd8972a49c6b3900 Mon Sep 17 00:00:00 2001 From: Guillermo Ruffino Date: Sat, 19 Oct 2019 17:24:47 -0300 Subject: [PATCH 7/8] Cookbook ape (#334) * cookbook-ape * Optimize SVG * Update cookbook/arduino_port_extender.rst Co-Authored-By: Otto Winter * Update cookbook/arduino_port_extender.rst Co-Authored-By: Otto Winter * Update cookbook/arduino_port_extender.rst Co-Authored-By: Otto Winter * Update cookbook/arduino_port_extender.rst Co-Authored-By: Otto Winter * updates * fixed indents * whitespace * whitespace * Minor corrections --- cookbook/arduino_port_extender.rst | 326 +++++++++++++++++++++++++++ cookbook/images/arduino_pro_mini.jpg | Bin 0 -> 34968 bytes images/arduino_logo.svg | 1 + index.rst | 1 + 4 files changed, 328 insertions(+) create mode 100644 cookbook/arduino_port_extender.rst create mode 100644 cookbook/images/arduino_pro_mini.jpg create mode 100644 images/arduino_logo.svg diff --git a/cookbook/arduino_port_extender.rst b/cookbook/arduino_port_extender.rst new file mode 100644 index 000000000..5231e87a6 --- /dev/null +++ b/cookbook/arduino_port_extender.rst @@ -0,0 +1,326 @@ +Arduino Port Expander +===================== + +.. seo:: + :description: Instructions on using an Arduino board, like the Pro Mini for expanding ports of a ESPHome node + :image: arduino_pro_mini.jpg + :keywords: Arduino port expander extender ESPHome + +With this sketch you can control pins of a remote Arduino board through ESPHome. The Arduino acts as a port +expander, allowing you to use more pins than a standard ESP8266/ESP32 has. + +.. figure:: images/arduino_pro_mini.jpg + :align: center + :width: 75.0% + +The Arduino is connected to the ESP via I²C. Most Arduinos use the ``A4`` and ``A5`` pins for the I²C bus +so those pins are not available to read from ESPHome. +It is recommended to use a 3.3V I/O level Arduino, however using 5V Arduinos seems to work too. In the latter +case you should power your 5V Arduino with 3.3V otherwise you will need a level converter for the +I²C bus. + +Currently it is supported: + + - reading digital inputs + - reading analog inputs + - writing digital outputs + +The Arduino sketch can be retrieved from `here `__ +you can rename it to ``.ino`` and use the Arduino IDE to program it. + +You need to download `arduino_port_expander.h `__ and include the ape.h in the ESPHome configuration. + +.. code-block:: yaml + + esphome: + # ... + includes: + - arduino_port_expander.h + +Setup your :ref:`I²C Bus ` and assign it an ``id``: + +.. code-block:: yaml + + i2c: + id: i2c_component + +By default ESP8266 uses ``SDA`` pin ``GPIO4`` which you need to connect to Arduino's ``A4`` and the ``SCL`` +is ``GPIO5`` which goes to Arduino's ``A5``. + +Then create a ``custom_component``, this will be the main component we will be referencing later when creating +individual IOs. + +.. code-block:: yaml + + custom_component: + - id: ape + lambda: |- + auto ape_component = new ArduinoPortExpander(i2c_component, 0x08); + return {ape_component}; + +By default the I²C address is ``0x08`` but you can change it on the arduino sketch so you can have more slaves +on the same bus. + +Now it is time to add the ports. + +Binary_Sensor +------------- + +When adding binary sensors the pins are configured as INPUT_PULLUP, you can use any PIN from 0 to 13 or +``A0`` to ``A3`` (``A4`` and ``A5`` are used for I²C and ``A6`` and ``A7`` do not support internal pull up) + +.. note:: + + Arduino PIN 13 usually has a LED conected to it and using it as digital input with the built in internal + pull up might be problematic, using it as an output is preferred. + +To setup binary sensors, create a custom platform as below, list in braces all the sensors you want, +in the example below two binary sensors are declared on pin 9 and A0 (number 14) + +Then declare the ESPHome reference of the binary sensor in the same order as declared in the lambda: + +.. code-block:: yaml + + binary_sensor: + - platform: custom + lambda: |- + return {ape_binary_sensor(ape, 9), + ape_binary_sensor(ape, 14) // 14 = A0 + }; + + binary_sensors: + - id: binary_sensor_pin2 + name: Binary sensor pin 2 + - id: binary_sensor_pin3 + name: Binary sensor pin 3 + on_press: + ... + +The listed ``binary_sensors`` supports all options from :ref:`Binary Sensor ` like +automations and filters. + +Sensor +------ + +Sensors allows for reading the analog value of an analog pin, those are from ``A0`` to ``A7`` except for +``A4`` and ``A5``. The value returned goes from 0 to 1023 (the value returned by the arduino ``analogRead`` +function). + +Arduino analog inputs measures voltage. By default the sketch is configured to use the Arduino internal VREF +comparer setup to 1 volt, so voltages bigger are read as 1023. You can configure Arduino to compare the +voltage to VIN voltage, this voltage might be 5 volts or 3.3 volts, depending on how you are powering it. To +do so, pass an additional true value to the hub constructor: + +.. code-block:: cpp + + auto ape_component = new ArduinoPortExpander(i2c_component, 0x08, true); + +To setup sensors, create a custom platform as below, list in braces all the sensors you want, +in the example below two sensors are declared on pin ``A1`` and ``A2`` + +Then declare the ESPHome reference of the sensor in the same order as declared in the lambda: + +.. code-block:: yaml + + sensor: + - platform: custom + lambda: |- + return {ape_analog_input(ape, 1), // 1 = A1 + ape_analog_input(ape, 2)}; + sensors: + - name: Analog A1 + id: analog_a1 + filters: + - throttle: 1s + - name: Analog A2 + id: analog_a2 + filters: + - throttle: 2s + +The listed ``sensors`` supports all options from :ref:`Sensor ` like +automations and filters. + +.. note:: + + Sensors are polled by default every loop cycle so it is recommended to use the ``throttle`` filter + to not flood the network. + +Output +------ + +Arduinos binary outputs are supported in pins from 0 to 13. + +To setup outputs, create a custom platform as below, list in braces all the outputs you want, +in the example below two outputs are declared on pin ``3`` and ``4`` + +.. code-block:: yaml + + output: + - platform: custom + type: binary + lambda: |- + return {ape_binary_output(ape, 3), + ape_binary_output(ape, 4)}; + outputs: + - id: output_pin_3 + inverted: true + - id: output_pin_4 + inverted: true + + switch: + - platform: output + name: Switch pin 3 + output: output_pin_3 + + light: + - platform: binary + name: Switch pin 4 + output: output_pin_4 + +Full Example +------------ + +Let's connect a 4 channel relay board and 2 push buttons to toggle the relays, a PIR sensor, a window and a door +a LM35 temperature sensor and a voltage sensor. Seems a bit too much for an ESP8266? You'll still have some +spares I/Os. + + +.. code-block:: yaml + + esphome: + name: test_arduino + platform: ESP8266 + board: nodemcu + includes: + - arduino_port_expander.h + + wifi: + ssid: !secret wifi_ssid + password: !secret wifi_pass + + api: + + ota: + + # define i2c device + # for an ESP8266 SDA is D2 and goes to Arduino's A4 + # SCL is D1 and goes to Arduino's A5 + i2c: + id: i2c_component + + logger: + level: DEBUG + + # define the port expander hub, here we define one with id 'expander1', + # but you can define many + custom_component: + - id: expander1 + lambda: |- + auto expander = new ArduinoPortExpander(i2c_component, 0x08, true); + return {expander}; + + # define binary outputs, here we have 4, as the relays are inverse logic + # (a path to ground turns the relay ON), we defined the inverted: true + # option of ESPHome outputs. + output: + - platform: custom + type: binary + lambda: |- + return {ape_binary_output(expander1, 2), + ape_binary_output(expander1, 3), + ape_binary_output(expander1, 4), + ape_binary_output(expander1, 5)}; + + outputs: + - id: relay_1 + inverted: true + - id: relay_2 + inverted: true + - id: relay_3 + inverted: true + - id: relay_4 + inverted: true + + # connect lights to the first 2 relays + light: + - platform: binary + id: ceiling_light + name: Ceiling light + output: relay_1 + - platform: binary + id: room_light + name: Living room light + output: relay_2 + + # connect a fan to the third relay + fan: + - platform: binary + id: ceiling_fan + output: relay_3 + name: Ceiling fan + + # connect a pump to the 4th relay + switch: + - platform: output + name: Tank pump + id: tank_pump + output: relay_4 + + + # define binary sensors, use the Arduino PIN number for digital pins and + # for analog use 14 for A0, 15 for A1 and so on... + binary_sensor: + - platform: custom + lambda: |- + return {ape_binary_sensor(expander1, 7), + ape_binary_sensor(expander1, 8), + ape_binary_sensor(expander1, 9), + ape_binary_sensor(expander1, 10), + ape_binary_sensor(expander1, 14) // 14 = A0 + }; + + binary_sensors: + - id: push_button1 + internal: true # don't show on HA + on_press: + - light.toggle: ceiling_light + - id: push_button2 + internal: true # don't show on HA + on_press: + - light.toggle: room_light + - id: pir_sensor + name: Living PIR + device_class: motion + - id: window_reed_switch + name: Living Window + device_class: window + - id: garage_door + name: Garage garage + device_class: garage_door + + # define analog sensors + sensor: + - platform: custom + lambda: |- + return {ape_analog_input(expander1, 1), // 1 = A1 + ape_analog_input(expander1, 2)}; + sensors: + - name: LM35 Living room temperature + id: lm35_temp + filters: + # update every 60s + - throttle: 60s + # LM35 outputs 0.01v per ºC, and 1023 means 3.3 volts + - lambda: return x * 330.0 / 1023.0; + - name: Analog A2 + id: analog_a2 + filters: + - throttle: 2s + + + +See Also +-------- + +- :doc:`/devices/nodemcu_esp8266` +- :ghedit:`Edit` diff --git a/cookbook/images/arduino_pro_mini.jpg b/cookbook/images/arduino_pro_mini.jpg new file mode 100644 index 0000000000000000000000000000000000000000..20c264362efb3b591a0734e26ecc8fa35b6ada18 GIT binary patch literal 34968 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 diff --git a/index.rst b/index.rst index 45c0daffc..2593bc49b 100644 --- a/index.rst +++ b/index.rst @@ -313,6 +313,7 @@ Cookbook .. imgtable:: + Arduino Port Extender, cookbook/arduino_port_extender, arduino_logo.svg Endstop Cover, cookbook/endstop-cover, window-open.svg PIR Sensor, cookbook/pir, pir.jpg Relay, cookbook/relay, relay.jpg From a4c349a6e98383ce5edb8892629fa456ea10985b Mon Sep 17 00:00:00 2001 From: h0-- <3601308+h0--@users.noreply.github.com> Date: Sun, 20 Oct 2019 16:28:02 +0200 Subject: [PATCH 8/8] update esp32camera documentation - note about PWM (#348) * update esp32camera documentation - note about PWM As I was fighting with this yesterday, I think this can be part of esphome documentation. * Update esp32_camera.rst Co-authored-by: Otto Winter --- components/esp32_camera.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/esp32_camera.rst b/components/esp32_camera.rst index 034a9f474..d0cdddaef 100644 --- a/components/esp32_camera.rst +++ b/components/esp32_camera.rst @@ -89,8 +89,8 @@ Frame Settings: .. note:: - The camera integration in Home Assistant isn't in stable or beta HA builds, so until 0.91 - ships or goes into beta you will need to use a development version of Home Assistant. + Camera uses PWM timer #1. If you need PWM (via the ``ledc`` platform) you need to manually specify + a channel there (with the ``channel: 2`` parameter) Configuration for Ai-Thinker Camera -----------------------------------