From 841d2d6e5871d202e6a067c5526d780cca11fe6e Mon Sep 17 00:00:00 2001 From: Frans Veldman Date: Wed, 2 Apr 2025 00:24:07 +0000 Subject: [PATCH] We can now always use 12V Relays and 12V solenoids, thanks to PWM. --- HotWaterManager.h | 2 +- HotWaterManager.ino | 59 +- Installation_Basic.kicad_sch | 1710 ++++++++++++++++++++++++++++++++++ 3 files changed, 1751 insertions(+), 20 deletions(-) create mode 100644 Installation_Basic.kicad_sch diff --git a/HotWaterManager.h b/HotWaterManager.h index 5afb79e..1b0af49 100644 --- a/HotWaterManager.h +++ b/HotWaterManager.h @@ -181,7 +181,7 @@ // Structure definitions struct rom_t { - uint16_t epromchk; uint8_t brightness; uint8_t disptimeout; uint16_t vreq; uint16_t vfloat; uint16_t voff; int16_t pause; boolean fahrenheit; int16_t tmin; int16_t ttarget; + uint16_t epromchk; uint8_t brightness; uint8_t disptimeout; uint16_t vreq; uint16_t vfloat; uint16_t voff; int16_t pause; bool fahrenheit; int16_t tmin; int16_t ttarget; int16_t tsanity; int16_t tmax; int16_t tsandays; int16_t tnosan; uint16_t calibration; int16_t pumpdelta; uint16_t pumpafterrun; uint16_t hwv_timer; bool vmul; uint8_t hwv_pwm; uint8_t pumpMode; uint8_t ledmode; bool lcdglow; uint8_t holdon; uint8_t nightbright; uint8_t nightsensor; uint8_t relaypwm; bool altfunc; }; diff --git a/HotWaterManager.ino b/HotWaterManager.ino index 5bf0b99..1fd8e7c 100644 --- a/HotWaterManager.ino +++ b/HotWaterManager.ino @@ -516,7 +516,7 @@ void loop() { menuedit=!menuedit; // Long press is either exit or entry of a setup function lcd.clear(); // Show the associated menu option - printMenu(menusel-100,menuedit,rom.fahrenheit); + printMenu(menusel-100,menuedit); if(!menuedit && romdirty) { // We are not in edit mode but made the rom "dirty"? if(freset) @@ -564,8 +564,8 @@ void loop() { lcd.clear(); // Are we editing a setup menu item? if(menuedit) { // Are we in edit mode? - editItem(menusel-100, rom.vmul); // Edit the item - printMenu(menusel-100,menuedit,rom.fahrenheit); + editItem(menusel-100); // Edit the item + printMenu(menusel-100,menuedit); } else { // Not in edit mode if(menusel>=99) { // Are we in the setup menu? nextMenuItem(); // Advance to the next menu item @@ -582,7 +582,7 @@ void loop() { } else { // No button was pressed if(menusel>=100 && menuedit && getPgmVal(&menu[menusel-100].code)==MENU_SHOW) { lcd.setCursor(0,0); - printMenu(menusel-100,menuedit,rom.fahrenheit); // This menu option has no timeout + printMenu(menusel-100,menuedit); // This menu option has no timeout } else { if(menusel && seconds()-menuseltimer>(MENUTIMEOUT)) { @@ -669,7 +669,7 @@ void processmodes() { lcd.print(F("Tank ")); } - printTemperature(readtemp(src),1,rom.fahrenheit); // Display the temperature + printTemperature(readtemp(src),1); // Display the temperature if(tempdata[src].failures) // If we failed to receive valid data from the sensor... lcd.write('?'); // ... indicate this with a question mark... else // ... othersiwse... @@ -898,8 +898,8 @@ void heaterState(boolean state) { // Take care of the relay PWM if it has been configured if(state && rom.relaypwm<100 && digitalRead(HEATER) && seconds()-lastChange>2) - analogWrite(HEATER,((uint16_t)rom.relaypwm*255)/100);// Set the PWM to the desired percentage. - + analogWrite12V(HEATER,rom.relaypwm); + // If we want to change state, do so only after at least some time has passed since the last change if((!state && seconds()-lastChange>rom.holdon) || (state && seconds()-lastChange>HOLD_OFF)) { if(state) // If we switch the heater on... @@ -907,7 +907,11 @@ void heaterState(boolean state) { if(digitalRead(HEATER)!=state) { // Need to change the heater state? lastChange=seconds(); delay(20); - digitalWrite(HEATER,state); // Switch the heater + if(state) + analogWrite12V(HEATER,100); // Set heater output to 100% + else + analogWrite12V(HEATER,0); // Set heater output to 0% +// digitalWrite(HEATER,state); // Switch the heater if(rom.hwv_timer && !hwv && state) // If we have a HWV and it is not on, and we switch on the heater... setHWV(true,HWVBLEED); // ... switch on the HWV to equalize the pressure } @@ -927,11 +931,28 @@ void setHWV(bool state, uint16_t hwvtmr) { } hwv=state; // Register the new state if(state) // We want to switch it on - analogWrite(HWV,((uint16_t)rom.hwv_pwm*255)/100); // Use PWM for this + analogWrite12V(HWV,rom.hwv_pwm); // Use PWM for this else // Otherwise digitalWrite(HWV,LOW); // Switch it off } + +void analogWrite12V(uint8_t port,uint8_t percent) { + if(percent>=100) { + digitalWrite(port,HIGH); // Set port to high so we can read back port state + if(rom.vmul) // If 24V + analogWrite(port,127); // Set an initial value of 50%. + } else { + uint16_t val = ((uint16_t)percent*256)/100; + if(rom.vmul) // In case of 24V + val/=2; // Divide PWM by 2 + analogWrite(port,val); + } + if(!percent) // If we want to switch it completely off + digitalWrite(port,LOW); // Do a digitalWrite +} + + // This routine will keep track whether there is a legionella chance boolean sanitycheck() { static boolean sancounting=false; @@ -1005,7 +1026,7 @@ void fptr_showTemp() { lcd.setCursor(9,1); tempdata[0].mmaTemp.samples=0; tempdata[0].mmaTemp.sum=0; - printTemperature(readtemp(0),1,rom.fahrenheit); + printTemperature(readtemp(0),1); } void fptr_pumpsource() { @@ -1027,9 +1048,9 @@ void fptr_pumpsource() { void fptr_showtemps() { lcd.setCursor(5,1); if(sensors.useDS && sensors.temphwa[1][0]) { - printTemperature(readtemp(0),0,rom.fahrenheit); + printTemperature(readtemp(0),0); lcd.print(" "); - printTemperature(readtemp(1),0,rom.fahrenheit); + printTemperature(readtemp(1),0); } else { lcd.print("N/A"); swapTsens=false; @@ -1102,7 +1123,7 @@ void fptr_serialnr() { #endif -void printMenu(uint8_t item, boolean edit, boolean fahrenheit) { +void printMenu(uint8_t item, boolean edit) { uint8_t code = getPgmVal(&menu[item].code); uint16_t value = getRomValue(code,item); @@ -1126,7 +1147,7 @@ void printMenu(uint8_t item, boolean edit, boolean fahrenheit) { if(code & (MENU_8 | MENU_16)) { if(code & MENU_FLOAT) if(code & MENU_TEMP) - printTemperature(value,0,fahrenheit); + printTemperature(value,0); else lcd.print((float) ((float)value/pow(10.0,(float)(code & MENU_FLOAT))), code & MENU_FLOAT); else @@ -1167,7 +1188,7 @@ uint16_t getRomValue(uint8_t code, uint8_t item) { } -void editItem(uint8_t item, bool vmul) { +void editItem(uint8_t item) { uint8_t code = getPgmVal(&menu[item].code); if(code==MENU_SHOW) @@ -1181,7 +1202,7 @@ void editItem(uint8_t item, bool vmul) { romdirty=true; // Remember to save changes in EEPROM - if(code & MENU_VOLTS && vmul) { // If some voltage menu option is selected and we operate on a 24V system... + if(code & MENU_VOLTS && rom.vmul) { // If some voltage menu option is selected and we operate on a 24V system... step*=2; max*=2; min*=2; // Multiply all voltage steps, minimums and maximums by two. } @@ -1213,7 +1234,7 @@ void nextMenuItem() { menusel=100; // Reached the last one, rewind to the first one fn=getPgmVal(&menu[menusel-100].sfx); } while((rom.altfunc && ( fn & NOALT)) || (!rom.altfunc && (fn & FNALT)) ); - printMenu(menusel-100,menuedit,rom.fahrenheit); + printMenu(menusel-100,menuedit); } @@ -1361,8 +1382,8 @@ const char* pgmLcdPrint(const char *txt) { } -void printTemperature(int16_t value,uint8_t precision, boolean fahrenheit) { - if(fahrenheit) { +void printTemperature(int16_t value,uint8_t precision) { + if(rom.fahrenheit) { lcd.print(((float)value*0.18)+32.0,precision); lcd.print("\xDF""F"); if(precision && (float)value*0.18+32.0<100) diff --git a/Installation_Basic.kicad_sch b/Installation_Basic.kicad_sch new file mode 100644 index 0000000..5a35a1f --- /dev/null +++ b/Installation_Basic.kicad_sch @@ -0,0 +1,1710 @@ +(kicad_sch + (version 20231120) + (generator "eeschema") + (generator_version "8.0") + (uuid "592e3240-d716-41b6-a898-92e809a57c6b") + (paper "A4") + (lib_symbols + (symbol "Connector:Conn_Plug_2P" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "P" + (at -7.112 8.636 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Conn_Plug_2P" + (at 0.254 -8.89 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at -4.572 -0.254 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "2 Pins non-protected generic plug " + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "2P mains plug wall" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "CEE*7/2* CEE*7/16* CEE*7/17* NEMA*1?15* SN?441011*Type?11*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Conn_Plug_2P_0_1" + (circle + (center 0 0) + (radius 5.08) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "Conn_Plug_2P_1_1" + (rectangle + (start -7.62 7.62) + (end 7.62 -7.62) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (circle + (center -3.175 0) + (radius 0.635) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 3.175 0) + (radius 0.635) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (pin power_in line + (at 10.16 5.08 180) + (length 2.54) + (name "L" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_out line + (at 10.16 -5.08 180) + (length 2.54) + (name "N" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Device:Battery" + (pin_numbers hide) + (pin_names + (offset 0) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "BT" + (at 2.54 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Battery" + (at 2.54 0 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 0 1.524 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 1.524 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Multiple-cell battery" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "batt voltage-source cell" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Battery_0_1" + (rectangle + (start -2.286 -1.27) + (end 2.286 -1.524) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (rectangle + (start -2.286 1.778) + (end 2.286 1.524) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (rectangle + (start -1.524 -2.032) + (end 1.524 -2.54) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (rectangle + (start -1.524 1.016) + (end 1.524 0.508) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy 0 -1.016) (xy 0 -0.762) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 -0.508) (xy 0 -0.254) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 0.254) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 1.778) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.762 3.048) (xy 1.778 3.048) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.27 3.556) (xy 1.27 2.54) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "Battery_1_1" + (pin passive line + (at 0 5.08 270) + (length 2.54) + (name "+" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -5.08 90) + (length 2.54) + (name "-" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Device:Fuse" + (pin_numbers hide) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "F" + (at 2.032 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Fuse" + (at -1.905 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at -1.778 0 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Fuse" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "fuse" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "*Fuse*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Fuse_0_1" + (rectangle + (start -0.762 -2.54) + (end 0.762 2.54) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0 -2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "Fuse_1_1" + (pin passive line + (at 0 3.81 270) + (length 1.27) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 1.27) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Sensor_Temperature:DS18B20" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -3.81 6.35 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "DS18B20" + (at 6.35 6.35 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline" + (at -25.4 -6.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf" + (at -3.81 6.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Programmable Resolution 1-Wire Digital Thermometer TO-92" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "OneWire 1Wire Dallas Maxim" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TO*92*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "DS18B20_0_1" + (rectangle + (start -5.08 5.08) + (end 5.08 -5.08) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (circle + (center -3.302 -2.54) + (radius 1.27) + (stroke + (width 0.254) + (type default) + ) + (fill + (type outline) + ) + ) + (rectangle + (start -2.667 -1.905) + (end -3.937 0) + (stroke + (width 0.254) + (type default) + ) + (fill + (type outline) + ) + ) + (arc + (start -2.667 3.175) + (mid -3.302 3.8073) + (end -3.937 3.175) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -3.937 0.635) (xy -3.302 0.635) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -3.937 1.27) (xy -3.302 1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -3.937 1.905) (xy -3.302 1.905) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -3.937 2.54) (xy -3.302 2.54) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -3.937 3.175) (xy -3.937 0) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -3.937 3.175) (xy -3.302 3.175) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -2.667 3.175) (xy -2.667 0) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "DS18B20_1_1" + (pin power_in line + (at 0 -7.62 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 7.62 0 180) + (length 2.54) + (name "DQ" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 7.62 270) + (length 2.54) + (name "V_{DD}" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + ) + (wire + (pts + (xy 142.24 92.71) (xy 81.28 92.71) + ) + (stroke + (width 0.762) + (type default) + (color 194 0 0 1) + ) + (uuid "002e419c-5997-4f0e-a220-ac4fae14d5e9") + ) + (wire + (pts + (xy 158.75 92.71) (xy 158.75 124.46) + ) + (stroke + (width 0.762) + (type default) + (color 194 0 0 1) + ) + (uuid "01f6aa3c-7a69-4e72-9b0b-6ffd831974dd") + ) + (wire + (pts + (xy 92.71 153.67) (xy 92.71 156.21) + ) + (stroke + (width 0.762) + (type default) + (color 167 125 0 1) + ) + (uuid "020c15ad-d040-43ef-894c-b4ea7c447117") + ) + (wire + (pts + (xy 74.93 104.14) (xy 74.93 115.57) + ) + (stroke + (width 0.762) + (type default) + ) + (uuid "02761911-00f2-4b8f-ad23-8f26d17f75b1") + ) + (wire + (pts + (xy 55.88 52.07) (xy 55.88 101.6) + ) + (stroke + (width 0.762) + (type default) + (color 0 0 0 1) + ) + (uuid "092c9e78-efd8-41a4-96b6-eca86b2b0231") + ) + (wire + (pts + (xy 109.22 161.29) (xy 86.36 161.29) + ) + (stroke + (width 0.762) + (type default) + (color 167 125 0 1) + ) + (uuid "0b13c74d-a33a-4a4e-b5d2-3c3764bb0d01") + ) + (wire + (pts + (xy 43.18 35.56) (xy 43.18 101.6) + ) + (stroke + (width 0.762) + (type default) + (color 194 0 0 1) + ) + (uuid "1972816c-846d-4703-85eb-57c5bcdb3ca7") + ) + (polyline + (pts + (xy 69.85 58.42) (xy 83.82 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "22ecf3f0-5dc4-4e0d-a026-2ccceae191b6") + ) + (polyline + (pts + (xy 83.82 57.15) (xy 69.85 57.15) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2e183c90-66fc-4cda-8bed-27eb5844af83") + ) + (wire + (pts + (xy 86.36 139.7) (xy 86.36 151.13) + ) + (stroke + (width 0.762) + (type default) + ) + (uuid "2fcee9f1-4a79-4c00-ab56-f31efb30e73a") + ) + (wire + (pts + (xy 88.9 55.88) (xy 152.4 55.88) + ) + (stroke + (width 0.762) + (type default) + (color 64 48 0 1) + ) + (uuid "3e8986e7-899c-4970-892d-8e42326202ea") + ) + (wire + (pts + (xy 49.53 104.14) (xy 49.53 115.57) + ) + (stroke + (width 0.762) + (type default) + ) + (uuid "43ec71a8-d42f-4c6c-b758-03c5514ea7cd") + ) + (wire + (pts + (xy 109.22 59.69) (xy 109.22 161.29) + ) + (stroke + (width 0.762) + (type default) + (color 167 125 0 1) + ) + (uuid "4eb28901-996c-4c67-b4d7-053f3f09bc31") + ) + (wire + (pts + (xy 49.53 52.07) (xy 49.53 101.6) + ) + (stroke + (width 0.762) + (type default) + (color 194 194 0 1) + ) + (uuid "520161dd-4842-490d-ab66-afa9667eab08") + ) + (wire + (pts + (xy 88.9 59.69) (xy 104.14 59.69) + ) + (stroke + (width 0.762) + (type default) + (color 64 48 0 1) + ) + (uuid "53bd85e2-7758-4c47-948f-ceec8b79e351") + ) + (wire + (pts + (xy 54.61 35.56) (xy 43.18 35.56) + ) + (stroke + (width 0.762) + (type default) + (color 194 0 0 1) + ) + (uuid "575d98ee-8df2-4667-810e-d419202d2089") + ) + (wire + (pts + (xy 46.99 43.18) (xy 46.99 52.07) + ) + (stroke + (width 0.762) + (type default) + (color 194 194 0 1) + ) + (uuid "59370c46-fbcf-4308-bb08-4738d7796ec6") + ) + (wire + (pts + (xy 86.36 153.67) (xy 86.36 161.29) + ) + (stroke + (width 0.762) + (type default) + (color 167 125 0 1) + ) + (uuid "5e93dae6-b5a7-4879-804b-4aac424c7c75") + ) + (wire + (pts + (xy 68.58 104.14) (xy 68.58 115.57) + ) + (stroke + (width 0.762) + (type default) + ) + (uuid "6821ac1b-6e42-4c9f-a514-581678d777c1") + ) + (wire + (pts + (xy 133.35 125.73) (xy 133.35 130.81) + ) + (stroke + (width 0.762) + (type default) + ) + (uuid "6b5c6f1b-47aa-4359-bf11-02ca6391756f") + ) + (wire + (pts + (xy 104.14 156.21) (xy 104.14 59.69) + ) + (stroke + (width 0.762) + (type default) + (color 167 125 0 1) + ) + (uuid "77d02756-0129-4ebd-a89a-cd5d57a07ed5") + ) + (polyline + (pts + (xy 69.85 59.69) (xy 69.85 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "78ed8db2-b9b1-4363-8948-4fd7982d94a1") + ) + (wire + (pts + (xy 158.75 125.73) (xy 158.75 130.81) + ) + (stroke + (width 0.762) + (type default) + ) + (uuid "7ad89941-0e3f-429d-b8b2-b5ebb893e98e") + ) + (wire + (pts + (xy 62.23 104.14) (xy 62.23 115.57) + ) + (stroke + (width 0.762) + (type default) + ) + (uuid "80362f80-d33d-46c6-8452-7276f797ecd9") + ) + (polyline + (pts + (xy 69.85 57.15) (xy 69.85 55.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8112458a-b431-4fa2-a013-241dc34ea78c") + ) + (wire + (pts + (xy 92.71 139.7) (xy 92.71 151.13) + ) + (stroke + (width 0.762) + (type default) + ) + (uuid "84f3b682-9135-4fea-8591-8977a374fdae") + ) + (wire + (pts + (xy 43.18 104.14) (xy 43.18 115.57) + ) + (stroke + (width 0.762) + (type default) + ) + (uuid "9314b755-e9f7-413e-a404-fb4a6fd97121") + ) + (wire + (pts + (xy 133.35 97.79) (xy 87.63 97.79) + ) + (stroke + (width 0.762) + (type default) + (color 0 0 0 1) + ) + (uuid "9ba73c45-0744-486d-8604-1406d37d5b71") + ) + (wire + (pts + (xy 55.88 104.14) (xy 55.88 115.57) + ) + (stroke + (width 0.762) + (type default) + ) + (uuid "9d832ea3-7e6d-4173-9553-d1c6ff8cef49") + ) + (wire + (pts + (xy 87.63 104.14) (xy 87.63 115.57) + ) + (stroke + (width 0.762) + (type default) + ) + (uuid "b14cd8a2-49b8-4056-9e11-39d07612e051") + ) + (polyline + (pts + (xy 85.09 59.69) (xy 69.85 59.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b60613df-9bb9-40cd-b913-5853c46d12d8") + ) + (wire + (pts + (xy 158.75 92.71) (xy 149.86 92.71) + ) + (stroke + (width 0.762) + (type default) + (color 194 0 0 1) + ) + (uuid "c6e7b70b-2405-4e1f-b9fe-78969a705299") + ) + (wire + (pts + (xy 92.71 156.21) (xy 104.14 156.21) + ) + (stroke + (width 0.762) + (type default) + (color 167 125 0 1) + ) + (uuid "dbf5bb51-bbae-40a5-92d7-6c8a269069c7") + ) + (wire + (pts + (xy 81.28 92.71) (xy 81.28 101.6) + ) + (stroke + (width 0.762) + (type default) + (color 194 0 0 1) + ) + (uuid "dc674e60-1a13-4613-9266-80ae63ec0872") + ) + (wire + (pts + (xy 46.99 52.07) (xy 49.53 52.07) + ) + (stroke + (width 0.762) + (type default) + (color 194 194 0 1) + ) + (uuid "e04313ae-60a3-48a1-93ed-71ee00c73a17") + ) + (polyline + (pts + (xy 69.85 55.88) (xy 85.09 55.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e5dcc08a-bf26-4748-9490-914532e80fd3") + ) + (wire + (pts + (xy 87.63 97.79) (xy 87.63 101.6) + ) + (stroke + (width 0.762) + (type default) + (color 0 0 0 1) + ) + (uuid "eaeb7532-d812-4c9b-9402-89078472e2f0") + ) + (wire + (pts + (xy 133.35 97.79) (xy 133.35 124.46) + ) + (stroke + (width 0.762) + (type default) + (color 0 0 0 1) + ) + (uuid "f06c3290-dc6d-4fc3-b0bc-6bd352490e6c") + ) + (wire + (pts + (xy 109.22 59.69) (xy 152.4 59.69) + ) + (stroke + (width 0.762) + (type default) + (color 64 48 0 1) + ) + (uuid "faaae127-cfd0-400d-ab44-d8ab12f4a718") + ) + (wire + (pts + (xy 81.28 104.14) (xy 81.28 115.57) + ) + (stroke + (width 0.762) + (type default) + ) + (uuid "fcca36dd-4f2e-495b-8aa4-57f078658d62") + ) + (polyline + (pts + (xy 83.82 58.42) (xy 83.82 57.15) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fdffff9b-a1d2-47d8-84bd-b10eaf4c016f") + ) + (rectangle + (start 36.83 110.49) + (end 99.06 144.78) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + (uuid 0f6d9cce-6633-4eae-87cd-9249d7418d6f) + ) + (rectangle + (start 64.77 27.94) + (end 86.36 63.5) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + (uuid e32188d5-6965-4769-bc07-c00a929ccb19) + ) + (rectangle + (start 129.54 128.27) + (end 162.56 144.78) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + (uuid fb39197b-65f7-46fe-a0f1-21f283b63cd0) + ) + (text "D" + (exclude_from_sim no) + (at 74.93 118.11 90) + (effects + (font + (size 2.54 2.54) + (thickness 0.508) + (bold yes) + ) + ) + (uuid "1064d342-b27c-4848-b2aa-a07f73d32b04") + ) + (text "HotWaterManager" + (exclude_from_sim no) + (at 56.388 137.414 0) + (effects + (font + (size 2.032 2.032) + (italic yes) + ) + ) + (uuid "333daaab-3dab-4ce2-8adb-02e2072e0557") + ) + (text "Relay" + (exclude_from_sim no) + (at 92.71 133.858 90) + (effects + (font + (size 2.54 2.54) + (thickness 0.508) + (bold yes) + ) + ) + (uuid "3457a8b3-5fa2-4764-88f0-4510d36f15d0") + ) + (text "Temperature\nSensor" + (exclude_from_sim no) + (at 48.514 31.242 0) + (effects + (font + (size 2.032 2.032) + (italic yes) + ) + ) + (uuid "3589d449-1eab-4916-9577-d86b5ac0545b") + ) + (text "Relay" + (exclude_from_sim no) + (at 86.614 133.858 90) + (effects + (font + (size 2.54 2.54) + (thickness 0.508) + (bold yes) + ) + ) + (uuid "55d8ec31-a2c3-48b2-acc4-d9ecfddf8098") + ) + (text "Control" + (exclude_from_sim no) + (at 68.58 123.444 90) + (effects + (font + (size 2.54 2.54) + (thickness 0.508) + (bold yes) + ) + ) + (uuid "5fec24b4-896e-4a41-97a7-94fb1e2337a9") + ) + (text "+" + (exclude_from_sim no) + (at 158.75 133.858 0) + (effects + (font + (size 3.81 3.81) + (thickness 0.762) + (bold yes) + ) + ) + (uuid "6413bac1-db7a-4629-83b7-76ebc8d108b8") + ) + (text "Pwr+" + (exclude_from_sim no) + (at 81.026 121.92 90) + (effects + (font + (size 2.54 2.54) + (thickness 0.508) + (bold yes) + ) + ) + (uuid "6ee76a9d-77b2-445a-959b-4077d1d8b6ac") + ) + (text "Aux" + (exclude_from_sim no) + (at 62.484 120.142 90) + (effects + (font + (size 2.54 2.54) + (thickness 0.508) + (bold yes) + ) + ) + (uuid "6fa1b835-b6cf-4f65-8a18-fa2f073aeb75") + ) + (text "-" + (exclude_from_sim no) + (at 133.096 134.112 0) + (effects + (font + (size 3.81 3.81) + (bold yes) + ) + ) + (uuid "863ccb35-dee6-4405-a802-6b2a13292b1e") + ) + (text "Water\nHeater" + (exclude_from_sim no) + (at 75.184 34.29 0) + (effects + (font + (size 2.032 2.032) + (italic yes) + ) + ) + (uuid "9da388f7-6876-4794-81be-2b07d35a4c80") + ) + (text "Tsens-" + (exclude_from_sim no) + (at 55.88 123.444 90) + (effects + (font + (size 2.54 2.54) + (thickness 0.508) + (bold yes) + ) + ) + (uuid "a305e4f8-347d-4cb8-bdd5-e2ad721f0d33") + ) + (text "Wall\nSocket" + (exclude_from_sim no) + (at 162.814 43.688 0) + (effects + (font + (size 2.032 2.032) + (italic yes) + ) + ) + (uuid "d8000346-e4ff-4dbe-90fe-873f535fb69f") + ) + (text "Tsens+" + (exclude_from_sim no) + (at 43.18 123.444 90) + (effects + (font + (size 2.54 2.54) + (thickness 0.508) + (bold yes) + ) + ) + (uuid "db12d8f5-f1bb-4583-89a7-0cbf3ea3282b") + ) + (text "TsensDat" + (exclude_from_sim no) + (at 49.53 124.968 90) + (effects + (font + (size 2.54 2.54) + (thickness 0.508) + (bold yes) + ) + ) + (uuid "e1b51c99-004c-4eb8-8895-bde7614821cd") + ) + (text "Pwr-" + (exclude_from_sim no) + (at 87.122 121.92 90) + (effects + (font + (size 2.54 2.54) + (thickness 0.508) + (bold yes) + ) + ) + (uuid "fcbdcb24-b81c-4aaa-bed1-02c7d50ca92e") + ) + (symbol + (lib_id "Connector:Conn_Plug_2P") + (at 163.83 58.42 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "647da9b1-e341-40b8-b32d-d7f0c64b10da") + (property "Reference" "P1" + (at 172.72 57.1499 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + (hide yes) + ) + ) + (property "Value" "Conn_Plug_2P" + (at 172.72 59.6899 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + (hide yes) + ) + ) + (property "Footprint" "" + (at 168.402 58.166 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 163.83 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "2 Pins non-protected generic plug" + (at 163.83 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "76ff1627-ca5d-4348-8543-d66389cd3f8b") + ) + (pin "1" + (uuid "395e6d2a-fdcc-45a3-9c1a-dfc1f3bf9290") + ) + (instances + (project "" + (path "/592e3240-d716-41b6-a898-92e809a57c6b" + (reference "P1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Sensor_Temperature:DS18B20") + (at 55.88 43.18 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a74351c6-2f6c-4937-a787-54b6e5bd5123") + (property "Reference" "U1" + (at 62.23 41.9099 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + (hide yes) + ) + ) + (property "Value" "DS18B20" + (at 57.15 34.798 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + (hide yes) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline" + (at 81.28 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf" + (at 59.69 36.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Programmable Resolution 1-Wire Digital Thermometer TO-92" + (at 55.88 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "318a6d46-0902-4484-82a3-732f09265c3a") + ) + (pin "3" + (uuid "1e5b3756-52e6-4c96-910e-6d5a87259081") + ) + (pin "2" + (uuid "53f7edeb-43ac-477e-972b-49155242a87e") + ) + (instances + (project "Installation" + (path "/592e3240-d716-41b6-a898-92e809a57c6b" + (reference "U1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:Fuse") + (at 146.05 92.71 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "aff6dc4e-9e54-41bb-8329-a4dbb0afc7d7") + (property "Reference" "F2" + (at 146.05 99.06 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "Fuse" + (at 146.05 90.17 90) + (effects + (font + (size 2.032 2.032) + (bold yes) + (italic yes) + ) + ) + ) + (property "Footprint" "" + (at 146.05 90.932 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 146.05 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Fuse" + (at 146.05 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "3f50884f-90b1-4bd8-a600-21fc87b500ca") + ) + (pin "2" + (uuid "ce99cd6c-6d18-4374-be5d-eb48fd8ebf18") + ) + (instances + (project "Installation" + (path "/592e3240-d716-41b6-a898-92e809a57c6b" + (reference "F2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:Battery") + (at 146.05 137.16 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "fa424fb9-2e89-44d3-9e34-e4f905e64253") + (property "Reference" "BT1" + (at 146.6215 129.54 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "Battery" + (at 145.796 132.334 90) + (effects + (font + (size 2.032 2.032) + (bold yes) + (italic yes) + ) + ) + ) + (property "Footprint" "" + (at 147.574 137.16 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 147.574 137.16 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Multiple-cell battery" + (at 146.05 137.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "38da8d47-c100-4cf3-a953-c6dc24a3615a") + ) + (pin "1" + (uuid "8d658495-8e41-421f-9901-9a73465e6223") + ) + (instances + (project "Installation" + (path "/592e3240-d716-41b6-a898-92e809a57c6b" + (reference "BT1") + (unit 1) + ) + ) + ) + ) + (sheet_instances + (path "/" + (page "1") + ) + ) +)