{"id":382,"date":"2020-03-30T20:26:08","date_gmt":"2020-03-31T01:26:08","guid":{"rendered":"https:\/\/sundrysites.com\/?page_id=382"},"modified":"2020-03-30T20:26:08","modified_gmt":"2020-03-31T01:26:08","slug":"thermostat-sketch","status":"publish","type":"page","link":"https:\/\/sundrysites.com\/index.php\/home-info\/arduino-projects\/sketches\/thermostat-sketch\/","title":{"rendered":"Thermostat Sketch"},"content":{"rendered":"\n<p>This sketch is a thermostat for a small gas heater in a garage.&nbsp; It has an LCD display for current temperature, set point and status.&nbsp; It has two push buttons to lower and raise the set point, and HCA can also change the set point via the network.&nbsp; This thermostat reports when it comes on, goes off and the duration to HCA.<\/p>\n\n\n\n<p>\/\/ include the library code:<br>#include &lt;SPI.h&gt;<br>#include &lt;LiquidCrystal.h&gt;<br>#include &lt;OneWire.h&gt;<br>#include &lt;Ethernet.h&gt;<br>#include &lt;EthernetUdp.h&gt;<br>#include &lt;stdlib.h&gt;<\/p>\n\n\n\n<p>\/\/ initialize the lcd pins, using analogs<br>LiquidCrystal lcd(A5, A4, A3, A2, A1, A0);<br>\/\/ DS18S20 Temperature chip i\/o<br>OneWire ds(9);&nbsp; \/\/ on dig pin 9<br>String tempPacHead = &#8220;taddr:&#8221;;<br>String ds18addr = &#8220;&#8221;;<br>String tempPacket = &#8220;&#8221;;<br>String tempStr = &#8220;:&#8221;;<br>char fahr[10];<br>\/\/ variables to control heater<br>int cfhPin = 8;&nbsp;&nbsp; &nbsp;\/\/ heater relay pin<br>int setpoint = 65;<br>boolean callforheat = false;<br>int thermoLead = 1;&nbsp; \/\/ how far above setpoint temp will go<br>int thermoLag = 1;&nbsp;&nbsp; &nbsp;\/\/how far below setpoint temp will go<br>int wsetpoint = 0;&nbsp; \/\/ working setpoint<br>unsigned long startTime;<br>unsigned long stopTime;<br>unsigned long CfhDuration;<br>unsigned long betweenCfhDuration;<br>unsigned long minCfhDuration = 60000;&nbsp; \/\/ 60 seconds<br>unsigned long minbetweenCfhDuration = 60000;&nbsp; \/\/ 60 seconds<br>\/\/ Enter a MAC address and IP address for ethernet<br>byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x75 };<br>IPAddress ip(192,168,0,75);<br>unsigned int Port_Remote = 5000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/ remote port<br>IPAddress IP_Remote(192, 168, 0, 10);&nbsp;&nbsp;&nbsp; \/\/ IP address for smarthome<br>unsigned int localPort = 5001;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/ local port to listen on<br>char cmdGetData = &#8216;1&#8217;;&nbsp;&nbsp; &nbsp; \/\/ a &#8220;1&#8221; means read all the data<br>char cmdGetSetPoint = &#8216;2&#8217;;<br>char cmdSetPoint = &#8216;3&#8217;;<br>char cmdStatusCheck = &#8216;9&#8217;;&nbsp;&nbsp; \/\/ a &#8220;9&#8221; means smarthome is asking for status<br>char cmdIn = &#8216;0&#8217;;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;\/\/ used to obtain and compare buffer character<br>char sp1;&nbsp;&nbsp; &nbsp;\/\/ used to extract new setpoint<br>char sp2; \/\/ used to extract new setpoint<br>String heatString1 = &#8220;ardoffheatdur=&#8221;;<br>String heatString2 = &#8220;0000&#8221;;<br>long heatOnDuration;<br>\/\/ can not use dig pins 2, 4, 10, 11, 12, 13<br>\/\/ An EthernetUDP instance to let us receive packets over UDP<br>EthernetUDP Udp;<br>char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; \/\/buffer to hold incoming packet,<\/p>\n\n\n\n<p>void setup(){<br>\/\/&nbsp;&nbsp; &nbsp;Serial.begin(9600);<br>\/\/ set up the LCD&#8217;s number of columns and rows:<br>lcd.begin(16, 2);<br>lcd.print(&#8220;hello, world!&#8221;);&nbsp; \/\/ just during startup<br>\/\/ set up ethernet, using udp<br>Ethernet.begin(mac,ip);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/ no need for gateway or mask<br>Udp.begin(localPort);<br>\/\/ set up heater relay pin<br>digitalWrite(cfhPin, LOW);<br>pinMode(cfhPin,OUTPUT);<br>startTime = millis();<br>stopTime = millis();<br>CfhDuration = millis();<br>betweenCfhDuration = millis();<br>attachInterrupt(0, setpointUp, FALLING);<br>attachInterrupt(1, setpointDn, FALLING);<br>}<br>\/\/end &#8220;setup()&#8221;<\/p>\n\n\n\n<p>void loop(){<br>\/\/ initialize variables<br>delay(5000);<br>byte i;<br>byte present = 0;<br>byte data[12];<br>byte addr[8];<br>float tFahr;<br>float cent;<br>String stringOne;<br>String tsetpoint;<\/p>\n\n\n\n<p>\/\/ start of temp sensor code<br>while (ds.search(addr))<br>{<br>ds18addr = &#8220;&#8221;;<br>for( i = 0; i &lt; 8; i++)<br>{<br>stringOne = String(addr[i], HEX);<br>if (stringOne.length() &lt; 2){stringOne = &#8220;0&#8221; + stringOne; }<br>stringOne.toUpperCase();<br>ds18addr = ds18addr + stringOne;<br>}<br>if ( OneWire::crc8( addr, 7) == addr[7])<br>{<br>ds.reset();<br>ds.select(addr);<br>ds.write(0x44,1);<br>delay(1000);<br>present = ds.reset();<br>ds.select(addr);<br>ds.write(0xBE);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/ Read Scratchpad<\/p>\n\n\n\n<p>for ( i = 0; i &lt; 9; i++) {data[i] = ds.read();}<\/p>\n\n\n\n<p>\/\/ calc temp value<br>cent = ( (data[1] &lt;&lt; 8) + data[0] )*0.0625;<br>tFahr = (cent * 9 \/ 5) + 32;<br>dtostrf(tFahr,4,1,fahr);<br>tempPacket = tempPacHead + ds18addr + tempStr + fahr;<br>}&nbsp; \/\/ end of crc ok branch<br>}&nbsp;&nbsp;&nbsp; \/\/ end of while loop and temp sensor code<\/p>\n\n\n\n<p>lcd.setCursor(0, 0);<br>lcd.print(&#8220;temp =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8220;);<br>lcd.setCursor(7, 0);<br>lcd.print(fahr);<\/p>\n\n\n\n<p>lcd.setCursor(0, 1);<br>lcd.print(&#8220;setpoint = &#8220;);<br>lcd.setCursor(11, 1);<br>lcd.print( setpoint );<br>\/\/ compare\/control operation of heater relay<br>\/\/ there are 3 factors used to make the decision<br>\/\/ setpoint vs temp, current status, timer expirations<br>\/\/ so 8 different possibilities<br>\/\/ first, adjust setpoint for lead\/lag<br>lcd.setCursor(14, 0);&nbsp; \/\/ set the lcd cursor<br>if (callforheat)<br>{ wsetpoint = setpoint + thermoLead;&nbsp;&nbsp; &nbsp;}<br>else { wsetpoint = setpoint &#8211; thermoLag;&nbsp;&nbsp; &nbsp;}<br>\/\/ second, set up timers<br>if (callforheat)<br>{ CfhDuration = millis()- startTime;&nbsp;&nbsp; &nbsp;}<br>else { betweenCfhDuration = millis()- stopTime;&nbsp;&nbsp; &nbsp;}<br>\/\/first handle 4 conditions if call for heat is off<br>if (!callforheat)<br>{<br>if ((wsetpoint &gt;= tFahr) &amp;&amp; (betweenCfhDuration &gt;= minbetweenCfhDuration))<br>{ digitalWrite(cfhPin, HIGH);<br>callforheat = TRUE;<br>lcd.print(&#8220;TN&#8221;);&nbsp; \/\/ Turn On cfh<br>startTime = millis();<br>Udp.beginPacket(IP_Remote, Port_Remote);<br>Udp.write(&#8220;ardoffheatrun=yes&#8221;);&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;\/\/ now send packet to reset trigger<br>Udp.endPacket();<br>}<br>else if ((wsetpoint &lt; tFahr) &amp;&amp; (betweenCfhDuration &gt;= minbetweenCfhDuration))<br>{<br>lcd.print(&#8220;LF&#8221;);&nbsp; \/\/ Leave Off, timer inactive<br>}<br>else if ((wsetpoint &gt;= tFahr) &amp;&amp; (betweenCfhDuration &lt; minbetweenCfhDuration))<br>{<br>lcd.print(&#8220;FN&#8221;);&nbsp; \/\/ Leave off for now<br>}<br>else if((wsetpoint &lt; tFahr) &amp;&amp; (betweenCfhDuration &lt; minbetweenCfhDuration))<br>{<br>lcd.print(&#8220;Lf&#8221;);&nbsp; \/\/ Leave off and timer still active<br>}<br>else {<br>lcd.print(&#8220;E1&#8221;);&nbsp; \/\/ error, should never get to here<br>}<br>}<br>\/\/now handle 4 conditions if call for heat is on<br>if (callforheat)<br>{<br>if ((wsetpoint &gt;= tFahr) &amp;&amp; (CfhDuration &gt;= minCfhDuration))<br>{<br>lcd.print(&#8220;LN&#8221;);&nbsp; \/\/ Leave on, timer inactive<br>}<br>else if ((wsetpoint &lt; tFahr) &amp;&amp; (CfhDuration &gt;= minCfhDuration))<br>{ digitalWrite(cfhPin, LOW);<br>callforheat = FALSE;<br>lcd.print(&#8220;TF&#8221;);&nbsp; \/\/ Turn Off<br>stopTime = millis();<br>heatOnDuration = (millis() &#8211; startTime)\/1000;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;\/\/calc dur of run<br>heatString2 = heatString1 + heatOnDuration;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;\/\/ build string<br>Udp.beginPacket(IP_Remote, Port_Remote);<br>Udp.print(heatString2);&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;\/\/ send packet with dur<br>Udp.endPacket();<br>delay(1000);<br>Udp.beginPacket(IP_Remote, Port_Remote);<br>Udp.write(&#8220;ardoffheatrun=no&#8221;);&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;\/\/ now send packet with trigger<br>Udp.endPacket();<br>}<br>else if ((wsetpoint &gt;= tFahr) &amp;&amp; (CfhDuration &lt; minCfhDuration))<br>{<br>lcd.print(&#8220;Ln&#8221;);&nbsp; \/\/ Leave on and timer still active<br>}<br>else if((wsetpoint &lt; tFahr) &amp;&amp; (CfhDuration &lt; minCfhDuration))<br>{<br>lcd.print(&#8220;NN&#8221;);&nbsp; \/\/ Leave on for now<br>}<br>else {<br>lcd.print(&#8220;E2&#8221;);&nbsp; \/\/ error, should never get to here<br>}<br>}<br>\/\/ end of compare\/control section<br>\/\/ listen for incoming packets<br>int packetSize = Udp.parsePacket();<br>if(packetSize)<br>{<br>Udp.read(packetBuffer,3);<br>cmdIn = (packetBuffer[0]);<br>\/\/ respond to current temp request<br>if (cmdIn == cmdGetData)<br>{<br>Udp.beginPacket(IP_Remote, Port_Remote);<br>Udp.print(tempPacket);<br>Udp.endPacket();<br>} \/\/ end of cmdGetData<br>\/\/ respond to inquiry of current setpoint<br>if (cmdIn == cmdGetSetPoint)<br>{<br>tsetpoint = String(setpoint);<br>tempPacket = &#8220;ard75setp=&#8221; + tsetpoint;<br>Udp.beginPacket(IP_Remote, Port_Remote);<br>Udp.print(tempPacket);<br>Udp.endPacket();<br>} \/\/ end of cmdGetSetPoint<br>\/\/ handle set setpoint request<br>if (cmdIn == cmdSetPoint)<br>{<br>sp1 = (packetBuffer[1]);&nbsp; \/\/ retrieve 2 digits<br>sp2 = (packetBuffer[2]);&nbsp; \/\/ of new setpoint<br>int tsp1 = sp1 &#8211; &#8216;0&#8217;;&nbsp; \/\/ convert char to int<br>int tsp2 = sp2 &#8211; &#8216;0&#8217;;&nbsp; \/\/ convert char to int<br>setpoint = (tsp1*10) + tsp2;<br>} \/\/ end of cmdSetPoint<br>\/\/ respond to status check<br>if (cmdIn == cmdStatusCheck)<br>{<br>Udp.beginPacket(IP_Remote, Port_Remote);<br>Udp.write(&#8220;ard75ok=yes&#8221;);&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;\/\/ send packet good status<br>Udp.endPacket();<br>}&nbsp; \/\/ end of status check<br>} \/\/ end of if packetsize<br>} \/\/ end loop()<br>\/\/ subrouting to handle int 0, pin 3, setpointUp<br>void setpointUp()<br>{<br>setpoint = setpoint + 1;<br>lcd.setCursor(11, 1);<br>lcd.print( setpoint );<br>}<br>\/\/ subrouting to handle int 1, pin 2, setpointDn<br>void setpointDn()<br>{<br>setpoint = setpoint &#8211; 1;<br>lcd.setCursor(11, 1);<br>lcd.print( setpoint );<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This sketch is a thermostat for a small gas heater in a garage.&nbsp; It has an LCD display for current temperature, set point and status.&nbsp; It has two push buttons to lower and raise the set point, and HCA can also change the set point via the network.&nbsp; This thermostat reports when it comes on, &hellip; <a href=\"https:\/\/sundrysites.com\/index.php\/home-info\/arduino-projects\/sketches\/thermostat-sketch\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Thermostat Sketch<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":370,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-382","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Thermostat Sketch - Sundrysites<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/sundrysites.com\/index.php\/home-info\/arduino-projects\/sketches\/thermostat-sketch\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Thermostat Sketch - Sundrysites\" \/>\n<meta property=\"og:description\" content=\"This sketch is a thermostat for a small gas heater in a garage.&nbsp; It has an LCD display for current temperature, set point and status.&nbsp; It has two push buttons to lower and raise the set point, and HCA can also change the set point via the network.&nbsp; This thermostat reports when it comes on, &hellip; Continue reading Thermostat Sketch &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/sundrysites.com\/index.php\/home-info\/arduino-projects\/sketches\/thermostat-sketch\/\" \/>\n<meta property=\"og:site_name\" content=\"Sundrysites\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/sundrysites.com\\\/index.php\\\/home-info\\\/arduino-projects\\\/sketches\\\/thermostat-sketch\\\/\",\"url\":\"https:\\\/\\\/sundrysites.com\\\/index.php\\\/home-info\\\/arduino-projects\\\/sketches\\\/thermostat-sketch\\\/\",\"name\":\"Thermostat Sketch - Sundrysites\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sundrysites.com\\\/#website\"},\"datePublished\":\"2020-03-31T01:26:08+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/sundrysites.com\\\/index.php\\\/home-info\\\/arduino-projects\\\/sketches\\\/thermostat-sketch\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/sundrysites.com\\\/index.php\\\/home-info\\\/arduino-projects\\\/sketches\\\/thermostat-sketch\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/sundrysites.com\\\/index.php\\\/home-info\\\/arduino-projects\\\/sketches\\\/thermostat-sketch\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/sundrysites.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Home Info\",\"item\":\"https:\\\/\\\/sundrysites.com\\\/index.php\\\/home-info\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Arduino Projects\",\"item\":\"https:\\\/\\\/sundrysites.com\\\/index.php\\\/home-info\\\/arduino-projects\\\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Sketches\",\"item\":\"https:\\\/\\\/sundrysites.com\\\/index.php\\\/home-info\\\/arduino-projects\\\/sketches\\\/\"},{\"@type\":\"ListItem\",\"position\":5,\"name\":\"Thermostat Sketch\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/sundrysites.com\\\/#website\",\"url\":\"https:\\\/\\\/sundrysites.com\\\/\",\"name\":\"Sundrysites\",\"description\":\"As In Various and Sundry\",\"publisher\":{\"@id\":\"https:\\\/\\\/sundrysites.com\\\/#\\\/schema\\\/person\\\/1e11ce6af1587a3431e57dfc0797ab61\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/sundrysites.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/sundrysites.com\\\/#\\\/schema\\\/person\\\/1e11ce6af1587a3431e57dfc0797ab61\",\"name\":\"Wayne Gulden\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c0392cdfb7826ed5407aad362998bc6dd03fe293560ce15ccc2211357e3cec6e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c0392cdfb7826ed5407aad362998bc6dd03fe293560ce15ccc2211357e3cec6e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c0392cdfb7826ed5407aad362998bc6dd03fe293560ce15ccc2211357e3cec6e?s=96&d=mm&r=g\",\"caption\":\"Wayne Gulden\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c0392cdfb7826ed5407aad362998bc6dd03fe293560ce15ccc2211357e3cec6e?s=96&d=mm&r=g\"},\"sameAs\":[\"https:\\\/\\\/sundrysites.com\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Thermostat Sketch - Sundrysites","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/sundrysites.com\/index.php\/home-info\/arduino-projects\/sketches\/thermostat-sketch\/","og_locale":"en_US","og_type":"article","og_title":"Thermostat Sketch - Sundrysites","og_description":"This sketch is a thermostat for a small gas heater in a garage.&nbsp; It has an LCD display for current temperature, set point and status.&nbsp; It has two push buttons to lower and raise the set point, and HCA can also change the set point via the network.&nbsp; This thermostat reports when it comes on, &hellip; Continue reading Thermostat Sketch &rarr;","og_url":"https:\/\/sundrysites.com\/index.php\/home-info\/arduino-projects\/sketches\/thermostat-sketch\/","og_site_name":"Sundrysites","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/sundrysites.com\/index.php\/home-info\/arduino-projects\/sketches\/thermostat-sketch\/","url":"https:\/\/sundrysites.com\/index.php\/home-info\/arduino-projects\/sketches\/thermostat-sketch\/","name":"Thermostat Sketch - Sundrysites","isPartOf":{"@id":"https:\/\/sundrysites.com\/#website"},"datePublished":"2020-03-31T01:26:08+00:00","breadcrumb":{"@id":"https:\/\/sundrysites.com\/index.php\/home-info\/arduino-projects\/sketches\/thermostat-sketch\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/sundrysites.com\/index.php\/home-info\/arduino-projects\/sketches\/thermostat-sketch\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/sundrysites.com\/index.php\/home-info\/arduino-projects\/sketches\/thermostat-sketch\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/sundrysites.com\/"},{"@type":"ListItem","position":2,"name":"Home Info","item":"https:\/\/sundrysites.com\/index.php\/home-info\/"},{"@type":"ListItem","position":3,"name":"Arduino Projects","item":"https:\/\/sundrysites.com\/index.php\/home-info\/arduino-projects\/"},{"@type":"ListItem","position":4,"name":"Sketches","item":"https:\/\/sundrysites.com\/index.php\/home-info\/arduino-projects\/sketches\/"},{"@type":"ListItem","position":5,"name":"Thermostat Sketch"}]},{"@type":"WebSite","@id":"https:\/\/sundrysites.com\/#website","url":"https:\/\/sundrysites.com\/","name":"Sundrysites","description":"As In Various and Sundry","publisher":{"@id":"https:\/\/sundrysites.com\/#\/schema\/person\/1e11ce6af1587a3431e57dfc0797ab61"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/sundrysites.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/sundrysites.com\/#\/schema\/person\/1e11ce6af1587a3431e57dfc0797ab61","name":"Wayne Gulden","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/c0392cdfb7826ed5407aad362998bc6dd03fe293560ce15ccc2211357e3cec6e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c0392cdfb7826ed5407aad362998bc6dd03fe293560ce15ccc2211357e3cec6e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c0392cdfb7826ed5407aad362998bc6dd03fe293560ce15ccc2211357e3cec6e?s=96&d=mm&r=g","caption":"Wayne Gulden"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/c0392cdfb7826ed5407aad362998bc6dd03fe293560ce15ccc2211357e3cec6e?s=96&d=mm&r=g"},"sameAs":["https:\/\/sundrysites.com"]}]}},"_links":{"self":[{"href":"https:\/\/sundrysites.com\/index.php\/wp-json\/wp\/v2\/pages\/382","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sundrysites.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/sundrysites.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/sundrysites.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sundrysites.com\/index.php\/wp-json\/wp\/v2\/comments?post=382"}],"version-history":[{"count":1,"href":"https:\/\/sundrysites.com\/index.php\/wp-json\/wp\/v2\/pages\/382\/revisions"}],"predecessor-version":[{"id":383,"href":"https:\/\/sundrysites.com\/index.php\/wp-json\/wp\/v2\/pages\/382\/revisions\/383"}],"up":[{"embeddable":true,"href":"https:\/\/sundrysites.com\/index.php\/wp-json\/wp\/v2\/pages\/370"}],"wp:attachment":[{"href":"https:\/\/sundrysites.com\/index.php\/wp-json\/wp\/v2\/media?parent=382"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}