Friday, April 25, 2014

Lots to catch up on...........

I know its been a while since the last post, Im semi-good at these blogs. I have a tendency to get started and then start working on things and then next thing I know its been 2 months...Ill have to do better....or have my ADHD looked at.....

When I last left off, I had closed Version 3 and started on Version 4. Version 4 will be the same base as 3, but with some major modifications.

 1. All of the room nodes, will include temperature monitoring

 2. Major room nodes have been reduced. Instead of a room having several small nodes or MCU(arduinos) the redesign has used one big MCU ( Arduino MEGA) running several lights/sensors per room.

 3. MYSQL full integration. Tables broken down to include just the house, and another for the heating/cooling.

4. New script for check the online status of node, since the Pubsubclient doesnt have a way to use wills/testaments.

5. Dropped individual LCD screens for heating and cooling MCUs and now the nodes report status to the MQTT Broker. A Master MCU, subscribes to the topics, and provides a local display.

6. Looking into incorporating GhostEvents into the setup as a way to schedule events, as opposed to writing a lengthy trigger script I was using before.

7. Looking into ( I have downloaded and starting to configure) a software package called J.A.R.V.I.S, and as its name lends, its based on the Ironman AI Computer Jarvis from the movie. It has an excellent speech to text and voice recognition system, which will greatly reduce the workload,....if nothing else its fun to play with.

The major thing still is the web page design. For the initial testing phase, I simply used various tables set up and had real time data pushed to the tables. I want to totally depart from this. I have seen several good tutorials for using gauges, js, jqueryUI, and others that Im going to try.

I was able to get MYSQL connected to visual basic. I tinkered with going that direction, and making a visual basic windows form app, and just integrate into it what I wanted. When I started looking at adding graphical elements to visual basic, while some are excellent, very cool looking and not that hard to apply, when I saw the price tag for these my jaw dropped. Even for a non-commercial personal use, many started at 299 USD, thats simply not worth the ROI, since its just for me. So its back to using the webserver. This is totally fine with me. Id rather invest in hardware, that drop 300 dollars to make cool gauges on a VBapp.

Im still toying with the use of a full blown dashboard still, but that is going to require quite a bit of work. I have seen several example of these, and they are somewhat easier than I thought, so I might try.

Ok that about covers the last 10 weeks or so. I will start to blog on these parts in the coming weeks as time allows so stay tuned

Happy Coding!

Wednesday, February 19, 2014

Logic Layer Part2

Ok the Simple Logic layer script is just that pretty basic but as I mentioned earlier is serves as a place to make changes to the system without taking the system down. It basically a buffer between the nodes in the house and the main controller thats doing all the switching.....

So to better understand what I am doing this picture is a better representation

So for the House at least its not all that complicated really. In this blog we will be dealing with the LogicScript....

The Code:

 def on_message(mosq, obj, msg):
    ts =datetime.datetime.now().strftime("%B, %d %Y %I:%M%p")
   
    
    print ("---------------------------------------")
   
    print ("TIME RECEIVED: ")+ ts
    print ("FROM NODE: ") + (msg.topic)
    print ("NODE MSG: ") + (msg.payload)
   
 
    cli.publish('/HOUSE/Control/' , msg.payload) # <----- sends message to Controller (KIT1,1)
    print ("Message forwarded to Controller")
    print ("acknowledged @ ") + ts
    print
    cli.publish('/HOUSE/LogicClient/logicmsg/' , ' forwarded +( msg.payload)+ to Controller')
    print ("MSG update sent to webserver")
    
    if (msg.topic) == ("/ALARMS/Status"): # <-- leave off trailing / when comparing
      print (Fore.WHITE + Back.RED + Style.BRIGHT + ("STATUS: ALARM! "))
      print (Fore.RESET + Back.RESET + Style.RESET_ALL)
  

  # --------------------------------------PopUp Message------------------------------------
    subprocess.Popen(['notify-send', "System Message:",msg.payload])
    return              

    else:
     print ("STATUS: Normal")        
     print ("End of Event")
     print ("---------------------------------------")
     print
   
 
  def on_publish(mosq, obj, mid):
    pass

 

cli = mosquitto.Mosquitto("LogicClient")
cli.on_message = on_message
cli.on_publish = on_publish
cli.connect("192.168.30.4", 1883, 60)
cli.publish('/mainTopic/Announce/LogicClient/','Online')


cli.subscribe("/HOUSE/Kitchen/", 0)
cli.subscribe("/HOUSE/Livingroom/", 0)
cli.subscribe("/HOUSE/Bath/", 0)
cli.subscribe("/HOUSE/Bedrm1/", 0)
cli.subscribe("/HOUSE/Bedrm2/", 0)
cli.subscribe("/HOUSE/FrontPorch/", 0)
cli.subscribe("/HOUSE/Backporch/", 0)
cli.subscribe("/HOUSE/Garage1/", 0)
cli.subscribe("/HOUSE/Hallway/", 0)
cli.subscribe("/HOUSE/Office/", 0)
cli.subscribe("/HOUSE/Test/", 0)
cli.subscribe("/ALARMS/Status/" ,0)



while cli.loop() == 0:
    pass


The script itself is a loop of sorts. It is constantly listening to the network waiting to hear messages that are being published to topis it has subscribed to. If I have tio add or remove anything, then I can edit this script off line and then save and restart. Down time is next to zero.

The script is pretty self explanatory. The output is to a terminal windows which I can comment out once I get everything done. I like to see whats going on visually as I test and finalize parts of the system. The only funky thing really is the subprocess code. This is for my Ubuntu box, so it wont work on Windows. If there is an alarm detected, this causes my linux box to throw up a OSD for 10 secs in the upper right corner. Ubuntu users will know what I mean. Its a way to get my attention should a node post to the Alarms topic

Also since Im currently using a web page for my system to monitor and display statuses, the line cli.publish('/mainTopic/Announce/LogicClient/','Online')  posts to the webpage that this script is running. I still need to add a Last will and testament to this so if the script fails, then the MQTT server will post the testament message and Ill know something is wrong.

There are also some comments on here for me to remember. I found that the trailing "/" had to be ommited on the script or it would ignore messages published to topics....a "gotcha" I found out. 

This is a typical output from the script to the termimal. FP1,1 is the message that the front porch light has been turned on.



and this is an alarm event



So thats it for the Logic Script. It will evolve and refine as I progress but its a start amd it is working well right now in the house.

We will look at the Trigger script and the MySQL update script in future posts. In the meantime

Happy Coding!

Tuesday, February 18, 2014

Logic Layer....

As I posted in the last blog, I discovered the wonderful world of databases. Actually I had used them in the past, but not programmed anything such as queries or even created them. I had to laugh, cause back in the OLD OLD days, we didnt have databases. In fact if you wanted to store stuff say when running a BASIC program, you had to open a file, write to the file and close it.....sound familiar.....yeah that what we do now with databases.....history repeats itself...

As I mentioned in the last blog as well it became obvious that adding a logic layer just made sense. It gave me one place to modify the system without creating much in the way of downtime, actually none really and I could add or remove just about anything from the system as I wanted.

The Logic Layer is nothing more than a python script. I really do love python, its a powerful language and even just using IDLE, easy to program. I have not come across anything I thought of that I could not do in python, short of creating a GUI, which I would love to do, but thats more learning for later. The Logic layer script you can think of is a "front end" to the controller. Basically the logic script subscribes to ALL the topics on the MQTT server.....all of them. The output of this script is MANY publication to ONE topic. As of right now there are nearly two dozen different topics on the MQTT server, of which about 17 are house related. This will of course grow as the system does. The logic script then listens to all 17 topics, acts on payloads received, and issues payloads to ONE topic in return. This one topic is the ONLY topic the main controller arduino listens to. As I explained, this allows me a simple way to add and remove nodes from the system without ever touching the controller firmware.

The Script..........since Ill assume that you know how to use python, youll need to add some modules to python. I prefer to use pip, with my linux box. Its simply just less headache and easy to use, I like less head aches.....

The top of the script shows the modules youll need....

import mosquitto
import datetime

from colorama import init
from colorama import Fore, Back, Style
import sys
init()

print chr(27) + "[2J"
print
print
print (Fore.CYAN + Back.BLACK+  "    | MySQL DataBase Update Script |")
           
print


mosquitto module at least for ubuntu, can be gotten in the software center, I prefer synaptic, I even installed it back to my 12.10Ubuntu box after I installed ubuntu, its omitted in versions after 11.10 I think. I like synaptic, always have, and I dont have to deal with a bloated GUI of the software center. Since my production box doesnt have 40 cores, and 50GB of RAM, using synaptic is easier and faster. You can add it back to your ubuntu box by:

sudo apt-get install synaptic . Once you install it just pin it to the unity desktop bar

For Windows users, you can install all the python modules as you normally do. I work on both systems, however all my final work is done on a linux box.....


The module colorama, is totally unnecessary. Its  a fun module that allows you to change the fore ground, back ground and make the font bold, or dim in a terminal window. Since I like to, in production, use terminal window outputs to monitor the stability of a script when testing, adding color to represent certain conditions is cool. For instance, if I get an alarm, I can turn the output test to a bold white font, with a red background....catches your eye. Again, totally unnecessary, and you can ignore the code lines referring to it.

Datetime youll need to add...cool module that allows you to format time and date stamps. It totally worth reading or at least glancing over the documentation for datatime. This module came in real handy for the trigger script. Also it will match exactly the DATETIME setting for the time stamps in MySQL.....cool..

The rest of the top of this script is easy. print chr(27) + "[2J" does nothing more than clear the terminal window when the script is started, and then a script header. This just prints to th screen what script I am running, nothing more.

So now you know what modules to grab........next blog we will get into the nuts and bolts of the code...

Happy coding!

Wow time flies.....

Well after getting over the flu, FINALLY, I have been back at the coding for this winter. Here is a little of some of the additions I have been working on:

Version3 is done and put to bed. I decided on the protocol I am going to use from now on for all the MQTT topics, and subscriptions. I kept changing the way I was posting stuff to the MQTT server, through many revisons, it was time to decide on a standard.

  For Room nodes posting to the server I have decided on the standard of /SYSTEM/ROOM/node. Therefore if Kitchen light #1  in the house is activated, the the posted topic is /HOUSE/Kitchen/KIT1/. For the Engineering space. the all nodes post to /ENG/SYSTEM/Node. I know this seems silly maybe but I found out on version 3 that a small change one place creates a ripple effect cause you to change the published topics for nearly everything to reflect the change....SO Lesson learned when planning a system, decide on a protocol early on, stick with it.

Since version 3 is done, the improvements to version 4 included database integration. I HATE database admin stuff, but it soon because a necessary evil. I checked out many be decided of for the open souce database MySQL. I had to educate myself in the use, writing queries, and the proper creation of the database and the associated tables. In all reality, I had given databases a bad wrap, it was quite easy to learn and now I have one large database, with several tables.

The reason for database usage was quite simple. though the nodes can publish to the MQTT server, and other nodes can subscribe to topics and act on the published data, I needed places where nodes could pull current stored data. I am also working on what happens in the event of a power loss at the house. Its my intention that I will eventually be able to restore the house to the pre- loss of power state, once power is restored, by pulling the last data set out of the database. That part hasnt not been implemented yet, but will.

With the new found use of my database, it was necessary to update the table with new data in real time. A little funky for me really since I was relying on MQTT to do all the work. Also with using arduino based MQTT libraries, I discovered that there is no way to pass a "last will and testament" to the MQTT server.Wills arent not currently implemented in the latest MQTT libraries for arduinos.....SO what happens then if a node drops offline? The solution of course is time stamping the data, and then I can check the last time stamps against when I last heard the node....surpass a predetermined time frame, I have to assume the node is not communicating with the MQTT server.......

Finally I have decided on adding a couple of python scripts to the MQTT server. One of these scripts now acts as a logic layer. This script will also channel information between all of the room nodes in the house, to the Controller arduino thats actually switching lights on and off. I decided this was simpler. Adding this "logic layer" allows me to modify virtually anything, without the need to touch the Controller arduino. So for instance of I add something to the system, the logic script can be modified offline, saved and restarted as the new logic script. It provides one place to make changes in the system without the need to pull out the laptop, start up the arduino IDE and program the house control arduino. I will discuss this script in more detail in the next post.

I also added a second python script to the server computer. This script, called "trigger" merely is a simple script, basically running in an endless loop. It monitors the servers clock, and issues "triggers" based on time. So for instance, at 7:30pm I want the front porch light to come on, daily, I simply add the trigger to the script. If I was to modify the script, again I can do it offline, adding what I want, and then save it and restart the script to apply the new trigger. No need for additional RTC shields for arduinos, as all of the triggers fire off MQTT publications to the master controller arduino on the same topic the logic script does. Thus, at 7:30pm, the script will tell the controller to turn on the front porch light.......Ill discuss trigger script in more detail as well in a later post.

So I have been busy, and Ill start sharing more on the new revision in the near future.

In the meantime, happy coding!

Wednesday, January 15, 2014

I hate the flu

Well I started everything right at the end of 2013..........On January 1 2014, I was introduced to the H1N1 influenza virus, we didnt get along. For the next 2 weeks ( now 16 days) I have slowly worked my way through all the body aches, coughing, and lack of energy associated with the flu, I have determined that I will not skip another year without getting the flu shot. This has been terrible, to say the least.

I hope to continue with the blog in the next few days, as I start to get back to a normal routine


Tuesday, December 31, 2013

The Start.......

So I have my goal, now the means to get there, the fun part.......

Since I am heating with wood, fuel isnt the problem. The Problem is control and storage. I have already done the calculations for the storage, so really the control is the final puzzle piece

As I discussed earlier, the arduino MCU (micro-control unit) is the primary building block here. As I started with versions 1 and 2, it became necessary to make communication the underlying priority, but first the nuts and bolts.....

The system is pretty basic when you look at it. We have a wood furnace, a biomass heat exchanger, pumps and valves and a storage tank. Water is pumped from the tank, through the heat exchanger and back to the tank. I decided to have everything based on the temperature of the exchanger. After all, if you pump water through a cold exchanger, then we will be taking heat out of the storage tank and heating up a cold exchanger.....not good. 

The system is designed using two loops. The LOOPA is the primary and the LOOPB the backup, and the augmenter, more on that later. So Lets look at just the software to run just LOOPA for now. 

Here is the entire sketch: Its for a Arduino UnoR3, running with an ethernet connection. There is some MQTT stuff, Ill point out and talk about later, right now we will look at what its basically doing:


       #include <SPI.h>
        #include <LiquidCrystal_I2C.h>
        #include <Wire.h>
        #include <Ethernet.h>
        #include <PubSubClient.h>
          
          
        LiquidCrystal_I2C lcd(0x27, 20,4);
         
        byte mac[]    = {  0xDE, 0xAD, 0x01, 0xA1, 0xBE, 0xEF };
        byte server[] = { 192, 168, 30, 9 };
        byte ip[]     = { 192, 168, 30, 20 };
        byte subnet[] = {255, 255, 255, 0};
        byte gateway[] = { 192, 168, 30, 1};
        
        void callback(char* topic, byte* payload, unsigned int length) {
          // handle message arrived
        }
        EthernetClient ethClient;
        PubSubClient client(server, 1883, callback, ethClient);
         
          
          int EXCH = A0; 

          int DigiPinFLOA = 7;  //pin that reads FlowSW LOOP A

          int VALVE2 = 2;
          int VALVE1 = 8;
          int PUMPA = 9;
          int keepalive = 4;
          int DigiPinFLOAState = 0;
          int keepaliveState = 0;
   
    void setup()
            
            {
             Ethernet.begin(mac, ip,  subnet, gateway);
               if (client.connect("arduinoClientLA")) {
               client.publish("/mainTopic/Announce/LOOPA","ONLINE"); }
             
             
             
               pinMode(keepalive, OUTPUT);         
               pinMode(PUMPA, OUTPUT);
               pinMode(VALVE1, OUTPUT);
               pinMode(VALVE2, OUTPUT);
               pinMode(DigiPinFLOA, INPUT); 
               lcd.backlight();
               
               
               Serial.begin(9600); //start the serial connection
              //Title on first line of LCD
              lcd.backlight();
              lcd.begin();
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print("** LOOP-A STATUS **");
              
              digitalWrite(PUMPA,HIGH);   //// On Boot up shut everything off....
              digitalWrite(VALVE1, HIGH);
              digitalWrite(VALVE2,HIGH);
             
          }
          
          void loop()
          {
                      
                digitalWrite(keepalive, HIGH); // <--- keepalive Hardware signal to monitor)
               
             int reading = analogRead(EXCH); 
              float voltage = reading * 5.0; 
                   voltage /= 1024.0;
              float temperatureC = (voltage - 0.5) * 100;  
              float EXCH = (temperatureC * 9.0 / 5.0) + 32.0;
                char charMsgA[10];
                memset(charMsgA,'\0',10);
                dtostrf(EXCH, 4, 2, charMsgA);
                client.publish("/ENGTemps/EXCH/EXCH",charMsgA); // <-update EXCH temp to broker

            
            if (EXCH <150.00 ) { 
           
                 digitalWrite(PUMPA, HIGH);  //RelayBrd requires a HIGH for OFF
                   delay(2000);  //shut pump off wait 2 secs
                 digitalWrite(VALVE1, HIGH);
                 digitalWrite(VALVE2, HIGH);
                    delay(1000);  

                       lcd.setCursor(0,1);
                       lcd.print("   ** SHUTDOWN **  ");               
                      lcd.setCursor(0,3);
                       lcd.print("EXCH:        F");
                       lcd.setCursor(6,3);
                       lcd.print(EXCH);   
                     delay(750);
                   client.publish("/ENG/Status/LOOPA","SHUTDOWN"); // <--- Webpage update 
                   delay(1000);
                   client.publish("/LOOPA/Messages/","12"); // <-- Codes to Loop B
                    
                }//<<--- end <150 Loop
           
            
          
             if (EXCH >150.00 && EXCH < 200) {

                 digitalWrite(VALVE1,LOW); //LOW for ON, Open Valves, start pump
                 digitalWrite(VALVE2, LOW);
                     delay(3000);     
                   digitalWrite(PUMPA, LOW); 
                     delay(3000);
                  int (DigiPinFLOAState) = digitalRead(DigiPinFLOA); 
                    
                    if (DigiPinFLOAState == 0)
                      { 

                       lcd.setCursor(0,1);
                       lcd.print("   ++  FAILURE ++   ");               
                       lcd.setCursor(0,3);
                       lcd.print("EXCH:        F");
                       lcd.setCursor(6,3);
                       lcd.print(EXCH);
                      delay(750);
                    client.publish("/ENG/Status/LOOPA","FAILED"); // <--- Webpage update
                    delay(1000);
                    client.publish("/LOOPA/Messages/","10"); // <-- Codes to Loop B
                     
                 
                     }
                       
                    else  
                     {

                       lcd.setCursor(0,1);
                       lcd.print("    -- ONLINE --    ");               
                       lcd.setCursor(0,3);
                       lcd.print("EXCH:        F");
                       lcd.setCursor(6,3);
                       lcd.print(EXCH); 
                    delay(750);
                   client.publish("/ENG/Status/LOOPA","ONLINE"); // <--- Webpage update
                   delay(1000);
                   client.publish("/LOOPA/Messages/","11"); // <-- Codes to Loop B
                    delay(1000);   
                     }  
                        
                } //<<-- 150 endunderlaying
         
         
                if (EXCH > 200)
                 
                   {
                  
                   lcd.setCursor(0,1);
                       lcd.print("    -- ONLINE --    ");               
                       lcd.setCursor(0,3);
                       lcd.print("EXCH:        F");
                       lcd.setCursor(6,3);
                       lcd.print(EXCH);    
                  client.publish("/ENG/Status/LOOPA","ONLINE");
                  delay(500);   
                  client.publish("/LOOPA/Messages/" , "15");// <-- Codes to Loop B
                  delay(1500);
                 }  
               
         
          //  client.loop(); // listen to subscriptions for important messages
             
          } //<<-- void loop end
   



So lets look at the first part............

   int EXCH = A0; 

          int DigiPinFLOA = 7;  //pin that reads FlowSW LOOP A

          int VALVE2 = 2;
          int VALVE1 = 8;
          int PUMPA = 9;
          int keepalive = 4;
          int DigiPinFLOAState = 0;
          int keepaliveState = 0;

So the first part of the sketch is the meat of the sketch. For now Im gona ignore the MQTT stuff, but if you can read the sketch and understand it then youll see what Im doing.

This part sets up out pump for LOOPA, and the valves. Each Valve is on either side of the pump. If the pump fails, or the loop shutdown, the pump can be removed because the valves isolate the pump from the loop when shut. 

DigiPinFLOA is the digital signal that is coming from the FLOW Switch. A Flow Switch is just after the isolation valve. When the valves are open and the pump running, the FLOW Switch will gives us a digital +5Vdc, or a HIGH signal indicating water is in fact flowing in the loop. The Loop also has its own Exchange temperature sensor, which is connected to Analog A0. This is a TMP-36 but you can subsitiute what you like, youll just have to change the way the sketch interprets the voltage or resistance its sending back. In the case of a Maxim DS18B20, or similar, youll have to read the bytes coming back and the unique id for the sensor. All can be done, I chose the TMP-36, its easy to use, inexpensive, and does the job. This sensor is located in the biomass exchanger, and Ill show more of that later.

The keepaliveState, is a hardware heartbeat between this MCU and the Monitor. The Monitor is another MCU thats watching the operation of the system, for now its just telling the Monitor, Im "ALIVE"


The next section sets up all the pins for the arduino:
  

 void setup()
            
            {
             Ethernet.begin(mac, ip,  subnet, gateway);
               if (client.connect("arduinoClientLA")) {
               client.publish("/mainTopic/Announce/LOOPA","ONLINE"); }
             
             
             
               pinMode(keepalive, OUTPUT);         
               pinMode(PUMPA, OUTPUT);
               pinMode(VALVE1, OUTPUT);
               pinMode(VALVE2, OUTPUT);
               pinMode(DigiPinFLOA, INPUT); 
               lcd.backlight();
               
               
               Serial.begin(9600); //start the serial connection
              //Title on first line of LCD
              lcd.backlight();
              lcd.begin();
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print("** LOOP-A STATUS **");
              
              digitalWrite(PUMPA,HIGH);   //// On Boot up shut everything off....
              digitalWrite(VALVE1, HIGH);
              digitalWrite(VALVE2,HIGH);
             

The first part of the SETUP we will address later, thats the network stuff and the MQTT login. The next part is the pinModes, these setup the pins on the arduino and tell it what signals to read or send out signals on. You can also see there is a LCD attached, this sets up the LCD screen so you can visually see what is going on. Finally before the sketch goes into operation, we send the pump and valves a HIGH signal. The relay board running the pumps and valves, require a HIGH to turn them off. On boot, I selected everything to be off, as a starting point.

In part 2 of this start up, Ill explain the operation of the LOOP......

Monday, December 30, 2013

Just buy a stupid wood stove.............

So you have a house.......just reach for the thermostat............

Most of us know that in the modern era, heating and cooling is a no brainer. You build a house, or buy one, and everything you need to control the climate in your house is there. If its cold, turn up the thermostat, if hot turn it down.

I was in the US Navy for 8 years and for part of that time I was in the nuclear field. I was actually qualified to run a nuclear reactor and did many times. The principle of generating heat are nothing new but I was always fascinated but thermodynamics and the study of heat transfer. Most think that heat is removed, put an ice cube in a cup of coffee and it cools off, so where did the heat go. The premise is heat is transferred between objects not cold. Sit on a cold floor, and when you get up that spot is warm, why?, Your body transferred heat to the floor.

Thermodynamics are everywhere, even in your home heating and cooling system. The ability to control the climate depends on how you transfer the heat, in the winter we ad heat, summer we remove heat. Thus ends my Thermodynamics lesson. If you want to control the climate in your home control the heat.

I wanted to heat my home with natural fuels, and not rely "totally" on the electric grid. My choice was wood. With the work involved I even used wood when I live in a conventional home, and a outdoor furnace. It simply cant be beat, if you dont mind the work. In todays world not every one can go harvest a couple of trees, get 4 chords of wood and be set for the winter, time is precious. If you have the time though, this works. However, you can apply the same principles to an oil furnace, boiler system or even electric. It comes down to the need to control, the basic platform of home automation.

In a nuclear system, fission supplies the heat, heat is transferred to water, water heats more water to steam, and steam does the work. My system is the same basic principle. A wood furnace, coupled with a biomass exchanger, will transfer heat to water. The water then will be the body, or vessel to store the heat until its needed, whether its used to heat air for climate control, or preheat DHW, its vital that the 1000s of kilocalories transferred in the exchanger, be stored....some place.

I have done the calculations, and for me, with the system Im designing, it will be feasible to have a holding tank of 500 gallons of water, thoroughly and completely insulated. With a steady or at least a minimal amount of additional heat inputted to offset any loss, its still feasible way to store the heat. Other systems are out there, some use tanks with water and rock to store the heat. I have seen systems where a succession of insulated barrels are used, again your ideas, your methods.

Now the method to control all of this.........that in the next blog