Water Heater Scheduler


(Jim Allen) #1

I have been attempting to write a Smart App to control my water heater. I have cobbled together some code that I found useful on the Smart Apps on the developers page. What I would like the app to do is to schedule two run periods per day, “start and stop” in the morning and evening during the weekdays, and have a separate schedule for the weekends.

I have the code below running the water heater, but it will not recognize the different days.

I have been running the water heater using “Turn lights on using a schedule”, but this gives me four lights in my short cuts. I would like to hide these switches so that the family do not accidently turn on and off the hot water.

As a foot note: I have saved about $100.00 this past month on my electric bill by scheduling this. The only down side is that the hub went down one night (router died) and it wasn’t exactly a warm shower in the morning.

Any insight to what I am missing would be GREATLY APPRICATED!

Here is the code that I am using.

    /**
 *  Once a Day
 *
 *  Author: SmartThings
 *
 *  Turn on one or more switches at a specified time and turn them off at a later time.
 */

definition(
    name: "Water Heater Scheduler",
    namespace: "smartthings",
    author: "Jim Allen",
    description: "Turn on water heater at a specified time and turn off at a later time.",
    category: "Convenience",
    iconUrl: "https://s3.amazonaws.com/smartapp-icons/Meta/light_outlet.png",
    iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Meta/light_outlet@2x.png"
)

preferences {
	section("Select device to control...") {
		input name: "switches", type: "capability.switch", multiple: true
	}
	section("Select Days of Week...") {
    	input name: "Days",
        type: "enum",
        title: "Heat water which days?",
        required: false,
        multiple:true, //This must be changed to falso for development (known ST IDE bug)
        metadata:[values:[ 'All Week','Monday to Friday', 'Saturday & Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday','Saturday', 'Sunday']]
        log.debug("Days: $Days")
    }
    section("Turn water heater on at...") {
		input name: "startTimeOne", required:true, title: "Turn On Time?", type: "time"
	}
	section("And turn water heater off at...") {
		input name: "stopTimeOne", required:true, title: "Turn Off Time?", type: "time"
	}
    section("Turn water heater on at...") {
    	input name: "startTimeTwo", required:false, title: "Turn On Time?", type: "time"
    }
    section("Turn water heater off at...") {
    	input name: "stopTimeTwo", required:false, title: "Tun off Time?", type: "time"
	}        
}

def installed() {
	log.debug "Installed with settings: ${settings}"
	schedule(startTime, "startTimeCallback")
	schedule(stopTime, "stopTimeCallback")

}

def updated(settings) {
	unschedule()
	schedule(startTimeOne, "startTimeOneCallback")
	schedule(stopTimeOne, "stopTimeOneCallback")
	schedule(startTimeTwo, "startTimeTwoCallback")
    schedule(stopTimeTwo, "stopTimeTwoCallback")
}

def Days() {
	if(!days) return true

def today = new Date().format("EEEE", location.timeZone)
	log.debug "today: ${today}, days: ${days}"
 		if (Days.contains(today)) { 
 			return true
    }
    log.trace"water heater is not scheduled for today"
    return false
    }

def startTimeOneCallback() {
 	log.debug "Turning on water heater"
	switches.on()
    sendPush("Water Heater On")
    }

def	startTimeTwoCallback() {
 	log.debug "Turning on water heater"
	switches.on()
    sendPush("Water Heater On")
    }

def stopTimeOneCallback() {
	log.debug "Turning off water heater"
	switches.off()
    sendPush("Water Heater Off")
    }

def	stopTimeTwoCallback() {
	log.debug "Turning off water heater"
	switches.off()
    sendPush("Water Heater Off")
    }

Executing the "GoodNight" routine causes my water heater switch to get turned on
(Ron S) #2

You are one brave soul, my friend!


(Jim Allen) #3

Why’s that Ron…

I have worked too long and hard to give all my $$$ to the power company to keep the water warm…

Also I live in Florida, so the cold water is that cold!


(Ron S) #4

I am still not at that stage where I will hook up my costly heavy duty stuff unmonitored. Call it the first time first year of home ownership jitters! :slight_smile:


(Jim Allen) #5

Ah, take the plunge, I have the water heater, six outside lights, and the sprinkler system all on ST. My next project is to move my pool timer over, and integrate the solar pool heater as part of it.

BTW I have been in the electronics field for 35+ years, it’s all smoke and mirrors anyway!!!


(Tim Slagle) #6

Truth :smiley:



#7

What are you using to control the water heater?


(Jim Allen) #8

I am using the Intermatic CA3750 to control the water heater. The device manager is mckeed : Intermatic CA3750 this is a published device type. Then I run a smartapp that I have compiled from other examples. It’s an ongoing effort. I intend on running the hot water heater twice a day, having different start and stop times for the weekdays vs weekends. Currently I have it running twice a day, I still have to work out the day of the week switch in the smartapp. You can also just use the existing activity features in the App and have separate start stop times. Doing this placed for separate icons in my lights & switches short cuts, and I just did not like it. Hence the writing of the smartapp. I will be happy to share this with you when I have it completed. I am more a hardware guy so the writing of the app is moving slowly.


(luis) #9

i though about replacing my cut off switch with a z-wave switch and programed to turn on and off.Not sure if it would work but your idea sound good. Did you get it working


(Jim Allen) #10

Luis,

Yes it has been working for several months on a simple daily schedule. I am having an issue writing the code so that it will recognize the days of the week. My goal is to have a separate schedule for the weekend when our schedule is different.

To answer your questions. You are using a cut off switch. Is it a standard wall switch controlling a relay on the water heater? Or is it a heavy duty wall mounted switch like you would find next to your electrical meter?

If it is a simple wall (light) switch, most of the hardware should be in place and all you would need is a Zwave light switch. Not the more expensive Intermatic switch. Send me a picture of your “cut off switch”. Try to post it here, If you can’t, let me know and I will give you my personal email.

Jim


(Jim Allen) #11

For all that are interested, I have completed my SmartApp to control the water heater. So far my testing show that the App is running correctly. This app is based on rboy’s 5-2 Day Thermostat.

Here is the Code

/**
  • 5-2 Day Water Heater
  • Copyright 2015 Jim Allen
  • Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except
  • in compliance with the License. You may obtain a copy of the License at:
  •  http://www.apache.org/licenses/LICENSE-2.0
    
  • Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
  • on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
  • for the specific language governing permissions and limitations under the License.

*/
definition(
name: “5-2 Day Water Heater”,
namespace: “Home Systems”,
author: “Jim Allen”,
description: “This App allows to schedule 2 weekday and 2 weekend schedules”,
category: “My Apps”,
iconUrl: “https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience.png”,
iconX2Url: “https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience@2x.png”,
iconX3Url: “https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience@2x.png”)

preferences {
section("Choose Water Heater ") {
input name: “switches”, type: “capability.switch”, multiple: true
}

section("Monday to Friday Schedule") {
	input "time1", "time", title: "Trun On Time Weekdays AM", required: true
	input "time2", "time", title: "Turn Off Time Weekdays AM", required: true
	input "time3", "time", title: "Turn On Time Weekdays PM", required: true
	input "time4", "time", title: "Turn Off Time Weekdays PM", required: true
}
section("Saturday and Sunday Schedule") {
	input "time11", "time", title: "Turn On Time Weekend AM", required: true
	input "time21", "time", title: "Turn Off Time Weekend AM", required: true
	input "time31", "time", title: "Turn On Time Weekend PM", required: true
	input "time41", "time", title: "Turn Off Time Weekend PM", required: true
}

}

def installed()
{
subscribeToEvents()
log.debug “Installed with settings: ${settings}”
}

def updated()
{
unsubscribe()
subscribeToEvents()
}

def subscribeToEvents() {
subscribe(location, modeChangeHandler)

initialize()

}

// Handle mode changes, reinitialize the current temperature and timers after a mode change, this is to workaround the issue of the last timer firing while in a non running mode, resume operations when supported modes are set
def modeChangeHandler(evt) {
log.debug “Reinitializing thermostat on mode change notification, new mode $evt.value”
//sendNotificationEvent("$thermostat Reinitializing on mode change notification, new mode $evt.value")
initialize()
}

// This section determines which day it is.
def initialize() {

unschedule()
def calendar = Calendar.getInstance()
calendar.setTimeZone(location.timeZone)
def today = calendar.get(Calendar.DAY_OF_WEEK)
def timeNow = now()
def midnightToday = timeToday("2000-01-01T23:59:59.999-0000", location.timeZone)
log.debug("Current time is ${(new Date(timeNow)).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
log.debug("Midnight today is ${midnightToday.format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
log.trace("Weekday schedule1 ${timeToday(time1, location.timeZone).format("HH:mm z", location.timeZone)}")
log.trace("Weekday schedule2 ${timeToday(time2, location.timeZone).format("HH:mm z", location.timeZone)}")
log.trace("Weekday schedule3 ${timeToday(time3, location.timeZone).format("HH:mm z", location.timeZone)}")
log.trace("Weekday schedule4 ${timeToday(time4, location.timeZone).format("HH:mm z", location.timeZone)}")
log.trace("Weekend schedule1 ${timeToday(time11, location.timeZone).format("HH:mm z", location.timeZone)}")
log.trace("Weekend schedule2 ${timeToday(time21, location.timeZone).format("HH:mm z", location.timeZone)}")
log.trace("Weekend schedule3 ${timeToday(time31, location.timeZone).format("HH:mm z", location.timeZone)}")
log.trace("Weekend schedule4 ${timeToday(time41, location.timeZone).format("HH:mm z", location.timeZone)}")

// This section is where the time/temperature schedule is set
switch (today) {
	case Calendar.MONDAY:
	case Calendar.TUESDAY:
	case Calendar.WEDNESDAY:
	case Calendar.THURSDAY:
    	if (timeNow >= timeToday(time1, location.timeZone).time && timeNow < timeToday(time2, location.timeZone).time) { // Are we between 1st time and 2nd time
        	schedule(timeToday(time2, location.timeZone), initialize)
            log.info("$thermostat Scheduled next adjustment for ${timeToday(time2, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
            //sendNotificationEvent("$thermostat Scheduled next adjustment for ${timeToday(time2, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
    		log.debug "Turning on water heater"
            switches.on()
        }
    	else if (timeNow >= timeToday(time2, location.timeZone).time && timeNow < timeToday(time3, location.timeZone).time) { // Are we between 2nd time and 3rd time
			schedule(timeToday(time3, location.timeZone), initialize)
            log.info("$thermostat Scheduled next adjustment for ${timeToday(time3, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
            //sendNotificationEvent("$thermostat Scheduled next adjustment for ${timeToday(time3, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
        	log.debug "Turning off water heater"
            switches.off()
        }
        else if (timeNow >= timeToday(time3, location.timeZone).time && timeNow < timeToday(time4, location.timeZone).time) { // Are we between 3rd time and 4th time
			schedule(timeToday(time4, location.timeZone), initialize)
            log.info("$thermostat Scheduled next adjustment for ${timeToday(time4, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
            //sendNotificationEvent("$thermostat Scheduled next adjustment for ${timeToday(time4, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
        	log.debug "Turning on water heater"
            switches.on()
        }
        else if (timeNow >= timeToday(time4, location.timeZone).time && timeNow < midnightToday.time) { // Are we between 4th time and midnight, schedule next day
			schedule(timeToday(time1, location.timeZone) + 1, initialize)
            log.info("$thermostat Scheduled next adjustment for ${(timeToday(time1, location.timeZone) + 1).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
            //sendNotificationEvent("$thermostat Scheduled next adjustment for ${(timeToday(time1, location.timeZone) + 1).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
        	log.debug "Turning off water heater"
            switches.off()
        }
        else if (timeNow >= (midnightToday - 1).time && timeNow < timeToday(time1, location.timeZone).time) { // Are we between midnight yesterday and 1st time, schedule today
			schedule(timeToday(time1, location.timeZone), initialize)
            log.info("$thermostat Scheduled next adjustment for ${timeToday(time1, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
            //sendNotificationEvent("$thermostat Scheduled next adjustment for ${timeToday(time1, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
			log.debug "Turning on water heater"
			switches.on()
        }
		break

	case Calendar.FRIDAY:
    	if (timeNow >= timeToday(time1, location.timeZone).time && timeNow < timeToday(time2, location.timeZone).time) { // Are we between 1st time and 2nd time
        	schedule(timeToday(time2, location.timeZone), initialize)
            log.info("$thermostat Scheduled next adjustment for ${timeToday(time2, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
            //sendNotificationEvent("$thermostat Scheduled next adjustment for ${timeToday(time2, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
			log.debug "Turning on water heater"
            switches.on()
		}
    	else if (timeNow >= timeToday(time2, location.timeZone).time && timeNow < timeToday(time3, location.timeZone).time) { // Are we between 2nd time and 3rd time
			schedule(timeToday(time3, location.timeZone), initialize)
            log.info("$thermostat Scheduled next adjustment for ${timeToday(time3, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
            //sendNotificationEvent("$thermostat Scheduled next adjustment for ${timeToday(time3, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
        	log.debug "Turning off water heater"
            switches.off()
        }
        else if (timeNow >= timeToday(time3, location.timeZone).time && timeNow < timeToday(time4, location.timeZone).time) { // Are we between 3rd time and 4th time
			schedule(timeToday(time4, location.timeZone), initialize)
            log.info("$thermostat Scheduled next adjustment for ${timeToday(time4, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
            //sendNotificationEvent("$thermostat Scheduled next adjustment for ${timeToday(time4, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
        	log.debug "Turning on water heater"
            switches.on()
        }
        else if (timeNow >= timeToday(time4, location.timeZone).time && timeNow < midnightToday.time) { // Are we between 4th time Friday and midnight, we schedule Saturday
			schedule(timeToday(time11, location.timeZone) + 1, initialize)
            log.info("$thermostat Scheduled next adjustment for ${(timeToday(time11, location.timeZone) + 1).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
            //sendNotificationEvent("$thermostat Scheduled next adjustment for ${(timeToday(time11, location.timeZone) + 1).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
        	log.debug "Turning off water heater"
            switches.off()
        }
        else if (timeNow >= (midnightToday - 1).time && timeNow < timeToday(time11, location.timeZone).time) { // Are we between midnight Friday and 1st time on Saturday, we schedule Saturday
			schedule(timeToday(time11, location.timeZone), initialize)
            log.info("$thermostat Scheduled next adjustment for ${timeToday(time11, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
            //sendNotificationEvent("$thermostat Scheduled next adjustment for ${timeToday(time11, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
			log.debug "Turning on water heater"
            switches.on()
        }
		break

	case Calendar.SATURDAY:
        if (timeNow >= timeToday(time11, location.timeZone).time && timeNow < timeToday(time21, location.timeZone).time) { // Are we between 1st time and 2nd time
        	schedule(timeToday(time21, location.timeZone), initialize)
            log.info("$thermostat Scheduled next adjustment for ${timeToday(time21, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
            //sendNotificationEvent("$thermostat Scheduled next adjustment for ${timeToday(time21, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
   			log.debug "Turning on water heater"
            switches.on()
        }
    	else if (timeNow >= timeToday(time21, location.timeZone).time && timeNow < timeToday(time31, location.timeZone).time) { // Are we between 2nd time and 3rd time
   			schedule(timeToday(time31, location.timeZone), initialize)
            log.info("$thermostat Scheduled next adjustment for ${timeToday(time31, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
            //sendNotificationEvent("$thermostat Scheduled next adjustment for ${timeToday(time31, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
			log.debug "Turning off water heater"
            switches.off()
        }
        else if (timeNow >= timeToday(time31, location.timeZone).time && timeNow < timeToday(time41, location.timeZone).time) { // Are we between 3rd time and 4th time
			schedule(timeToday(time41, location.timeZone), initialize)
            log.info("$thermostat Scheduled next adjustment for ${timeToday(time41, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
            //sendNotificationEvent("$thermostat Scheduled next adjustment for ${timeToday(time41, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
			log.debug "Turning on water heater"
            switches.on()
        }
        else if (timeNow >= timeToday(time41, location.timeZone).time && timeNow < midnightToday.time) { // Are we between 4th time and midnight, schedule the next day
			schedule(timeToday(time11, location.timeZone) + 1, initialize)
            log.info("$thermostat Scheduled next adjustment for ${(timeToday(time11, location.timeZone) + 1).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
            //sendNotificationEvent("$thermostat Scheduled next adjustment for ${(timeToday(time11, location.timeZone) + 1).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
        	log.debug "Turning off water heater"
            switches.off()
        }
        else if (timeNow >= (midnightToday - 1).time && timeNow < timeToday(time11, location.timeZone).time) { // Are we between midnight yesterday and 1st time, schedule today
			schedule(timeToday(time11, location.timeZone), initialize)
            log.info("$thermostat Scheduled next adjustment for ${timeToday(time11, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
			//sendNotificationEvent("$thermostat Scheduled next adjustment for ${timeToday(time11, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
        	log.debug "Turning on water heater"
            switches.on()
        }
		break

	case Calendar.SUNDAY:
        if (timeNow >= timeToday(time11, location.timeZone).time && timeNow < timeToday(time21, location.timeZone).time) { // Are we between 1st time and 2nd time
    		schedule(timeToday(time21, location.timeZone), initialize)
            log.info("$thermostat Scheduled next adjustment for ${timeToday(time21, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
            //sendNotificationEvent("$thermostat Scheduled next adjustment for ${timeToday(time21, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
			log.debug "Turning on water heater"        		
            switches.on()
        }
    	else if (timeNow >= timeToday(time21, location.timeZone).time && timeNow < timeToday(time31, location.timeZone).time) { // Are we between 2nd time and 3rd time
        	schedule(timeToday(time31, location.timeZone), initialize)
            log.info("$thermostat Scheduled next adjustment for ${timeToday(time31, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
            //sendNotificationEvent("$thermostat Scheduled next adjustment for ${timeToday(time31, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
            log.debug "Turning off water heater"
            switches.off()
        }
        else if (timeNow >= timeToday(time31, location.timeZone).time && timeNow < timeToday(time41, location.timeZone).time) { // Are we between 3rd time and 4th time
        	schedule(timeToday(time41, location.timeZone), initialize)
            log.info("$thermostat Scheduled next adjustment for ${timeToday(time41, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
            //sendNotificationEvent("$thermostat Scheduled next adjustment for ${timeToday(time41, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
        	log.debug "Turning on water heater"
            switches.on()
        }
        else if (timeNow >= timeToday(time41, location.timeZone).time && timeNow < midnightToday.time) { // Are we between 4th time Sunday and midnight, we schedule Monday
        	schedule(timeToday(time1, location.timeZone) + 1, initialize)
            log.info("$thermostat Scheduled next adjustment for ${(timeToday(time1, location.timeZone) + 1).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
            //sendNotificationEvent("$thermostat Scheduled next adjustment for ${(timeToday(time1, location.timeZone) + 1).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
        	log.debug "Turning off water heater"
            switches.off()
        }
        else if (timeNow >= (midnightToday - 1).time && timeNow < timeToday(time1, location.timeZone).time) { // Are we between midnight Sunday and 1st time on Monday, we schedule Monday
			schedule(timeToday(time1, location.timeZone), initialize)
            log.info("$thermostat Scheduled next adjustment for ${timeToday(time1, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
            //sendNotificationEvent("$thermostat Scheduled next adjustment for ${timeToday(time1, location.timeZone).format("EEE MMM dd yyyy HH:mm z", location.timeZone)}")
			log.debug "Turning on water heater"
            switches.on()
        }
		break
}

}


(JSTMYSTIC) #12

What about legionella http://lifehacker.com/whats-the-best-temperature-for-my-water-heater-1465372005?


(Jim Allen) #13

Where I live in Florida, our power company, FPL suggest setting the water heater temperature at 120 degrees. I have received a email about possible bacteria in the hot water supply, this person referenced a link to a Canadian information page. I would suggest that you search your local power company or health department to get suggestions for your area.

Personally I have mine set to 120 degrees. This might be a bit low if you like really hot water. I set my water heater to start an hour prior to my wake time, that way there is plenty of time for the water to heat, and I will typically run it at least an hour after everyone is finished bathing. In the evening I run it from 7 - 10 pm which allows time for bathing, cooking and washing dishes.

Let me know how it works for you, and if you make any changes that could make this more usable.

Good Luck

Jim


(Rex Irby) #14

Has anybody in this area of storage tank electric hot water heaters considered on demand hot water heaters.
Average person spends 25-40 per month to keep the water hot and this group saves some of this by shutting it down for certain periods. Why not just have it hot only when you need it??

Above - jimallen60 - says he saved 100/m by shutting it down for long periods during the day!! That means that he has a monthly cost of 120-150 to heat water per month. 20 years - 8% rate of return and $100 months comes to $59,195.69 - That is one expensive hot water heater. Same calc @ $140/m buys me an entry level Tesla Model S in 20 years!!

I Have a Takagi-JR natural gas it really saves money compared even to a natural gas tank heater. Family of 5 - 3 women - 2 of them 12-20 min showers still only cost 5-8 per month. Propane only doubles these numbers if you have a pool heater and do not have natural gas.

To use electricity to heat water takes three times as much BTU as a traditional natural gas tank heater and likely 4 times for a tankless NG model. This factor is from source BTU at the generation station to the final efficiency of you electric hot water tank model. For solar off grid homes maybe a good call but then they too usually go tankless as well when off grid.


(Dave) #15

Any chance you could just provide a link to the code in the IDE.
Cutting and pasting from this page is a little tedious.

Thanks, in advance…


(Jovan) #16

I went with Stiebel Elton accelera heat pump, much more efficient than electric resistance heaters, but it does cost significantly more