diff --git a/content/blog/9999-11-01_neighbors-water-heater-automation.rst b/content/blog/9999-11-01_neighbors-water-heater-automation.rst new file mode 100644 index 0000000..1a9d92b --- /dev/null +++ b/content/blog/9999-11-01_neighbors-water-heater-automation.rst @@ -0,0 +1,92 @@ +Neighbor's Water Heater Automation +################################## +:author: tyrel +:category: automation +:tags: automation, c++, esp8266, servo, stepper +:status: draft + +The Setting +~~~~~~~~~~~ + +My neighbor has a Bosch tankless water heater he put in last year. +This water heater has one slight problem that when the power even blips a single second, it gets set back to its lowest temperature of 95°F. +My neighbor (we'll call him Frank for this post) wants to set his heater to 120°F in his house. +The problem arises in that his water heater is under the house in his crawl space. + +Without an easy way to set his temperature, he needs to crawl under his crawl space and turn a dial *EVERY. SINGLE. TIME.* + +He asked me if I knew of anything off the shelf that would help. +I did not. +So I said the only logical thing someone `like me `_ would have done. +"I can totally automate that!" + +The Lay Of The Land +~~~~~~~~~~~~~~~~~~~ + +He has a `Bosch Tronic 6000C `_, with what appears to be a rotary encoder knob to set the temperature. +I only spent a few minutes under his house while planning this and didn't think to any measuring of how many detents to rotate, or how long the dial took to rotate to 120°F, so my first pass of this project is done with estimations. + +Project Time - Round 1! +~~~~~~~~~~~~~~~~~~~~~~~ + +I have a few random servos laying around, and an NodeMCU ESP8266 module. +I figure these would be the perfect solution! ... note: was half right... + +I found some code online by `Kumar Aditya `_ that is for the `two items in my current parts list `_ (ESP8266 and SG90) + +The Original code runs a web server on port 80, and runs a web page with some jQuery (wow it's been a while) to change the angle of the servo. +I realized this wasn't what I needed because my servos could only go 180° and I might need to go multiple rotations. +I found a youtube video on how to make a `SG90 run infinite in either direction `_, so I did those modifications. +I then modified the front end code a little bit. + +The new code on the back end was actually exactly the same, even though the effect was slightly different. +It would run on port 80, listen at `/` and `/angle`, but the angle here was more of direction and speed (a vector?). +The way the servo was built, 160° was "Stop", higher than that was rotate clockwise, lower was rotate counter clockwise. + +I put three buttons on my page that would be "Lower" (150), "STOP" (160), and "Higher" (170). +I then did some standard debouncing and disabling of buttons using setTimeout and such. + +For a final touch I added in a range slider for "Time". +This held how many seconds after pressing Higher or Lower, that I would send the STOP command again. + +This seemed to work relatively well, but I figure I should just use a stepper motor if I was attempting to emulate one this way. +I dug around in my closet and was able to find some parts. + +Project Time - Round 2! +~~~~~~~~~~~~~~~~~~~~~~~ + +I was able to rummage up a `28BYJ-48 `_ stepper with control board, and a `HW-131 power module `_. + +With these I needed a new library so I stripped the c++ code down to its basics, just getting me a server with the index page for the first pass. + +On the Javascript side of things, I then decided I would add a temperature slider, from 90° to 120° (which writing this realize it should be from 95°... git commit...) with a confirmation button, and a small button to initialize down to 95°. + +The initialize button would need to trigger an initialization where I rotate counter clockwise an appropriate amount of time (Length TBD) in order to force the rotary encoder dial to always start at a known state of 95. +The green submit button sends the new desired temperature as a post. + +Server side, I was using a library called `AccelStepper `_. +This I set some made up max speeds and steps per rotation, actual values TBD. + +I added an endpoint called `/setTemperature` that takes in a temperature and sets a local temperature variable. +From there, I calculate the temperature less 95, to find out how many degrees I need to increase by, for now I'm considering this rotations. + +I then apply a multiplier (TBD also... there's a lot of these as you can see!) and call `stepper.moveTo()` and it actually feels like it's pretty accurate. + +The endpoint `/initialize` runs `stepper.moveTo` with ten rotations CCW, and then resets the "known location" back to zero (this also runs on power on for now). + +In Action +~~~~~~~~~ + +The result of this second round of coding is a lot more that I expect to happen once I can finally get down beneath his house. +Frank will lose power, his water heater will reset to 95°F, the NodeMCU will reboot, and reinitialize itself. +Frank will then open his browser to the NodeMCU's server, set the desired temperature, and take warm showers. + +Version 2 will come once I actually test EVERYTHING. +My first quesiton is if a rubber band on a lego tire with a servo wheel adaptor (`which I 3d modeled and printed... `_) will work sufficiently. +Programming wise, I need to figure out how many steps is one degree. Is the rotary encoder one degree per detent? Is it a constant speed? Is it like an alarm clock where you can sometimes jump by 10? + +Stay tuned to find out the exciting conclusion once I can go down below Frank's house. + + + + diff --git a/themes/custom/templates/base.html b/themes/custom/templates/base.html index 2b30289..973b77c 100644 --- a/themes/custom/templates/base.html +++ b/themes/custom/templates/base.html @@ -64,6 +64,7 @@ {% for name, link in SOCIAL %}
  • {{ name }}
  • {% endfor %} +
  • Mastodon
  • {% endif %}