├── .gitignore ├── 3D_files ├── LED │ ├── ESP32_Macropad_top_V2.stl │ ├── ESP32_keypad_short_bottom.stl │ └── ESP32_keypad_tall_bottom.stl ├── NO_LED │ ├── ESP32_Macropad_top_V1.stl │ ├── ESP32_keypad_short_bottom.stl │ └── ESP32_keypad_tall_bottom.stl └── readme.md ├── LICENSE.md ├── README.md ├── YAML ├── esp32_keypad_LED.yaml └── esp32_keypad_NO_LED.yaml ├── assets ├── LED │ ├── Inside_LED.JPG │ ├── LED_Layout.JPG │ ├── RGB_Lighting_Demo.gif │ ├── Top_LED.JPG │ ├── common_GND.JPG │ └── wiring_diagram_LED.png └── NO_LED │ ├── inside_NO_LED.JPG │ ├── top_NO_LED.JPG │ └── wiring_diagram_NO_LED.png ├── automations ├── baby_buddy_keypad_automation.yaml └── generic_keypad_automation.yaml └── icons ├── Keyboard_Template.ai ├── Keyboard_Template.pdf ├── Single Key Legend Template.pdf ├── basic_flat_lineal_icons ├── baby-bottle.png ├── breast-pump.png ├── crawl.png ├── crawl_01.png ├── crawl_bow.png ├── crawling.png ├── diaper.png ├── mom.png ├── sleep.png ├── spoon.png └── timer.png ├── readme.md └── special_lineal_icons ├── breastfeed.png ├── diaper-thin.png ├── feeding-bottle copy.png ├── feeding-bottle.png ├── moon.png ├── sleep2.png ├── spoon.png ├── stopwatch.png ├── timer.png └── tummy-time.png /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /3D_files/LED/ESP32_Macropad_top_V2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/3D_files/LED/ESP32_Macropad_top_V2.stl -------------------------------------------------------------------------------- /3D_files/LED/ESP32_keypad_short_bottom.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/3D_files/LED/ESP32_keypad_short_bottom.stl -------------------------------------------------------------------------------- /3D_files/LED/ESP32_keypad_tall_bottom.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/3D_files/LED/ESP32_keypad_tall_bottom.stl -------------------------------------------------------------------------------- /3D_files/NO_LED/ESP32_Macropad_top_V1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/3D_files/NO_LED/ESP32_Macropad_top_V1.stl -------------------------------------------------------------------------------- /3D_files/NO_LED/ESP32_keypad_short_bottom.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/3D_files/NO_LED/ESP32_keypad_short_bottom.stl -------------------------------------------------------------------------------- /3D_files/NO_LED/ESP32_keypad_tall_bottom.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/3D_files/NO_LED/ESP32_keypad_tall_bottom.stl -------------------------------------------------------------------------------- /3D_files/readme.md: -------------------------------------------------------------------------------- 1 | ## 3D Files 2 | 3 | - ESP32\_keypad\_short_bottom.stl - Mount the esp32 'upside-down' and screw in with the tiniest screws you can find. 4 | - ESP32\_keypad\_tall\_bottom.stl - Taller version which should allow a _bit_ more rooom for wires/soldering 5 | - ESP32\_Macropad\_top.stl - Top where you mount the key switches. There are groves on the bottom to help with wiring the common GND wire. 6 | 7 | NOTE: You can absolutely use the LED version without LEDs inside of it. 8 | 9 | ## Attributions 10 | 11 | Remixed from ['Macro Pad' on Thingiverse](https://www.thingiverse.com/thing:5628107) by tomtompoperdom 12 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 drpeppershaker 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ESP32_keypad 2 | 3 | This DIY macropad is built with only off-the-shelf parts. No custom PCBs for absolute ease of building! It uses an ESP32 with [ESPHome](https://esphome.io/) in order to control devices or trigger automations in [Home Assistant](https://home-assistant.io).

4 | It has 8 keys, and supports different actions for single, double, and triple clicks, long clicks, and click and holds. 5 | 6 | 7 | 8 |

9 | 10 | 11 |
LED Version

12 | 13 |
NO_LED version 14 |

15 | 16 | ## Versions 17 | ### NO_LED 18 | - As the names suggest, the NO_LED version does not use any LEDs. This keeps the cost and soldering skills required lower. 19 | ### LED 20 | - The LED version uses 16 addressable LEDs -- 8 LEDs for RGB backlighting with various effects and 1 LED for each individual key for reactive keypresses. This version is a few millimeters taller than the NO_LED version to accommodate the LED Pixels. 21 | 22 | 23 | ## Requirements 24 | - [Home Assistant installation](https://www.home-assistant.io) 25 | - [ESPHome integration](https://www.home-assistant.io/integrations/esphome/) 26 | 27 | ## Building the Macro Pad 28 | 29 |

LED VERSION

(Click to expand)
30 | 31 | ### Tools 32 | | **Tool** | **Non Referral Link** | **Referral Link** | **Notes** | 33 | |----------------------------|--------------------------------------|--------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 34 | | Soldering Iron Kit | https://www.amazon.com/dp/B08R3515SF | https://amzn.to/3JADtWo | This is not the soldering iron kit I used. I use a [Pinecil](https://amzn.to/3K6qU6E) by Pine64, which I can't recommend enough. But if you're just doing one project--just grab a full kit with all the do-dads you need. | 35 | | Silicone Wire | https://www.amazon.com/dp/B01LH1G2IE | https://amzn.to/40wMlTD | Silicone wire is helpful for wiring the switches to the board. It's extra flexible, which helps with the smash and cram at the end. | 36 | | Solid Core Wire | https://www.amazon.com/dp/B09BFFJRST | https://amzn.to/3lhCEd2 | Solid core wire is practically a requirement to wire up the LED Pixels. In my original prototype I used the legs from a few resistors, and some header pins instead of solid core wire. It was a PAIN to wire that way. Go with some solid core wire... | 37 | | M3 Bolts | https://www.amazon.com/dp/B0B31SC98Z | https://amzn.to/3nlqikM | M3 Socket Cap bolts for the 3D Printed Case | 38 | | Tiny Screws | https://www.amazon.com/dp/B09L4R6B1Q | https://amzn.to/3JLnSDx | I used some tiny screws to attach the ESP32 board to the bottom of the case. | 39 |

If you choose to use the above affiliate links I may receive a very small commision from Amazon at no extra cost to you

40 | 41 | 42 | 43 | ### Parts 44 | | **Parts** | **Referral Link** | **Non-Referral Link** | **Notes** | 45 | |----------------------|-------------------------|--------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 46 | | 8 Cherry MX Switches | https://amzn.to/3YT6VgA | https://www.amazon.com/dp/B07KMXJ4KG | I like the Blue switches because they're *very* click-y | 47 | | an ESP32 board | https://amzn.to/41l7mCi | https://www.amazon.com/dp/B08DR31G4G | These are to the cheapest ESP32 boards I could find on Amazon. Use whatever boards you like | 48 | | Relegendable Keycaps | https://amzn.to/3SmIaqX | https://www.amazon.com/dp/B01M023NFK | Originally I went with the grey keycaps, but switched to the translucent keycaps when I put the LEDs in. | 49 | | Addressable LEDs (LED VERSION) | https://amzn.to/3yH5whK | https://www.amazon.com/dp/B01DC0J0WS | I used these pixels because all the LED strips I have are low density and the Pixels are too spread out. I really wanted to cram two LEDs behind each key switch, and this seems like the simplest way to achieve that. After building two keypads with LEDs, I think that someone who isn't me should attempt this with an LED strip with 144 pixel/m strips. You should be able to fit two leds behind each key with that kind of density. | 50 |

If you choose to use the above affiliate links I may receive a very small commision from Amazon at no extra cost to you

51 | 52 | 53 | ### Assembly 54 | - all switches are now connected to common GND and to their respective GPIOs (see ESPHome YAML files) 55 | - Note, your GPIO pins may be different based on the version of the board you use. I'm using the built-in PULLUP resistors on the ESP32 board for the switches. If you need to switch GPIO pins, make sure you use pins that have PULLUP resistors. 56 | ![](/assets/LED/wiring_diagram_LED.png) 57 | 58 |

59 | 60 | 61 | 62 | 65 | 66 | 67 | 68 | 69 | 70 |
63 | 64 |
Leds Wired and test fit.All switches **connected to common GND** rather than VIN.
71 | 72 | The LED pixels are sold in a 10x10 grid. The PCBs for each LED are attached to one another, but they are easy to break apart. You will want to keep them attached in two separate 'strips' of 8 connected leds each. Don't try to break them into individual pixels because they'll fall through the case. 73 | 74 | NOTE: When wiring up the LED pixels, you *can* have a single solid wire for all the 5V and one for all the GND contacts. However, the data contacts must be separated and move from DIN to DOUT--they can't be connected on the same pixel or they will NOT work. Stick to the wiring diagram for the Data Line. 75 | 76 | ### Case 77 | [STL files here](/3D_files) 78 | - I 3D printed my case. I've included two versions of the macropad case bottom. The images from V1 is using the 'short_bottom'. The short bottom version of the case makes things very tight, but everything should fit if you are careful with your wiring. Run the wires along the sides of the board, and keep them trimmed short. That said, If you don't want to put your soldering skills and smash and cram skills to the test, I also included a slightly taller version as well. The V2 version of the keypad w/ the LEDs that I made was testing my patience already, so I just put it in the taller version of the case. Certainly much easier, and not *that* much taller overall. 79 | 80 | - The V2 top case has cutouts for the LED pixels and for the common ground wire. This can be printed without supports, your printer must be at least *kinda* dialed in. You can see my pictures--my printer isn't all that calibrated, and I was still able to print this without supports. The real trick is to print it SLOWLY. The slower you print it, the better chance you'll have of not knocking off the the little center posts, plus your bridging will be better. I dialed my printer back to 35mm/s on both walls and infill and all the way down to 25mm/s for bridging. 81 | - You will probably want to set your slicer to print the external perimeters first. The case is designed for the key switches to be pressure fit. Printing the outer walls first will help keep the print from over expanding and making your switches not fit. You can also dial back your flow settings to help keep things fitting as they should. If you're still struggling, you can also increase the dimensions of the STLs by 1 or 2 percent to help things fit a bit easier. NOTE: I have not tested printing the case larger, so I don't know how well the LEDs will fit when you size it up. 82 | - Finally, I'm not a 3D designer or engineer. I adapted the original design from thingiverse for my needs using Tinkercad. 83 | - [Macropad Top on Tinkercad](https://www.tinkercad.com/things/466cJwJKiFd-macropadv2topver37) 84 | - [Macropad Bottoms on Tinkercad](https://www.tinkercad.com/things/ekNTHmUWMJU-esp32macropadbottoms) 85 | 86 |
87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 |

NO_LED VERSION

(Click to expand)
95 | 96 | ### Tools 97 | | **Tool** | **Non Referral Link** | **Referral Link** | **Notes** | 98 | |----------------------------|--------------------------------------|--------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 99 | | Soldering Iron Kit | https://www.amazon.com/dp/B08R3515SF | https://amzn.to/3JADtWo | This is not the soldering iron kit I used. I use a [Pinecil](https://amzn.to/3K6qU6E) by Pine64, which I can't recommend enough. But if you're just doing one project--just grab a full kit with all the do-dads you need. | 100 | | Silicone Wire | https://amzn.to/40wMlTD | https://www.amazon.com/dp/B01LH1G2IE | Silicone wire is helpful for wiring the switches to the board. It's extra flexible, which helps with the smash and cram at the end. | 101 | | Solid Core Wire | https://amzn.to/3lhCEd2 | https://www.amazon.com/dp/B09BFFJRST | Solid core wire is practically a requirement to wire up the LED Pixels. In my original prototype I used the legs from a few resistors, and some header pins instead of solid core wire. It was a PAIN to wire that way. Go with some solid core wire... | 102 | | M3 Bolts | https://www.amazon.com/dp/B0B31SC98Z | https://amzn.to/3nlqikM | M3 Socket Cap bolts for the 3D Printed Case | 103 | | Tiny Screws | https://www.amazon.com/dp/B09L4R6B1Q | https://amzn.to/3JLnSDx | I used some tiny screws to attach the ESP32 board to the bottom of the case. | 104 |

If you choose to use the above affiliate links I may receive a very small commision from Amazon at no extra cost to you

105 | 106 | 107 | 108 | ### Parts 109 | | **Parts** | **Referral Link** | **Non-Referral Link** | **Notes** | 110 | |----------------------|-------------------------|--------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 111 | | 8 Cherry MX Switches | https://amzn.to/3YT6VgA | https://www.amazon.com/dp/B07KMXJ4KG | I like the Blue switches because they're *very* click-y | 112 | | an ESP32 board | https://amzn.to/41l7mCi | https://www.amazon.com/dp/B08DR31G4G | These are to the cheapest ESP32 boards I could find on Amazon. Use whatever boards you like | 113 | | Relegendable Keycaps | https://amzn.to/3SmIaqX | https://www.amazon.com/dp/B01M023NFK | | 114 | 115 |

If you choose to use the above affiliate links I may receive a very small commision from Amazon at no extra cost to you

116 | 117 | 118 | ### Assembly 119 | - all switches are now connected to common GND and to their respective GPIOs (see ESPHome YAML files) 120 | - Note, your GPIO pins may be different based on the version of the board you use. I'm using the built-in PULLUP resistors on the ESP32 board for the switches. If you need to switch GPIO pins, make sure you use pins that have PULLUP resistors. 121 | ![](/assets/NO_LED/wiring_diagram_NO_LED.png) 122 | 123 |

124 | 125 | ![](/assets/NO_LED/inside_NO_LED.JPG) 126 | 127 | ### Case 128 | [STL files here](/3D_files) 129 | - I 3D printed my case. I've included two versions of the macropad case bottom. The images from the NO_LED version is using the 'short_bottom'. The short bottom version of the case makes things very tight, but everything should fit if you are careful with your wiring. Run the wires along the sides of the board, and keep them trimmed short. That said, If you don't want to put your soldering skills and smash and cram skills to the test, I also included a slightly taller version as well. 130 | 131 | - You can use the LED version of the case and it will still work well for the non-led version of the keypad. However, the LED version of the case requires your printer to be more dialed in, and you will likely need to print slower because it has more overhangs. 132 | - You will probably want to set your slicer to print the external perimeters first. The case is designed for the key switches to be pressure fit. Printing the outer walls first will help keep the print from over expanding and making your switches not fit. You can also dial back your flow settings to help keep things fitting as they should. If you're still struggling, you can also increase the dimensions of the STLs by 1 or 2 percent to help things fit a bit easier. NOTE: I have not tested printing the case larger, so I don't know how well the LEDs will fit when you size it up. 133 | - Finally, I'm not a 3D designer or engineer. I adapted the original design from thingiverse for my needs using Tinkercad. 134 | - [Macropad Top on Tinkercad](https://www.tinkercad.com/things/466cJwJKiFd-macropadv2topver37) 135 | - [Macropad Bottoms on Tinkercad](https://www.tinkercad.com/things/ekNTHmUWMJU-esp32macropadbottoms) 136 | 137 |
138 | 139 | ## Programming 140 | - Add your ESP device to Home Assistant once detected 141 | - Install esp32_keypad.yaml 142 | - Add your own automations (you can use the one here for inspiration). 143 | - Note: this uses events rather than binary sensors for recording multi-clicks. 144 | 145 | 146 | 147 | ## Icons 148 | [icons here](/icons) 149 | - I've included individual icons, a printable template, and a blank template for printing out your own icons for your relegendable keycaps. 150 | 151 | 152 | 153 | 154 | ## Credits 155 | inspired by: 156 | - https://github.com/sfgabe/OITProjects/tree/master/Baby_Buddy_Keypad 157 | - https://github.com/jeroenterheerdt/Baby-Buddy-Keypad. 158 | 159 | STLs: 160 | - Remixed from ['Macro Pad' on Thingiverse](https://www.thingiverse.com/thing:5628107) by tomtompoperdom 161 | 162 | icons: 163 | - [Icons for keypad courtesy of Freepik on Flaticon](https://www.flaticon.com/authors/freepik) 164 | - [blank template courtesy of X-keys](https://xkeys.com/) 165 | 166 | 167 | 168 | Special Thanks: 169 | - [jesserockz](https://github.com/jesserockz) & [ssieb](https://github.com/ssieb) on the [ESPHome Discord](https://discord.com/invite/KhAMKrd) for all the support getting this thing working. 170 | -------------------------------------------------------------------------------- /YAML/esp32_keypad_LED.yaml: -------------------------------------------------------------------------------- 1 | esphome: 2 | name: esp32-keypad 3 | friendly_name: eps32_keypad 4 | 5 | esp32: 6 | board: esp32dev 7 | framework: 8 | type: arduino 9 | 10 | # Enable logging 11 | logger: 12 | 13 | # Enable Home Assistant API 14 | api: 15 | encryption: 16 | key: !secret api_key 17 | 18 | ota: 19 | password: !secret ota_password 20 | 21 | wifi: 22 | ssid: !secret wifi_ssid 23 | password: !secret wifi_password 24 | 25 | # Enable fallback hotspot (captive portal) in case wifi connection fails 26 | ap: 27 | ssid: "esp32 Keypad Fallback Hotspot" 28 | password: !secret ssid_password 29 | 30 | captive_portal: 31 | 32 | #connections: all buttons are on GND and on their respective pins 33 | #(we are relying on esp32s built-in pullup resistors but could have used external resistors as well) 34 | #Button 1: GPIO25 / 35 | #Button 2: GPIO26 / 36 | #Button 3: GPIO27 / 37 | #Button 4: GPIO14 / 38 | 39 | #Button 5: GPIO19 / 40 | #Button 6: GPIO18 / 41 | #Button 7: GPI17 / 42 | #Button 8: GPIO16 43 | 44 | 45 | 46 | # Light Compenent 47 | light: 48 | - platform: fastled_clockless 49 | id: light1 50 | name: light1 51 | chipset: WS2812B 52 | pin: GPIO33 53 | num_leds: 16 54 | rgb_order: GRB 55 | default_transition_length: 0s 56 | restore_mode: RESTORE_AND_ON 57 | internal: True 58 | 59 | # Backlights 60 | - platform: partition 61 | name: "Backlight" 62 | id: backlight 63 | default_transition_length: 0s 64 | restore_mode: RESTORE_AND_ON 65 | on_turn_on: 66 | then: 67 | - light.control: 68 | id: backlight 69 | effect: Rainbow 70 | brightness: 60% 71 | segments: 72 | - id: light1 73 | from: 0 74 | to: 0 75 | - id: light1 76 | from: 2 77 | to: 2 78 | - id: light1 79 | from: 4 80 | to: 4 81 | - id: light1 82 | from: 6 83 | to: 6 84 | - id: light1 85 | from: 8 86 | to: 8 87 | - id: light1 88 | from: 10 89 | to: 10 90 | - id: light1 91 | from: 12 92 | to: 12 93 | - id: light1 94 | from: 14 95 | to: 14 96 | effects: 97 | - pulse: 98 | - pulse: 99 | name: "Fast Pulse" 100 | transition_length: 0.5s 101 | update_interval: 0.5s 102 | - pulse: 103 | name: "Slow Pulse" 104 | # transition_length: 1s # defaults to 1s 105 | update_interval: 2s 106 | - pulse: 107 | name: "Blink" 108 | transition_length: .25s # defaults to 1s 109 | update_interval: .25s 110 | - addressable_rainbow: 111 | name: "Rainbow" 112 | - addressable_rainbow: 113 | name: "Rainbow Skinny" 114 | speed: 10 115 | width: 25 116 | - addressable_scan: 117 | - addressable_scan: 118 | name: "Scan Fast" 119 | move_interval: 50ms 120 | scan_width: 1 121 | - addressable_twinkle: 122 | - addressable_random_twinkle: 123 | - addressable_fireworks: 124 | use_random_color: true 125 | name: Fireworks 126 | - addressable_flicker: 127 | 128 | # Light for each individual key 129 | - platform: partition 130 | name: "Key 1" 131 | id: key1 132 | segments: 133 | - id: light1 134 | from: 1 135 | to: 1 136 | default_transition_length: 0s 137 | 138 | - platform: partition 139 | name: "Key 2" 140 | id: key2 141 | segments: 142 | - id: light1 143 | from: 3 144 | to: 3 145 | default_transition_length: 0s 146 | 147 | - platform: partition 148 | name: "Key 3" 149 | id: key3 150 | segments: 151 | - id: light1 152 | from: 5 153 | to: 5 154 | default_transition_length: 0s 155 | 156 | - platform: partition 157 | name: "Key 4" 158 | id: key4 159 | segments: 160 | - id: light1 161 | from: 7 162 | to: 7 163 | default_transition_length: 0s 164 | 165 | - platform: partition 166 | name: "Key 5" 167 | id: key5 168 | segments: 169 | - id: light1 170 | from: 9 171 | to: 9 172 | default_transition_length: 0s 173 | 174 | - platform: partition 175 | name: "Key 6" 176 | id: key6 177 | segments: 178 | - id: light1 179 | from: 11 180 | to: 11 181 | default_transition_length: 0s 182 | 183 | - platform: partition 184 | name: "Key 7" 185 | id: key7 186 | segments: 187 | - id: light1 188 | from: 13 189 | to: 13 190 | default_transition_length: 0s 191 | 192 | - platform: partition 193 | name: "Key 8" 194 | id: key8 195 | segments: 196 | - id: light1 197 | from: 15 198 | to: 15 199 | default_transition_length: 0s 200 | 201 | 202 | 203 | binary_sensor: 204 | #Button 1 205 | - platform: gpio 206 | icon: "mdi:dialpad" 207 | name: "Keypad 2x4 Button 1" 208 | pin: 209 | number: GPIO25 210 | inverted: True 211 | mode: INPUT_PULLUP 212 | id: esp32_keypad_b1 213 | on_press: 214 | then: 215 | - light.turn_on: 216 | id: key1 217 | red: .5 218 | green: .5 219 | blue: .5 220 | on_release: 221 | then: 222 | - light.turn_off: 223 | id: key1 224 | 225 | on_multi_click: 226 | - timing: 227 | - ON for at most 1s 228 | - OFF for at most 1s 229 | - ON for at most 1s 230 | - OFF for at least 0.2s 231 | then: 232 | - logger.log: 233 | format: "Double Clicked" 234 | level: INFO 235 | - homeassistant.event: 236 | event: esphome.esp32_keypad_V2 237 | data: 238 | title: dbl_click 239 | button: b1 240 | - timing: 241 | - ON for at most 1s 242 | - OFF for at most 1s 243 | - ON for at most 1s 244 | - OFF for at most 1s 245 | - ON for at most 1s 246 | - OFF for at least 0.2s 247 | then: 248 | - logger.log: 249 | format: "Triple Clicked" 250 | level: INFO 251 | - homeassistant.event: 252 | event: esphome.esp32_keypad_V2 253 | data: 254 | title: triple_click 255 | button: b1 256 | - timing: 257 | - ON for 1s to 2s 258 | - OFF for at least 0.5s 259 | then: 260 | - logger.log: 261 | format: "Single Long Clicked" 262 | level: INFO 263 | - homeassistant.event: 264 | event: esphome.esp32_keypad_V2 265 | data: 266 | title: long_click 267 | button: b1 268 | - timing: 269 | - ON for at least 2.2s 270 | then: 271 | - logger.log: 272 | format: "Click and Hold" 273 | level: INFO 274 | - homeassistant.event: 275 | event: esphome.esp32_keypad_V2 276 | data: 277 | title: hold 278 | button: b1 279 | - timing: 280 | - ON for at most 1s 281 | - OFF for at least 0.5s 282 | then: 283 | - logger.log: 284 | format: "Single Short Clicked" 285 | level: INFO 286 | - homeassistant.event: 287 | event: esphome.esp32_keypad_V2 288 | data: 289 | title: single_click 290 | button: b1 291 | 292 | #Button 2 293 | - platform: gpio 294 | icon: "mdi:dialpad" 295 | name: "Keypad 2x4 Button 2" 296 | pin: 297 | number: GPIO26 298 | inverted: True 299 | mode: INPUT_PULLUP 300 | id: esp32_keypad_b2 301 | on_press: 302 | then: 303 | - light.turn_on: 304 | id: key2 305 | red: .5 306 | green: .5 307 | blue: .5 308 | on_release: 309 | then: 310 | - light.turn_off: 311 | id: key2 312 | on_multi_click: 313 | - timing: 314 | - ON for at most 1s 315 | - OFF for at most 1s 316 | - ON for at most 1s 317 | - OFF for at least 0.2s 318 | then: 319 | - logger.log: 320 | format: "Double Clicked" 321 | level: INFO 322 | - homeassistant.event: 323 | event: esphome.esp32_keypad_V2 324 | data: 325 | title: dbl_click 326 | button: b2 327 | - timing: 328 | - ON for at most 1s 329 | - OFF for at most 1s 330 | - ON for at most 1s 331 | - OFF for at most 1s 332 | - ON for at most 1s 333 | - OFF for at least 0.2s 334 | then: 335 | - logger.log: 336 | format: "Triple Clicked" 337 | level: INFO 338 | - homeassistant.event: 339 | event: esphome.esp32_keypad_V2 340 | data: 341 | title: triple_click 342 | button: b2 343 | - timing: 344 | - ON for 1s to 2s 345 | - OFF for at least 0.5s 346 | then: 347 | - logger.log: 348 | format: "Single Long Clicked" 349 | level: INFO 350 | - homeassistant.event: 351 | event: esphome.esp32_keypad_V2 352 | data: 353 | title: long_click 354 | button: b2 355 | - timing: 356 | - ON for at least 2.2s 357 | then: 358 | - logger.log: 359 | format: "Click and Hold" 360 | level: INFO 361 | - homeassistant.event: 362 | event: esphome.esp32_keypad_V2 363 | data: 364 | title: hold 365 | button: b2 366 | - timing: 367 | - ON for at most 1s 368 | - OFF for at least 0.5s 369 | then: 370 | - logger.log: 371 | format: "Single Short Clicked" 372 | level: INFO 373 | - homeassistant.event: 374 | event: esphome.esp32_keypad_V2 375 | data: 376 | title: single_click 377 | button: b2 378 | #Button 3 379 | - platform: gpio 380 | icon: "mdi:dialpad" 381 | name: "Keypad 2x4 Button 3" 382 | pin: 383 | number: GPIO27 384 | inverted: True 385 | mode: INPUT_PULLUP 386 | id: esp32_keypad_b3 387 | on_press: 388 | then: 389 | - light.turn_on: 390 | id: key3 391 | red: .5 392 | green: .5 393 | blue: .5 394 | on_release: 395 | then: 396 | - light.turn_off: 397 | id: key3 398 | on_multi_click: 399 | - timing: 400 | - ON for at most 1s 401 | - OFF for at most 1s 402 | - ON for at most 1s 403 | - OFF for at least 0.2s 404 | then: 405 | - logger.log: 406 | format: "Double Clicked" 407 | level: INFO 408 | - homeassistant.event: 409 | event: esphome.esp32_keypad_V2 410 | data: 411 | title: dbl_click 412 | button: b3 413 | - timing: 414 | - ON for at most 1s 415 | - OFF for at most 1s 416 | - ON for at most 1s 417 | - OFF for at most 1s 418 | - ON for at most 1s 419 | - OFF for at least 0.2s 420 | then: 421 | - logger.log: 422 | format: "Triple Clicked" 423 | level: INFO 424 | - homeassistant.event: 425 | event: esphome.esp32_keypad_V2 426 | data: 427 | title: triple_click 428 | button: b3 429 | - timing: 430 | - ON for 1s to 2s 431 | - OFF for at least 0.5s 432 | then: 433 | - logger.log: 434 | format: "Single Long Clicked" 435 | level: INFO 436 | - homeassistant.event: 437 | event: esphome.esp32_keypad_V2 438 | data: 439 | title: long_click 440 | button: b3 441 | - timing: 442 | - ON for at least 2.2s 443 | then: 444 | - logger.log: 445 | format: "Click and Hold" 446 | level: INFO 447 | - homeassistant.event: 448 | event: esphome.esp32_keypad_V2 449 | data: 450 | title: hold 451 | button: b3 452 | - timing: 453 | - ON for at most 1s 454 | - OFF for at least 0.5s 455 | then: 456 | - logger.log: 457 | format: "Single Short Clicked" 458 | level: INFO 459 | - homeassistant.event: 460 | event: esphome.esp32_keypad_V2 461 | data: 462 | title: single_click 463 | button: b3 464 | #Button 4 465 | - platform: gpio 466 | icon: "mdi:dialpad" 467 | name: "Keypad 2x4 Button 4" 468 | pin: 469 | number: GPIO14 470 | inverted: True 471 | mode: INPUT_PULLUP 472 | id: esp32_keypad_b4 473 | on_press: 474 | then: 475 | - light.turn_on: 476 | id: key4 477 | red: .5 478 | green: .5 479 | blue: .5 480 | on_release: 481 | then: 482 | - light.turn_off: 483 | id: key4 484 | on_multi_click: 485 | - timing: 486 | - ON for at most 1s 487 | - OFF for at most 1s 488 | - ON for at most 1s 489 | - OFF for at least 0.2s 490 | then: 491 | - logger.log: 492 | format: "Double Clicked" 493 | level: INFO 494 | - homeassistant.event: 495 | event: esphome.esp32_keypad_V2 496 | data: 497 | title: dbl_click 498 | button: b4 499 | - timing: 500 | - ON for at most 1s 501 | - OFF for at most 1s 502 | - ON for at most 1s 503 | - OFF for at most 1s 504 | - ON for at most 1s 505 | - OFF for at least 0.2s 506 | then: 507 | - logger.log: 508 | format: "Triple Clicked" 509 | level: INFO 510 | - homeassistant.event: 511 | event: esphome.esp32_keypad_V2 512 | data: 513 | title: triple_click 514 | button: b4 515 | - timing: 516 | - ON for 1s to 2s 517 | - OFF for at least 0.5s 518 | then: 519 | - logger.log: 520 | format: "Single Long Clicked" 521 | level: INFO 522 | - homeassistant.event: 523 | event: esphome.esp32_keypad_V2 524 | data: 525 | title: long_click 526 | button: b4 527 | - timing: 528 | - ON for at least 2.2s 529 | then: 530 | - logger.log: 531 | format: "Click and Hold" 532 | level: INFO 533 | - homeassistant.event: 534 | event: esphome.esp32_keypad_V2 535 | data: 536 | title: hold 537 | button: b4 538 | - timing: 539 | - ON for at most 1s 540 | - OFF for at least 0.5s 541 | then: 542 | - logger.log: 543 | format: "Single Short Clicked" 544 | level: INFO 545 | - homeassistant.event: 546 | event: esphome.esp32_keypad_V2 547 | data: 548 | title: single_click 549 | button: b4 550 | #Button 5 551 | - platform: gpio 552 | icon: "mdi:dialpad" 553 | name: "Keypad 2x4 Button 5" 554 | pin: 555 | number: GPIO19 556 | inverted: True 557 | mode: INPUT_PULLUP 558 | id: esp32_keypad_b5 559 | on_press: 560 | then: 561 | - light.turn_on: 562 | id: key5 563 | red: .5 564 | green: .5 565 | blue: .5 566 | on_release: 567 | then: 568 | - light.turn_off: 569 | id: key5 570 | on_multi_click: 571 | - timing: 572 | - ON for at most 1s 573 | - OFF for at most 1s 574 | - ON for at most 1s 575 | - OFF for at least 0.2s 576 | then: 577 | - logger.log: 578 | format: "Double Clicked" 579 | level: INFO 580 | - homeassistant.event: 581 | event: esphome.esp32_keypad_V2 582 | data: 583 | title: dbl_click 584 | button: b5 585 | - timing: 586 | - ON for at most 1s 587 | - OFF for at most 1s 588 | - ON for at most 1s 589 | - OFF for at most 1s 590 | - ON for at most 1s 591 | - OFF for at least 0.2s 592 | then: 593 | - logger.log: 594 | format: "Triple Clicked" 595 | level: INFO 596 | - homeassistant.event: 597 | event: esphome.esp32_keypad_V2 598 | data: 599 | title: triple_click 600 | button: b5 601 | - timing: 602 | - ON for 1s to 2s 603 | - OFF for at least 0.5s 604 | then: 605 | - logger.log: 606 | format: "Single Long Clicked" 607 | level: INFO 608 | - homeassistant.event: 609 | event: esphome.esp32_keypad_V2 610 | data: 611 | title: long_click 612 | button: b5 613 | - timing: 614 | - ON for at least 2.2s 615 | then: 616 | - logger.log: 617 | format: "Click and Hold" 618 | level: INFO 619 | - homeassistant.event: 620 | event: esphome.esp32_keypad_V2 621 | data: 622 | title: hold 623 | button: b5 624 | - timing: 625 | - ON for at most 1s 626 | - OFF for at least 0.5s 627 | then: 628 | - logger.log: 629 | format: "Single Short Clicked" 630 | level: INFO 631 | - homeassistant.event: 632 | event: esphome.esp32_keypad_V2 633 | data: 634 | title: single_click 635 | button: b5 636 | #Button 6 637 | - platform: gpio 638 | icon: "mdi:dialpad" 639 | name: "Keypad 2x4 Button 6" 640 | pin: 641 | number: GPIO18 642 | inverted: True 643 | mode: INPUT_PULLUP 644 | id: esp32_keypad_b6 645 | on_press: 646 | then: 647 | - light.turn_on: 648 | id: key6 649 | red: .5 650 | green: .5 651 | blue: .5 652 | on_release: 653 | then: 654 | - light.turn_off: 655 | id: key6 656 | on_multi_click: 657 | - timing: 658 | - ON for at most 1s 659 | - OFF for at most 1s 660 | - ON for at most 1s 661 | - OFF for at least 0.2s 662 | then: 663 | - logger.log: 664 | format: "Double Clicked" 665 | level: INFO 666 | - homeassistant.event: 667 | event: esphome.esp32_keypad_V2 668 | data: 669 | title: dbl_click 670 | button: b6 671 | - timing: 672 | - ON for at most 1s 673 | - OFF for at most 1s 674 | - ON for at most 1s 675 | - OFF for at most 1s 676 | - ON for at most 1s 677 | - OFF for at least 0.2s 678 | then: 679 | - logger.log: 680 | format: "Triple Clicked" 681 | level: INFO 682 | - homeassistant.event: 683 | event: esphome.esp32_keypad_V2 684 | data: 685 | title: triple_click 686 | button: b6 687 | - timing: 688 | - ON for 1s to 2s 689 | - OFF for at least 0.5s 690 | then: 691 | - logger.log: 692 | format: "Single Long Clicked" 693 | level: INFO 694 | - homeassistant.event: 695 | event: esphome.esp32_keypad_V2 696 | data: 697 | title: long_click 698 | button: b6 699 | - timing: 700 | - ON for at least 2.2s 701 | then: 702 | - logger.log: 703 | format: "Click and Hold" 704 | level: INFO 705 | - homeassistant.event: 706 | event: esphome.esp32_keypad_V2 707 | data: 708 | title: hold 709 | button: b6 710 | - timing: 711 | - ON for at most 1s 712 | - OFF for at least 0.5s 713 | then: 714 | - logger.log: 715 | format: "Single Short Clicked" 716 | level: INFO 717 | - homeassistant.event: 718 | event: esphome.esp32_keypad_V2 719 | data: 720 | title: single_click 721 | button: b6 722 | #Button 7 723 | - platform: gpio 724 | icon: "mdi:dialpad" 725 | name: "Keypad 2x4 Button 7" 726 | pin: 727 | number: GPIO17 728 | inverted: True 729 | mode: INPUT_PULLUP 730 | id: esp32_keypad_b7 731 | on_press: 732 | then: 733 | - light.turn_on: 734 | id: key7 735 | red: .5 736 | green: .5 737 | blue: .5 738 | on_release: 739 | then: 740 | - light.turn_off: 741 | id: key7 742 | on_multi_click: 743 | - timing: 744 | - ON for at most 1s 745 | - OFF for at most 1s 746 | - ON for at most 1s 747 | - OFF for at least 0.2s 748 | then: 749 | - logger.log: 750 | format: "Double Clicked" 751 | level: INFO 752 | - homeassistant.event: 753 | event: esphome.esp32_keypad_V2 754 | data: 755 | title: dbl_click 756 | button: b7 757 | - timing: 758 | - ON for at most 1s 759 | - OFF for at most 1s 760 | - ON for at most 1s 761 | - OFF for at most 1s 762 | - ON for at most 1s 763 | - OFF for at least 0.2s 764 | then: 765 | - logger.log: 766 | format: "Triple Clicked" 767 | level: INFO 768 | - homeassistant.event: 769 | event: esphome.esp32_keypad_V2 770 | data: 771 | title: triple_click 772 | button: b7 773 | - timing: 774 | - ON for 1s to 2s 775 | - OFF for at least 0.5s 776 | then: 777 | - logger.log: 778 | format: "Single Long Clicked" 779 | level: INFO 780 | - homeassistant.event: 781 | event: esphome.esp32_keypad_V2 782 | data: 783 | title: long_click 784 | button: b7 785 | - timing: 786 | - ON for at least 2.2s 787 | then: 788 | - logger.log: 789 | format: "Click and Hold" 790 | level: INFO 791 | - homeassistant.event: 792 | event: esphome.esp32_keypad_V2 793 | data: 794 | title: hold 795 | button: b7 796 | - timing: 797 | - ON for at most 1s 798 | - OFF for at least 0.5s 799 | then: 800 | - logger.log: 801 | format: "Single Short Clicked" 802 | level: INFO 803 | - homeassistant.event: 804 | event: esphome.esp32_keypad_V2 805 | data: 806 | title: single_click 807 | button: b7 808 | #Button 8 809 | - platform: gpio 810 | icon: "mdi:dialpad" 811 | name: "Keypad 2x4 Button 8" 812 | pin: 813 | number: GPIO16 814 | inverted: True 815 | mode: INPUT_PULLUP 816 | id: esp32_keypad_b8 817 | on_press: 818 | then: 819 | - light.turn_on: 820 | id: key8 821 | red: .5 822 | green: .5 823 | blue: .5 824 | on_release: 825 | then: 826 | - light.turn_off: 827 | id: key8 828 | on_multi_click: 829 | - timing: 830 | - ON for at most 1s 831 | - OFF for at most 1s 832 | - ON for at most 1s 833 | - OFF for at least 0.2s 834 | then: 835 | - logger.log: 836 | format: "Double Clicked" 837 | level: INFO 838 | - homeassistant.event: 839 | event: esphome.esp32_keypad_V2 840 | data: 841 | title: dbl_click 842 | button: b8 843 | - timing: 844 | - ON for at most 1s 845 | - OFF for at most 1s 846 | - ON for at most 1s 847 | - OFF for at most 1s 848 | - ON for at most 1s 849 | - OFF for at least 0.2s 850 | then: 851 | - logger.log: 852 | format: "Triple Clicked" 853 | level: INFO 854 | - homeassistant.event: 855 | event: esphome.esp32_keypad_V2 856 | data: 857 | title: triple_click 858 | button: b8 859 | - timing: 860 | - ON for 1s to 2s 861 | - OFF for at least 0.5s 862 | then: 863 | - logger.log: 864 | format: "Single Long Clicked" 865 | level: INFO 866 | - homeassistant.event: 867 | event: esphome.esp32_keypad_V2 868 | data: 869 | title: long_click 870 | button: b8 871 | - timing: 872 | - ON for at least 2.2s 873 | then: 874 | - logger.log: 875 | format: "Click and Hold" 876 | level: INFO 877 | - homeassistant.event: 878 | event: esphome.esp32_keypad_V2 879 | data: 880 | title: hold 881 | button: b8 882 | - timing: 883 | - ON for at most 1s 884 | - OFF for at least 0.5s 885 | then: 886 | - logger.log: 887 | format: "Single Short Clicked" 888 | level: INFO 889 | - homeassistant.event: 890 | event: esphome.esp32_keypad_V2 891 | data: 892 | title: single_click 893 | button: b8 894 | -------------------------------------------------------------------------------- /YAML/esp32_keypad_NO_LED.yaml: -------------------------------------------------------------------------------- 1 | esphome: 2 | name: esp32-keypad 3 | friendly_name: eps32_keypad 4 | 5 | esp32: 6 | board: esp32dev 7 | framework: 8 | type: arduino 9 | 10 | # Enable logging 11 | logger: 12 | 13 | # Enable Home Assistant API 14 | api: 15 | encryption: 16 | key: !secret api_key 17 | 18 | ota: 19 | password: !secret ota_password 20 | 21 | wifi: 22 | ssid: !secret wifi_ssid 23 | password: !secret wifi_password 24 | 25 | # Enable fallback hotspot (captive portal) in case wifi connection fails 26 | ap: 27 | ssid: "esp32 Keypad Fallback Hotspot" 28 | password: !secret ssid_password 29 | 30 | captive_portal: 31 | 32 | #connections: all buttons are on GND and on their respective pins 33 | #(we are relying on esp32s built-in pullup resistors but could have used external resistors as well) 34 | #Button 1: GPIO25 / 35 | #Button 2: GPIO26 / 36 | #Button 3: GPIO27 / 37 | #Button 4: GPIO14 / 38 | 39 | #Button 5: GPIO19 / 40 | #Button 6: GPIO18 / 41 | #Button 7: GPI17 / 42 | #Button 8: GPIO16 43 | 44 | binary_sensor: 45 | #Button 1 46 | - platform: gpio 47 | icon: "mdi:dialpad" 48 | name: "Keypad 2x4 Button 1" 49 | pin: 50 | number: GPIO25 51 | inverted: True 52 | mode: INPUT_PULLUP 53 | id: esp32_keypad_b1 54 | 55 | on_multi_click: 56 | - timing: 57 | - ON for at most 1s 58 | - OFF for at most 1s 59 | - ON for at most 1s 60 | - OFF for at least 0.2s 61 | then: 62 | - logger.log: 63 | format: "Double Clicked" 64 | level: INFO 65 | - homeassistant.event: 66 | event: esphome.esp32_keypad_V2 67 | data: 68 | title: dbl_click 69 | button: b1 70 | - timing: 71 | - ON for at most 1s 72 | - OFF for at most 1s 73 | - ON for at most 1s 74 | - OFF for at most 1s 75 | - ON for at most 1s 76 | - OFF for at least 0.2s 77 | then: 78 | - logger.log: 79 | format: "Triple Clicked" 80 | level: INFO 81 | - homeassistant.event: 82 | event: esphome.esp32_keypad_V2 83 | data: 84 | title: triple_click 85 | button: b1 86 | - timing: 87 | - ON for 1s to 2s 88 | - OFF for at least 0.5s 89 | then: 90 | - logger.log: 91 | format: "Single Long Clicked" 92 | level: INFO 93 | - homeassistant.event: 94 | event: esphome.esp32_keypad_V2 95 | data: 96 | title: long_click 97 | button: b1 98 | - timing: 99 | - ON for at least 2.2s 100 | then: 101 | - logger.log: 102 | format: "Click and Hold" 103 | level: INFO 104 | - homeassistant.event: 105 | event: esphome.esp32_keypad_V2 106 | data: 107 | title: hold 108 | button: b1 109 | - timing: 110 | - ON for at most 1s 111 | - OFF for at least 0.5s 112 | then: 113 | - logger.log: 114 | format: "Single Short Clicked" 115 | level: INFO 116 | - homeassistant.event: 117 | event: esphome.esp32_keypad_V2 118 | data: 119 | title: single_click 120 | button: b1 121 | 122 | #Button 2 123 | - platform: gpio 124 | icon: "mdi:dialpad" 125 | name: "Keypad 2x4 Button 2" 126 | pin: 127 | number: GPIO26 128 | inverted: True 129 | mode: INPUT_PULLUP 130 | id: esp32_keypad_b2 131 | 132 | on_multi_click: 133 | - timing: 134 | - ON for at most 1s 135 | - OFF for at most 1s 136 | - ON for at most 1s 137 | - OFF for at least 0.2s 138 | then: 139 | - logger.log: 140 | format: "Double Clicked" 141 | level: INFO 142 | - homeassistant.event: 143 | event: esphome.esp32_keypad_V2 144 | data: 145 | title: dbl_click 146 | button: b2 147 | - timing: 148 | - ON for at most 1s 149 | - OFF for at most 1s 150 | - ON for at most 1s 151 | - OFF for at most 1s 152 | - ON for at most 1s 153 | - OFF for at least 0.2s 154 | then: 155 | - logger.log: 156 | format: "Triple Clicked" 157 | level: INFO 158 | - homeassistant.event: 159 | event: esphome.esp32_keypad_V2 160 | data: 161 | title: triple_click 162 | button: b2 163 | - timing: 164 | - ON for 1s to 2s 165 | - OFF for at least 0.5s 166 | then: 167 | - logger.log: 168 | format: "Single Long Clicked" 169 | level: INFO 170 | - homeassistant.event: 171 | event: esphome.esp32_keypad_V2 172 | data: 173 | title: long_click 174 | button: b2 175 | - timing: 176 | - ON for at least 2.2s 177 | then: 178 | - logger.log: 179 | format: "Click and Hold" 180 | level: INFO 181 | - homeassistant.event: 182 | event: esphome.esp32_keypad_V2 183 | data: 184 | title: hold 185 | button: b2 186 | - timing: 187 | - ON for at most 1s 188 | - OFF for at least 0.5s 189 | then: 190 | - logger.log: 191 | format: "Single Short Clicked" 192 | level: INFO 193 | - homeassistant.event: 194 | event: esphome.esp32_keypad_V2 195 | data: 196 | title: single_click 197 | button: b2 198 | #Button 3 199 | - platform: gpio 200 | icon: "mdi:dialpad" 201 | name: "Keypad 2x4 Button 3" 202 | pin: 203 | number: GPIO27 204 | inverted: True 205 | mode: INPUT_PULLUP 206 | id: esp32_keypad_b3 207 | 208 | on_multi_click: 209 | - timing: 210 | - ON for at most 1s 211 | - OFF for at most 1s 212 | - ON for at most 1s 213 | - OFF for at least 0.2s 214 | then: 215 | - logger.log: 216 | format: "Double Clicked" 217 | level: INFO 218 | - homeassistant.event: 219 | event: esphome.esp32_keypad_V2 220 | data: 221 | title: dbl_click 222 | button: b3 223 | - timing: 224 | - ON for at most 1s 225 | - OFF for at most 1s 226 | - ON for at most 1s 227 | - OFF for at most 1s 228 | - ON for at most 1s 229 | - OFF for at least 0.2s 230 | then: 231 | - logger.log: 232 | format: "Triple Clicked" 233 | level: INFO 234 | - homeassistant.event: 235 | event: esphome.esp32_keypad_V2 236 | data: 237 | title: triple_click 238 | button: b3 239 | - timing: 240 | - ON for 1s to 2s 241 | - OFF for at least 0.5s 242 | then: 243 | - logger.log: 244 | format: "Single Long Clicked" 245 | level: INFO 246 | - homeassistant.event: 247 | event: esphome.esp32_keypad_V2 248 | data: 249 | title: long_click 250 | button: b3 251 | - timing: 252 | - ON for at least 2.2s 253 | then: 254 | - logger.log: 255 | format: "Click and Hold" 256 | level: INFO 257 | - homeassistant.event: 258 | event: esphome.esp32_keypad_V2 259 | data: 260 | title: hold 261 | button: b3 262 | - timing: 263 | - ON for at most 1s 264 | - OFF for at least 0.5s 265 | then: 266 | - logger.log: 267 | format: "Single Short Clicked" 268 | level: INFO 269 | - homeassistant.event: 270 | event: esphome.esp32_keypad_V2 271 | data: 272 | title: single_click 273 | button: b3 274 | #Button 4 275 | - platform: gpio 276 | icon: "mdi:dialpad" 277 | name: "Keypad 2x4 Button 4" 278 | pin: 279 | number: GPIO14 280 | inverted: True 281 | mode: INPUT_PULLUP 282 | id: esp32_keypad_b4 283 | 284 | on_multi_click: 285 | - timing: 286 | - ON for at most 1s 287 | - OFF for at most 1s 288 | - ON for at most 1s 289 | - OFF for at least 0.2s 290 | then: 291 | - logger.log: 292 | format: "Double Clicked" 293 | level: INFO 294 | - homeassistant.event: 295 | event: esphome.esp32_keypad_V2 296 | data: 297 | title: dbl_click 298 | button: b4 299 | - timing: 300 | - ON for at most 1s 301 | - OFF for at most 1s 302 | - ON for at most 1s 303 | - OFF for at most 1s 304 | - ON for at most 1s 305 | - OFF for at least 0.2s 306 | then: 307 | - logger.log: 308 | format: "Triple Clicked" 309 | level: INFO 310 | - homeassistant.event: 311 | event: esphome.esp32_keypad_V2 312 | data: 313 | title: triple_click 314 | button: b4 315 | - timing: 316 | - ON for 1s to 2s 317 | - OFF for at least 0.5s 318 | then: 319 | - logger.log: 320 | format: "Single Long Clicked" 321 | level: INFO 322 | - homeassistant.event: 323 | event: esphome.esp32_keypad_V2 324 | data: 325 | title: long_click 326 | button: b4 327 | - timing: 328 | - ON for at least 2.2s 329 | then: 330 | - logger.log: 331 | format: "Click and Hold" 332 | level: INFO 333 | - homeassistant.event: 334 | event: esphome.esp32_keypad_V2 335 | data: 336 | title: hold 337 | button: b4 338 | - timing: 339 | - ON for at most 1s 340 | - OFF for at least 0.5s 341 | then: 342 | - logger.log: 343 | format: "Single Short Clicked" 344 | level: INFO 345 | - homeassistant.event: 346 | event: esphome.esp32_keypad_V2 347 | data: 348 | title: single_click 349 | button: b4 350 | #Button 5 351 | - platform: gpio 352 | icon: "mdi:dialpad" 353 | name: "Keypad 2x4 Button 5" 354 | pin: 355 | number: GPIO19 356 | inverted: True 357 | mode: INPUT_PULLUP 358 | id: esp32_keypad_b5 359 | 360 | on_multi_click: 361 | - timing: 362 | - ON for at most 1s 363 | - OFF for at most 1s 364 | - ON for at most 1s 365 | - OFF for at least 0.2s 366 | then: 367 | - logger.log: 368 | format: "Double Clicked" 369 | level: INFO 370 | - homeassistant.event: 371 | event: esphome.esp32_keypad_V2 372 | data: 373 | title: dbl_click 374 | button: b5 375 | - timing: 376 | - ON for at most 1s 377 | - OFF for at most 1s 378 | - ON for at most 1s 379 | - OFF for at most 1s 380 | - ON for at most 1s 381 | - OFF for at least 0.2s 382 | then: 383 | - logger.log: 384 | format: "Triple Clicked" 385 | level: INFO 386 | - homeassistant.event: 387 | event: esphome.esp32_keypad_V2 388 | data: 389 | title: triple_click 390 | button: b5 391 | - timing: 392 | - ON for 1s to 2s 393 | - OFF for at least 0.5s 394 | then: 395 | - logger.log: 396 | format: "Single Long Clicked" 397 | level: INFO 398 | - homeassistant.event: 399 | event: esphome.esp32_keypad_V2 400 | data: 401 | title: long_click 402 | button: b5 403 | - timing: 404 | - ON for at least 2.2s 405 | then: 406 | - logger.log: 407 | format: "Click and Hold" 408 | level: INFO 409 | - homeassistant.event: 410 | event: esphome.esp32_keypad_V2 411 | data: 412 | title: hold 413 | button: b5 414 | - timing: 415 | - ON for at most 1s 416 | - OFF for at least 0.5s 417 | then: 418 | - logger.log: 419 | format: "Single Short Clicked" 420 | level: INFO 421 | - homeassistant.event: 422 | event: esphome.esp32_keypad_V2 423 | data: 424 | title: single_click 425 | button: b5 426 | #Button 6 427 | - platform: gpio 428 | icon: "mdi:dialpad" 429 | name: "Keypad 2x4 Button 6" 430 | pin: 431 | number: GPIO18 432 | inverted: True 433 | mode: INPUT_PULLUP 434 | id: esp32_keypad_b6 435 | 436 | on_multi_click: 437 | - timing: 438 | - ON for at most 1s 439 | - OFF for at most 1s 440 | - ON for at most 1s 441 | - OFF for at least 0.2s 442 | then: 443 | - logger.log: 444 | format: "Double Clicked" 445 | level: INFO 446 | - homeassistant.event: 447 | event: esphome.esp32_keypad_V2 448 | data: 449 | title: dbl_click 450 | button: b6 451 | - timing: 452 | - ON for at most 1s 453 | - OFF for at most 1s 454 | - ON for at most 1s 455 | - OFF for at most 1s 456 | - ON for at most 1s 457 | - OFF for at least 0.2s 458 | then: 459 | - logger.log: 460 | format: "Triple Clicked" 461 | level: INFO 462 | - homeassistant.event: 463 | event: esphome.esp32_keypad_V2 464 | data: 465 | title: triple_click 466 | button: b6 467 | - timing: 468 | - ON for 1s to 2s 469 | - OFF for at least 0.5s 470 | then: 471 | - logger.log: 472 | format: "Single Long Clicked" 473 | level: INFO 474 | - homeassistant.event: 475 | event: esphome.esp32_keypad_V2 476 | data: 477 | title: long_click 478 | button: b6 479 | - timing: 480 | - ON for at least 2.2s 481 | then: 482 | - logger.log: 483 | format: "Click and Hold" 484 | level: INFO 485 | - homeassistant.event: 486 | event: esphome.esp32_keypad_V2 487 | data: 488 | title: hold 489 | button: b6 490 | - timing: 491 | - ON for at most 1s 492 | - OFF for at least 0.5s 493 | then: 494 | - logger.log: 495 | format: "Single Short Clicked" 496 | level: INFO 497 | - homeassistant.event: 498 | event: esphome.esp32_keypad_V2 499 | data: 500 | title: single_click 501 | button: b6 502 | #Button 7 503 | - platform: gpio 504 | icon: "mdi:dialpad" 505 | name: "Keypad 2x4 Button 7" 506 | pin: 507 | number: GPIO17 508 | inverted: True 509 | mode: INPUT_PULLUP 510 | id: esp32_keypad_b7 511 | 512 | on_multi_click: 513 | - timing: 514 | - ON for at most 1s 515 | - OFF for at most 1s 516 | - ON for at most 1s 517 | - OFF for at least 0.2s 518 | then: 519 | - logger.log: 520 | format: "Double Clicked" 521 | level: INFO 522 | - homeassistant.event: 523 | event: esphome.esp32_keypad_V2 524 | data: 525 | title: dbl_click 526 | button: b7 527 | - timing: 528 | - ON for at most 1s 529 | - OFF for at most 1s 530 | - ON for at most 1s 531 | - OFF for at most 1s 532 | - ON for at most 1s 533 | - OFF for at least 0.2s 534 | then: 535 | - logger.log: 536 | format: "Triple Clicked" 537 | level: INFO 538 | - homeassistant.event: 539 | event: esphome.esp32_keypad_V2 540 | data: 541 | title: triple_click 542 | button: b7 543 | - timing: 544 | - ON for 1s to 2s 545 | - OFF for at least 0.5s 546 | then: 547 | - logger.log: 548 | format: "Single Long Clicked" 549 | level: INFO 550 | - homeassistant.event: 551 | event: esphome.esp32_keypad_V2 552 | data: 553 | title: long_click 554 | button: b7 555 | - timing: 556 | - ON for at least 2.2s 557 | then: 558 | - logger.log: 559 | format: "Click and Hold" 560 | level: INFO 561 | - homeassistant.event: 562 | event: esphome.esp32_keypad_V2 563 | data: 564 | title: hold 565 | button: b7 566 | - timing: 567 | - ON for at most 1s 568 | - OFF for at least 0.5s 569 | then: 570 | - logger.log: 571 | format: "Single Short Clicked" 572 | level: INFO 573 | - homeassistant.event: 574 | event: esphome.esp32_keypad_V2 575 | data: 576 | title: single_click 577 | button: b7 578 | #Button 8 579 | - platform: gpio 580 | icon: "mdi:dialpad" 581 | name: "Keypad 2x4 Button 8" 582 | pin: 583 | number: GPIO16 584 | inverted: True 585 | mode: INPUT_PULLUP 586 | id: esp32_keypad_b8 587 | 588 | on_multi_click: 589 | - timing: 590 | - ON for at most 1s 591 | - OFF for at most 1s 592 | - ON for at most 1s 593 | - OFF for at least 0.2s 594 | then: 595 | - logger.log: 596 | format: "Double Clicked" 597 | level: INFO 598 | - homeassistant.event: 599 | event: esphome.esp32_keypad_V2 600 | data: 601 | title: dbl_click 602 | button: b8 603 | - timing: 604 | - ON for at most 1s 605 | - OFF for at most 1s 606 | - ON for at most 1s 607 | - OFF for at most 1s 608 | - ON for at most 1s 609 | - OFF for at least 0.2s 610 | then: 611 | - logger.log: 612 | format: "Triple Clicked" 613 | level: INFO 614 | - homeassistant.event: 615 | event: esphome.esp32_keypad_V2 616 | data: 617 | title: triple_click 618 | button: b8 619 | - timing: 620 | - ON for 1s to 2s 621 | - OFF for at least 0.5s 622 | then: 623 | - logger.log: 624 | format: "Single Long Clicked" 625 | level: INFO 626 | - homeassistant.event: 627 | event: esphome.esp32_keypad_V2 628 | data: 629 | title: long_click 630 | button: b8 631 | - timing: 632 | - ON for at least 2.2s 633 | then: 634 | - logger.log: 635 | format: "Click and Hold" 636 | level: INFO 637 | - homeassistant.event: 638 | event: esphome.esp32_keypad_V2 639 | data: 640 | title: hold 641 | button: b8 642 | - timing: 643 | - ON for at most 1s 644 | - OFF for at least 0.5s 645 | then: 646 | - logger.log: 647 | format: "Single Short Clicked" 648 | level: INFO 649 | - homeassistant.event: 650 | event: esphome.esp32_keypad_V2 651 | data: 652 | title: single_click 653 | button: b8 654 | -------------------------------------------------------------------------------- /assets/LED/Inside_LED.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/assets/LED/Inside_LED.JPG -------------------------------------------------------------------------------- /assets/LED/LED_Layout.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/assets/LED/LED_Layout.JPG -------------------------------------------------------------------------------- /assets/LED/RGB_Lighting_Demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/assets/LED/RGB_Lighting_Demo.gif -------------------------------------------------------------------------------- /assets/LED/Top_LED.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/assets/LED/Top_LED.JPG -------------------------------------------------------------------------------- /assets/LED/common_GND.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/assets/LED/common_GND.JPG -------------------------------------------------------------------------------- /assets/LED/wiring_diagram_LED.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/assets/LED/wiring_diagram_LED.png -------------------------------------------------------------------------------- /assets/NO_LED/inside_NO_LED.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/assets/NO_LED/inside_NO_LED.JPG -------------------------------------------------------------------------------- /assets/NO_LED/top_NO_LED.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/assets/NO_LED/top_NO_LED.JPG -------------------------------------------------------------------------------- /assets/NO_LED/wiring_diagram_NO_LED.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/assets/NO_LED/wiring_diagram_NO_LED.png -------------------------------------------------------------------------------- /automations/baby_buddy_keypad_automation.yaml: -------------------------------------------------------------------------------- 1 | alias: Baby Buddy Keypad V2 2 | description: Do stuff when the keypad buttons are pressed 3 | trigger: 4 | - platform: event 5 | event_type: esphome.esp32_keypad 6 | id: Button_1 7 | event_data: 8 | title: single_click 9 | button: b1 10 | - platform: event 11 | event_type: esphome.esp32_keypad 12 | event_data: 13 | title: single_click 14 | button: b2 15 | id: Button_2 16 | - platform: event 17 | event_type: esphome.esp32_keypad 18 | event_data: 19 | title: single_click 20 | button: b3 21 | id: Button_3 22 | - platform: event 23 | event_type: esphome.esp32_keypad 24 | event_data: 25 | title: single_click 26 | button: b4 27 | id: Button_4 28 | - platform: event 29 | event_type: esphome.esp32_keypad 30 | event_data: 31 | title: dbl_click 32 | button: b4 33 | id: Diaper_double_click 34 | - platform: event 35 | event_type: esphome.esp32_keypad 36 | event_data: 37 | title: triple_click 38 | button: b4 39 | id: Diaper_triple_click 40 | - platform: event 41 | event_type: esphome.esp32_keypad 42 | event_data: 43 | title: single_click 44 | button: b5 45 | id: Button_5 46 | - platform: event 47 | event_type: esphome.esp32_keypad 48 | event_data: 49 | title: single_click 50 | button: b6 51 | id: Button_6 52 | - platform: event 53 | event_type: esphome.esp32_keypad 54 | event_data: 55 | title: single_click 56 | button: b7 57 | id: Button_7 58 | - platform: event 59 | event_type: esphome.esp32_keypad 60 | event_data: 61 | title: single_click 62 | button: b8 63 | id: Button_8 64 | condition: [] 65 | action: 66 | - choose: 67 | - conditions: 68 | - condition: trigger 69 | id: Button_1 70 | sequence: 71 | - if: 72 | - condition: template 73 | value_template: "{{state_attr('sensor.$BABY_$NAME_last_timer', 'active')}}" 74 | then: 75 | - service: babybuddy.add_feeding 76 | data: 77 | timer: true 78 | type: Breast milk 79 | method: Left breast 80 | target: 81 | entity_id: switch.$BABY_$NAME_timer 82 | - service: notify.all_phones 83 | data: 84 | title: Baby Buddy 85 | message: > 86 | Left Breast Logged Duration: {{ 87 | states.sensor.bb_timer_formatted.state }} 88 | data: 89 | clickAction: $YOUR.BB.URL:8000/feedings/ 90 | url: $YOUR.BB.URL:8000/feedings/ 91 | persistent: true 92 | title: Baby Buddy 93 | - service: input_text.set_value 94 | data: 95 | value: "" 96 | target: 97 | entity_id: input_text.bb_notes 98 | - service: input_number.set_value 99 | data: 100 | value: 0 101 | target: 102 | entity_id: input_number.bb_amount 103 | - service: counter.increment 104 | data: {} 105 | target: 106 | entity_id: counter.bb_feeding_counter 107 | else: 108 | - service: switch.turn_on 109 | data: {} 110 | target: 111 | entity_id: switch.$BABY_$NAME_timer 112 | - service: notify.all_phones 113 | data: 114 | title: Baby Buddy 115 | message: | 116 | Left Breast Timer Started 117 | data: 118 | clickAction: $YOUR.BB.URL:8000/timers/ 119 | url: $YOUR.BB.URL:8000/timers/ 120 | persistent: true 121 | title: Baby Buddy 122 | - conditions: 123 | - condition: trigger 124 | id: Button_2 125 | sequence: 126 | - if: 127 | - condition: template 128 | value_template: "{{state_attr('sensor.$BABY_$NAME_last_timer', 'active')}}" 129 | then: 130 | - service: babybuddy.add_feeding 131 | data: 132 | timer: true 133 | type: Breast milk 134 | method: Right breast 135 | target: 136 | entity_id: switch.$BABY_$NAME_timer 137 | - service: notify.all_phones 138 | data: 139 | title: Baby Buddy 140 | message: > 141 | Right Breast Logged Duration: {{ 142 | states.sensor.bb_timer_formatted.state }} 143 | data: 144 | clickAction: $YOUR.BB.URL:8000/feedings/ 145 | url: $YOUR.BB.URL:8000/feedings/ 146 | persistent: true 147 | title: Baby Buddy 148 | - service: input_text.set_value 149 | data: 150 | value: "" 151 | target: 152 | entity_id: input_text.bb_notes 153 | - service: input_number.set_value 154 | data: 155 | value: 0 156 | target: 157 | entity_id: input_number.bb_amount 158 | - service: counter.increment 159 | data: {} 160 | target: 161 | entity_id: counter.bb_feeding_counter 162 | else: 163 | - service: switch.turn_on 164 | data: {} 165 | target: 166 | entity_id: switch.$BABY_$NAME_timer 167 | - service: notify.all_phones 168 | data: 169 | title: Baby Buddy 170 | message: Right Breast Timer Started 171 | data: 172 | clickAction: $YOUR.BB.URL:8000/timers/ 173 | url: $YOUR.BB.URL:8000/timers/ 174 | persistent: true 175 | title: Baby Buddy 176 | - conditions: 177 | - condition: trigger 178 | id: Button_3 179 | sequence: 180 | - service: babybuddy.add_diaper_change 181 | data: 182 | type: Wet 183 | color: Yellow 184 | target: 185 | entity_id: sensor.baby_$BABY_$NAME 186 | - service: counter.increment 187 | data: {} 188 | target: 189 | entity_id: counter.bb_diaper_counter 190 | - service: notify.all_phones 191 | data: 192 | title: Baby Buddy 193 | message: | 194 | Wet Diaper Logged! 195 | data: 196 | clickAction: $YOUR.BB.URL:8000/diapers/ 197 | url: $YOUR.BB.URL:8000/diapers/ 198 | persistent: true 199 | title: Baby Buddy 200 | - conditions: 201 | - condition: trigger 202 | id: Button_4 203 | sequence: 204 | - service: babybuddy.add_diaper_change 205 | data: 206 | type: Solid 207 | color: Yellow 208 | target: 209 | entity_id: sensor.baby_$BABY_$NAME 210 | - service: counter.increment 211 | data: {} 212 | target: 213 | entity_id: counter.bb_diaper_counter 214 | - service: notify.all_phones 215 | data: 216 | title: Baby Buddy 217 | message: | 218 | Solid Diaper Logged! 219 | data: 220 | clickAction: $YOUR.BB.URL:8000/diapers/ 221 | url: $YOUR.BB.URL:8000/diapers/ 222 | persistent: true 223 | title: Baby Buddy 224 | - conditions: 225 | - condition: trigger 226 | id: Diaper_double_click 227 | sequence: 228 | - service: babybuddy.add_diaper_change 229 | data: 230 | type: Solid 231 | color: Green 232 | target: 233 | entity_id: sensor.baby_$BABY_$NAME 234 | - service: counter.increment 235 | data: {} 236 | target: 237 | entity_id: counter.bb_diaper_counter 238 | - service: notify.all_phones 239 | data: 240 | title: Baby Buddy 241 | message: | 242 | Solid Diaper Logged! 243 | data: 244 | clickAction: $YOUR.BB.URL:8000/diapers/ 245 | url: $YOUR.BB.URL:8000/diapers/ 246 | persistent: true 247 | title: Baby Buddy 248 | - conditions: 249 | - condition: trigger 250 | id: Diaper_triple_click 251 | sequence: 252 | - service: babybuddy.add_diaper_change 253 | data: 254 | type: Solid 255 | color: Brown 256 | target: 257 | entity_id: sensor.baby_$BABY_$NAME 258 | - service: counter.increment 259 | data: {} 260 | target: 261 | entity_id: counter.bb_diaper_counter 262 | - service: notify.all_phones 263 | data: 264 | title: Baby Buddy 265 | message: | 266 | Solid Diaper Logged! 267 | data: 268 | clickAction: $YOUR.BB.URL:8000/diapers/ 269 | url: $YOUR.BB.URL:8000/diapers/ 270 | persistent: true 271 | title: Baby Buddy 272 | - conditions: 273 | - condition: trigger 274 | id: Button_5 275 | sequence: 276 | - if: 277 | - condition: template 278 | value_template: "{{state_attr('sensor.$BABY_$NAME_last_timer', 'active')}}" 279 | then: 280 | - service: babybuddy.add_sleep 281 | data: 282 | timer: true 283 | target: 284 | entity_id: switch.$BABY_$NAME_timer 285 | - service: notify.all_phones 286 | data: 287 | title: Baby Buddy 288 | message: > 289 | Sleep Logged Duration: {{ 290 | states.sensor.bb_timer_formatted.state }} 291 | data: 292 | clickAction: $YOUR.BB.URL:8000/sleep/ 293 | url: | 294 | $YOUR.BB.URL:8000/sleep/ 295 | persistent: true 296 | title: Baby Buddy 297 | else: 298 | - service: switch.turn_on 299 | data: {} 300 | target: 301 | entity_id: switch.$BABY_$NAME_timer 302 | - service: notify.all_phones 303 | data: 304 | title: Baby Buddy 305 | message: | 306 | Sleep Timer Started 307 | data: 308 | clickAction: $YOUR.BB.URL:8000/timers/ 309 | url: $YOUR.BB.URL:8000/timers/ 310 | persistent: true 311 | title: Baby Buddy 312 | - conditions: 313 | - condition: trigger 314 | id: Button_6 315 | sequence: 316 | - service: notify.all_phones 317 | data: 318 | title: Baby Buddy 319 | message: Tap and Hold to enter amount 320 | data: 321 | actions: 322 | - action: PUMP_CUSTOM 323 | title: Enter Amount Pumped in Ounces 324 | behavior: textInput 325 | textInputButtonTitle: (ounces) 326 | textInputPlaceholder: "1.0" 327 | subtitle: "Log Pumping:" 328 | - wait_for_trigger: 329 | - platform: event 330 | event_type: mobile_app_notification_action 331 | event_data: 332 | action: PUMP_CUSTOM 333 | continue_on_timeout: false 334 | timeout: "1:00" 335 | - service: babybuddy.add_pumping 336 | data: 337 | amount: | 338 | {{wait.trigger.event.data["reply_text"] }} 339 | target: 340 | entity_id: sensor.baby_$BABY_$NAME 341 | - wait_for_trigger: 342 | - platform: state 343 | entity_id: 344 | - sensor.$BABY_$NAME_last_pumping 345 | attribute: amount 346 | timeout: 347 | hours: 0 348 | minutes: 0 349 | seconds: 2 350 | milliseconds: 0 351 | - service: notify.all_phones 352 | data: 353 | title: Baby Buddy 354 | message: | 355 | Pumping Logged 356 | Amount: {{states('sensor.$BABY_$NAME_last_pumping')}} Ounces 357 | data: 358 | clickAction: $YOUR.BB.URL:8000/feedings/ 359 | url: $YOUR.BB.URL:8000/feedings/ 360 | persistent: true 361 | title: Baby Buddy 362 | - conditions: 363 | - condition: trigger 364 | id: Button_7 365 | sequence: 366 | - if: 367 | - condition: template 368 | value_template: "{{state_attr('sensor.$BABY_$NAME_last_timer', 'active')}}" 369 | then: 370 | - service: babybuddy.add_feeding 371 | data: 372 | timer: true 373 | type: Breast milk 374 | method: Bottle 375 | target: 376 | entity_id: switch.$BABY_$NAME_timer 377 | - service: counter.increment 378 | data: {} 379 | target: 380 | entity_id: 381 | - counter.bb_feeding_counter 382 | - service: input_text.set_value 383 | data: 384 | value: "" 385 | target: 386 | entity_id: input_text.bb_notes 387 | - service: input_number.set_value 388 | data: 389 | value: 0 390 | target: 391 | entity_id: input_number.bb_amount 392 | - service: notify.all_phones 393 | data: 394 | title: Baby Buddy 395 | message: > 396 | Bottle Feeding Logged Duration: {{ 397 | states.sensor.bb_timer_formatted.state }} 398 | data: 399 | clickAction: $YOUR.BB.URL:8000/feedings/ 400 | url: $YOUR.BB.URL:8000/feedings/ 401 | persistent: true 402 | title: Baby Buddy 403 | else: 404 | - service: switch.turn_on 405 | data: {} 406 | target: 407 | entity_id: switch.$BABY_$NAME_timer 408 | - service: notify.all_phones 409 | data: 410 | title: Baby Buddy 411 | message: | 412 | Solid Food Timer Started 413 | data: 414 | clickAction: $YOUR.BB.URL:8000/timers/ 415 | url: $YOUR.BB.URL:8000/timers/ 416 | persistent: true 417 | title: Baby Buddy 418 | - conditions: 419 | - condition: trigger 420 | id: Button_8 421 | sequence: 422 | - if: 423 | - condition: template 424 | value_template: "{{state_attr('sensor.$BABY_$NAME_last_timer', 'active')}}" 425 | then: 426 | - service: babybuddy.add_tummy_time 427 | data: 428 | timer: true 429 | target: 430 | entity_id: switch.$BABY_$NAME_timer 431 | - service: notify.all_phones 432 | data: 433 | title: Baby Buddy 434 | message: > 435 | Tummy Time Logged! Duration: {{ 436 | states.sensor.bb_timer_formatted.state }} 437 | data: 438 | clickAction: $YOUR.BB.URL:8000/tummy-time/ 439 | url: $YOUR.BB.URL:8000/tummy-time/ 440 | persistent: true 441 | title: Baby Buddy 442 | else: 443 | - service: switch.turn_on 444 | data: {} 445 | target: 446 | entity_id: switch.$BABY_$NAME_timer 447 | - service: notify.all_phones 448 | data: 449 | title: Baby Buddy 450 | message: | 451 | Tummy Time Timer Started 452 | data: 453 | clickAction: $YOUR.BB.URL:8000/timers/ 454 | url: $YOUR.BB.URL:8000/timers/ 455 | persistent: true 456 | title: Baby Buddy 457 | enabled: true 458 | mode: parallel 459 | max: 10 460 | -------------------------------------------------------------------------------- /automations/generic_keypad_automation.yaml: -------------------------------------------------------------------------------- 1 | alias: Esp32_Keypad_automations 2 | description: Do stuff when the keypad buttons are pressed 3 | trigger: 4 | - platform: event 5 | event_type: esphome.esp32_keypad 6 | id: Button_1_single 7 | event_data: 8 | title: single_click 9 | button: b1 10 | alias: Button 1 Single Click 11 | - platform: event 12 | event_type: esphome.esp32_keypad 13 | event_data: 14 | title: single_click 15 | button: b2 16 | id: Button_2_single 17 | alias: Button 2 Single Click 18 | - platform: event 19 | event_type: esphome.esp32_keypad 20 | event_data: 21 | title: single_click 22 | button: b3 23 | id: Button_3_single 24 | alias: Button 3 Single Click 25 | - platform: event 26 | event_type: esphome.esp32_keypad 27 | event_data: 28 | title: single_click 29 | button: b4 30 | id: Button_4_single 31 | alias: Button 4 Single Click 32 | - platform: event 33 | event_type: esphome.esp32_keypad 34 | event_data: 35 | title: single_click 36 | button: b5 37 | id: Button_5_single 38 | alias: Button 5 Single Click 39 | - platform: event 40 | event_type: esphome.esp32_keypad 41 | event_data: 42 | title: single_click 43 | button: b6 44 | id: Button_6_single 45 | alias: Button 6 Single Click 46 | - platform: event 47 | event_type: esphome.esp32_keypad 48 | event_data: 49 | title: single_click 50 | button: b7 51 | id: Button_7_single 52 | alias: Button 7 Single Click 53 | - platform: event 54 | event_type: esphome.esp32_keypad 55 | event_data: 56 | title: single_click 57 | button: b8 58 | id: Button_8_single 59 | alias: Button 8 Single Click 60 | 61 | - platform: event 62 | event_type: esphome.esp32_keypad 63 | event_data: 64 | title: dbl_click 65 | button: b1 66 | id: Button_1_double 67 | alias: Button 1 Double Click 68 | - platform: event 69 | event_type: esphome.esp32_keypad 70 | event_data: 71 | title: dbl_click 72 | button: b2 73 | id: Button_2_double 74 | alias: Button 2 Double Click 75 | - platform: event 76 | event_type: esphome.esp32_keypad 77 | event_data: 78 | title: dbl_click 79 | button: b3 80 | id: Button_3_double 81 | alias: Button 3 Double Click 82 | - platform: event 83 | event_type: esphome.esp32_keypad 84 | event_data: 85 | title: dbl_click 86 | button: b4 87 | id: Button_4_double 88 | alias: Button 4 Double Click 89 | - platform: event 90 | event_type: esphome.esp32_keypad 91 | event_data: 92 | title: dbl_click 93 | button: b5 94 | id: Button_5_double 95 | alias: Button 5 Double Click 96 | - platform: event 97 | event_type: esphome.esp32_keypad 98 | event_data: 99 | title: dbl_click 100 | button: b6 101 | id: Button_6_double 102 | alias: Button 6 Double Click 103 | - platform: event 104 | event_type: esphome.esp32_keypad 105 | event_data: 106 | title: dbl_click 107 | button: b7 108 | id: Button_7_double 109 | alias: Button 7 Double Click 110 | - platform: event 111 | event_type: esphome.esp32_keypad 112 | event_data: 113 | title: dbl_click 114 | button: b8 115 | id: Button_8_double 116 | alias: Button 8 Double Click 117 | - platform: event 118 | event_type: esphome.esp32_keypad 119 | event_data: 120 | title: triple_click 121 | button: b1 122 | id: Button_1_triple 123 | alias: Button 1 Triple Click 124 | - platform: event 125 | event_type: esphome.esp32_keypad 126 | event_data: 127 | title: triple_click 128 | button: b2 129 | id: Button_2_triple 130 | alias: Button 2 Triple Click 131 | - platform: event 132 | event_type: esphome.esp32_keypad 133 | event_data: 134 | title: triple_click 135 | button: b3 136 | id: Button_3_triple 137 | alias: Button 3 Triple Click 138 | - platform: event 139 | event_type: esphome.esp32_keypad 140 | event_data: 141 | title: triple_click 142 | button: b4 143 | id: Button_4_triple 144 | alias: Button 4 Triple Click 145 | - platform: event 146 | event_type: esphome.esp32_keypad 147 | event_data: 148 | title: triple_click 149 | button: b5 150 | id: Button_5_triple 151 | alias: Button 5 Triple Click 152 | - platform: event 153 | event_type: esphome.esp32_keypad 154 | event_data: 155 | title: triple_click 156 | button: b6 157 | id: Button_6_triple 158 | alias: Button 6 Triple Click 159 | - platform: event 160 | event_type: esphome.esp32_keypad 161 | event_data: 162 | title: triple_click 163 | button: b7 164 | id: Button_7_triple 165 | alias: Button 7 Triple Click 166 | - platform: event 167 | event_type: esphome.esp32_keypad 168 | event_data: 169 | title: triple_click 170 | button: b8 171 | id: Button_8_triple 172 | alias: Button 8 Triple Click 173 | 174 | - platform: event 175 | event_type: esphome.esp32_keypad 176 | event_data: 177 | title: long_click 178 | button: b1 179 | id: Button_1_long 180 | alias: Button 1 Long Click 181 | - platform: event 182 | event_type: esphome.esp32_keypad 183 | event_data: 184 | title: long_click 185 | button: b2 186 | id: Button_2_long 187 | alias: Button 2 Long Click 188 | - platform: event 189 | event_type: esphome.esp32_keypad 190 | event_data: 191 | title: long_click 192 | button: b3 193 | id: Button_3_long 194 | alias: Button 3 Long Click 195 | - platform: event 196 | event_type: esphome.esp32_keypad 197 | event_data: 198 | title: long_click 199 | button: b4 200 | id: Button_4_long 201 | alias: Button 4 Long Click 202 | - platform: event 203 | event_type: esphome.esp32_keypad 204 | event_data: 205 | title: long_click 206 | button: b5 207 | id: Button_5_long 208 | alias: Button 5 Long Click 209 | - platform: event 210 | event_type: esphome.esp32_keypad 211 | event_data: 212 | title: long_click 213 | button: b6 214 | id: Button_6_long 215 | alias: Button 6 Long Click 216 | - platform: event 217 | event_type: esphome.esp32_keypad 218 | event_data: 219 | title: long_click 220 | button: b7 221 | id: Button_7_long 222 | alias: Button 7 Long Click 223 | - platform: event 224 | event_type: esphome.esp32_keypad 225 | event_data: 226 | title: long_click 227 | button: b8 228 | id: Button_8_long 229 | alias: Button 8 Long Click 230 | - platform: event 231 | event_type: esphome.esp32_keypad 232 | event_data: 233 | title: hold 234 | button: b1 235 | id: Button_1_hold 236 | alias: Button 1 Hold 237 | - platform: event 238 | event_type: esphome.esp32_keypad 239 | event_data: 240 | title: hold 241 | button: b2 242 | id: Button_2_hold 243 | alias: Button 2 Hold 244 | - platform: event 245 | event_type: esphome.esp32_keypad 246 | event_data: 247 | title: hold 248 | button: b3 249 | id: Button_3_hold 250 | alias: Button 3 Hold 251 | - platform: event 252 | event_type: esphome.esp32_keypad 253 | event_data: 254 | title: hold 255 | button: b4 256 | id: Button_4_hold 257 | alias: Button 4 Hold 258 | - platform: event 259 | event_type: esphome.esp32_keypad 260 | event_data: 261 | title: hold 262 | button: b5 263 | id: Button_5_hold 264 | alias: Button 5 Hold 265 | - platform: event 266 | event_type: esphome.esp32_keypad 267 | event_data: 268 | title: hold 269 | button: b6 270 | id: Button_6_hold 271 | alias: Button 6 Hold 272 | - platform: event 273 | event_type: esphome.esp32_keypad 274 | event_data: 275 | title: hold 276 | button: b7 277 | id: Button_7_hold 278 | alias: Button 7 Hold 279 | - platform: event 280 | event_type: esphome.esp32_keypad 281 | event_data: 282 | title: hold 283 | button: b8 284 | id: Button_8_hold 285 | alias: Button 8 Hold 286 | 287 | condition: [] 288 | action: 289 | - choose: 290 | - conditions: 291 | - condition: trigger 292 | id: Button_1_single 293 | alias: Button 1 Single Click 294 | sequence: [] 295 | - conditions: 296 | - condition: trigger 297 | id: Button_1_dbl 298 | alias: Button 1 Double Click 299 | sequence: [] 300 | - conditions: 301 | - condition: trigger 302 | id: Button_1_triple 303 | alias: Button 1 Triple Click 304 | sequence: [] 305 | - conditions: 306 | - condition: trigger 307 | id: Button_1_long 308 | alias: Button 1 Long Click 309 | sequence: [] 310 | - conditions: 311 | - condition: trigger 312 | id: Button_1_hold 313 | alias: Button 1 Hold 314 | sequence: [] 315 | 316 | - conditions: 317 | - condition: trigger 318 | id: Button_2_single 319 | alias: Button 2 Single Click 320 | sequence: [] 321 | - conditions: 322 | - condition: trigger 323 | id: Button_2_dbl 324 | alias: Button 2 Double Click 325 | sequence: [] 326 | - conditions: 327 | - condition: trigger 328 | id: Button_2_triple 329 | alias: Button 2 Triple Click 330 | sequence: [] 331 | - conditions: 332 | - condition: trigger 333 | id: Button_2_long 334 | alias: Button 2 Long Click 335 | sequence: [] 336 | - conditions: 337 | - condition: trigger 338 | id: Button_2_hold 339 | alias: Button 2 Hold 340 | sequence: [] 341 | 342 | - conditions: 343 | - condition: trigger 344 | id: Button_3_single 345 | alias: Button 3 Single Click 346 | sequence: [] 347 | - conditions: 348 | - condition: trigger 349 | id: Button_3_dbl 350 | alias: Button 3 Double Click 351 | sequence: [] 352 | - conditions: 353 | - condition: trigger 354 | id: Button_3_triple 355 | alias: Button 3 Triple Click 356 | sequence: [] 357 | - conditions: 358 | - condition: trigger 359 | id: Button_3_long 360 | alias: Button 3 Long Click 361 | sequence: [] 362 | - conditions: 363 | - condition: trigger 364 | id: Button_3_hold 365 | alias: Button 3 Hold 366 | sequence: [] 367 | 368 | - conditions: 369 | - condition: trigger 370 | id: Button_4_single 371 | alias: Button 4 Single Click 372 | sequence: [] 373 | - conditions: 374 | - condition: trigger 375 | id: Button_4_dbl 376 | alias: Button 4 Double Click 377 | sequence: [] 378 | - conditions: 379 | - condition: trigger 380 | id: Button_4_triple 381 | alias: Button 4 Triple Click 382 | sequence: [] 383 | - conditions: 384 | - condition: trigger 385 | id: Button_4_long 386 | alias: Button 4 Long Click 387 | sequence: [] 388 | - conditions: 389 | - condition: trigger 390 | id: Button_4_hold 391 | alias: Button 4 Hold 392 | sequence: [] 393 | 394 | - conditions: 395 | - condition: trigger 396 | id: Button_5_single 397 | alias: Button 5 Single Click 398 | sequence: [] 399 | - conditions: 400 | - condition: trigger 401 | id: Button_5_dbl 402 | alias: Button 5 Double Click 403 | sequence: [] 404 | - conditions: 405 | - condition: trigger 406 | id: Button_5_triple 407 | alias: Button 5 Triple Click 408 | sequence: [] 409 | - conditions: 410 | - condition: trigger 411 | id: Button_5_long 412 | alias: Button 5 Long Click 413 | sequence: [] 414 | - conditions: 415 | - condition: trigger 416 | id: Button_5_hold 417 | alias: Button 5 Hold 418 | sequence: [] 419 | 420 | - conditions: 421 | - condition: trigger 422 | id: Button_6_single 423 | alias: Button 6 Single Click 424 | sequence: [] 425 | - conditions: 426 | - condition: trigger 427 | id: Button_6_dbl 428 | alias: Button 6 Double Click 429 | sequence: [] 430 | - conditions: 431 | - condition: trigger 432 | id: Button_6_triple 433 | alias: Button 6 Triple Click 434 | sequence: [] 435 | - conditions: 436 | - condition: trigger 437 | id: Button_6_long 438 | alias: Button 6 Long Click 439 | sequence: [] 440 | - conditions: 441 | - condition: trigger 442 | id: Button_6_hold 443 | alias: Button 6 Hold 444 | sequence: [] 445 | 446 | - conditions: 447 | - condition: trigger 448 | id: Button_7_single 449 | alias: Button 7 Single Click 450 | sequence: [] 451 | - conditions: 452 | - condition: trigger 453 | id: Button_7_dbl 454 | alias: Button 7 Double Click 455 | sequence: [] 456 | - conditions: 457 | - condition: trigger 458 | id: Button_7_triple 459 | alias: Button 7 Triple Click 460 | sequence: [] 461 | - conditions: 462 | - condition: trigger 463 | id: Button_7_long 464 | alias: Button 7 Long Click 465 | sequence: [] 466 | - conditions: 467 | - condition: trigger 468 | id: Button_7_hold 469 | alias: Button 7 Hold 470 | sequence: [] 471 | 472 | - conditions: 473 | - condition: trigger 474 | id: Button_8_single 475 | alias: Button 8 Single Click 476 | sequence: [] 477 | - conditions: 478 | - condition: trigger 479 | id: Button_8_dbl 480 | alias: Button 8 Double Click 481 | sequence: [] 482 | - conditions: 483 | - condition: trigger 484 | id: Button_8_triple 485 | alias: Button 8 Triple Click 486 | sequence: [] 487 | - conditions: 488 | - condition: trigger 489 | id: Button_8_long 490 | alias: Button 8 Long Click 491 | sequence: [] 492 | - conditions: 493 | - condition: trigger 494 | id: Button_8_hold 495 | alias: Button 8 Hold 496 | sequence: [] 497 | 498 | 499 | enabled: true 500 | mode: parallel 501 | max: 10 502 | -------------------------------------------------------------------------------- /icons/Keyboard_Template.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/Keyboard_Template.ai -------------------------------------------------------------------------------- /icons/Keyboard_Template.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/Keyboard_Template.pdf -------------------------------------------------------------------------------- /icons/Single Key Legend Template.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/Single Key Legend Template.pdf -------------------------------------------------------------------------------- /icons/basic_flat_lineal_icons/baby-bottle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/basic_flat_lineal_icons/baby-bottle.png -------------------------------------------------------------------------------- /icons/basic_flat_lineal_icons/breast-pump.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/basic_flat_lineal_icons/breast-pump.png -------------------------------------------------------------------------------- /icons/basic_flat_lineal_icons/crawl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/basic_flat_lineal_icons/crawl.png -------------------------------------------------------------------------------- /icons/basic_flat_lineal_icons/crawl_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/basic_flat_lineal_icons/crawl_01.png -------------------------------------------------------------------------------- /icons/basic_flat_lineal_icons/crawl_bow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/basic_flat_lineal_icons/crawl_bow.png -------------------------------------------------------------------------------- /icons/basic_flat_lineal_icons/crawling.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/basic_flat_lineal_icons/crawling.png -------------------------------------------------------------------------------- /icons/basic_flat_lineal_icons/diaper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/basic_flat_lineal_icons/diaper.png -------------------------------------------------------------------------------- /icons/basic_flat_lineal_icons/mom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/basic_flat_lineal_icons/mom.png -------------------------------------------------------------------------------- /icons/basic_flat_lineal_icons/sleep.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/basic_flat_lineal_icons/sleep.png -------------------------------------------------------------------------------- /icons/basic_flat_lineal_icons/spoon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/basic_flat_lineal_icons/spoon.png -------------------------------------------------------------------------------- /icons/basic_flat_lineal_icons/timer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/basic_flat_lineal_icons/timer.png -------------------------------------------------------------------------------- /icons/readme.md: -------------------------------------------------------------------------------- 1 | ## Icons 2 | Keyboard_Template.ai -- Use this if you have illustrator -> you can change all the icons to your heart's desire 3 | 4 | Keyboard_Template.pdf -- PDF version if you don't have illustrator 5 | 6 | Single Key Legend Template.pdf -- Blank template 7 | 8 | [basic_flat_lineal_icons](../icons/basic_flat_lineal_icons) -- bold, simple icons 9 | 10 | [special_lineal_icons](../icons/special_lineal_icons) -- thinner, more complex icons 11 | 12 | ## Attributions 13 | 14 | [Icons for keypad courtesy of Freepik on Flaticon](https://www.flaticon.com/authors/freepik)
15 | [blank template courtesy of X-keys](https://xkeys.com/) 16 | -------------------------------------------------------------------------------- /icons/special_lineal_icons/breastfeed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/special_lineal_icons/breastfeed.png -------------------------------------------------------------------------------- /icons/special_lineal_icons/diaper-thin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/special_lineal_icons/diaper-thin.png -------------------------------------------------------------------------------- /icons/special_lineal_icons/feeding-bottle copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/special_lineal_icons/feeding-bottle copy.png -------------------------------------------------------------------------------- /icons/special_lineal_icons/feeding-bottle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/special_lineal_icons/feeding-bottle.png -------------------------------------------------------------------------------- /icons/special_lineal_icons/moon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/special_lineal_icons/moon.png -------------------------------------------------------------------------------- /icons/special_lineal_icons/sleep2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/special_lineal_icons/sleep2.png -------------------------------------------------------------------------------- /icons/special_lineal_icons/spoon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/special_lineal_icons/spoon.png -------------------------------------------------------------------------------- /icons/special_lineal_icons/stopwatch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/special_lineal_icons/stopwatch.png -------------------------------------------------------------------------------- /icons/special_lineal_icons/timer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/special_lineal_icons/timer.png -------------------------------------------------------------------------------- /icons/special_lineal_icons/tummy-time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drpeppershaker/ESP32_keypad/a234bb7c294f27ec7542f176638d677312a37ac3/icons/special_lineal_icons/tummy-time.png --------------------------------------------------------------------------------