Ramp-thermostat operational questions and clarification

Installed the node-red-contrib-ramp-thermostat and programmed it several weeks ago. I have several text boxes on the outputs to monitor what the outputs are actually doing. In watching these over the course of several days I have noticed what I would consider some anomalies that appear to be proper functioning which leads me to believe I don't understand what normal should be. I have the hysteresis plus and minus set to 1 and a trial program that goes to 25 for an hour then down to 10 for an hour and repeats. I would expect the target temp to be 25 when in fact it shows as 22.79, then it will go to 22.67 and during the hour it seems to vary and although moving a few tenths isn't a big deal I would expect the target to stay steady and I would also assume that the target would read 25 even though the heater would run until the temp reaches 26 then cycle off until the temp goes down to 24 then cycle back up to 26 and so on. One other thing I noticed is that the times seem to vary by an hour sometimes. At first I thought there must be some kind of time zone setting I missed but after carefully going through the settings I didn't find one. What am I missing in this and is there an explanation? Additionally when watching the node in the editor window the status text will read "profile set to YoProfile" but every little bit the text changes and then changes back so fast I can't read what it says. Is that normal and what is it trying to tell me?
Thanks

Can you show us how you have configured the node please?
In fact if you export just enough of the flow to show the problem that would be useful. See this post for how to share a flow.

here ya go, there's more to the flow but I think these are the pieces you will need

[{"id":"42211210.5ad674","type":"ramp-thermostat","z":"b2f6ae2d.6314f","name":"Once","profile":"7db8afc9.a611d8","hysteresisplus":"1","hysteresisminus":"1","x":550,"y":320,"wires":[["10a79284.123e8d"],["70eef358.8c03a4"],["dd6924f8.102828"]]},{"id":"10a79284.123e8d","type":"function","z":"b2f6ae2d.6314f","name":"Convert True to 1","func":"let a = flow.get('program');\nlet b = flow.get('row');\nif (b !== 0){\n    msg.label = \"Programming\";\n    msg.color = \"White\";\n    msg.background = \"Green\";\n    node.status({fill:\"blue\",shape:\"dot\",text:\"Row \" + b});\n    return msg;\n}\n\nlet z = msg.payload;\n\nif (z === true){\n    msg.payload = 1;\n    msg.label = \"Heater Is On\";\n    msg.color = \"White\";\n    msg.background = \"Red\";\n} else {\n    msg.payload = 0;\n    msg.label = \"Heater Is Off\";\n    msg.color = \"Black\";\n    msg.background = \"paleblue\";\n}\n\n\nnode.status({fill:\"blue\",shape:\"dot\",text:\"Payload \" + msg.payload});\n\nreturn msg;","outputs":1,"noerr":0,"x":750,"y":320,"wires":[[]]},{"id":"70eef358.8c03a4","type":"function","z":"b2f6ae2d.6314f","name":"Current Temperature","func":"let z = msg.payload;\n\nnode.status({fill:\"blue\",shape:\"dot\",text:\"Current Temperature \" + msg.payload});\n\nreturn msg;","outputs":1,"noerr":0,"x":760,"y":380,"wires":[[]]},{"id":"dd6924f8.102828","type":"function","z":"b2f6ae2d.6314f","name":"Target Temperature","func":"let z = msg.payload;\n\nmsg.label = \"Target Temperature \" + z;\nmsg.color = \"White\";\nmsg.background = \"Teal\";\nflow.set('target_temp', z);\n\nnode.status({fill:\"blue\",shape:\"dot\",text:\"Target Temperaute \" + msg.payload});\n\nreturn msg;","outputs":1,"noerr":0,"x":700,"y":440,"wires":[[]]},{"id":"5ce9a116.38f5d8","type":"function","z":"b2f6ae2d.6314f","name":"set_target","func":"let z = flow.get('RunProgram');\n\nif (z === true){\n    node.status({fill:\"blue\",shape:\"dot\",text:\"Running Program \"});\n    return null;\n}\n\n\nlet w = flow.get('manual_temp');\n\nw = Number(w);\n\nmsg = {\n    payload: w,\n    topic: 'setTarget',\n}\n\n\nnode.status({fill:\"blue\",shape:\"dot\",text:\"Set Target \" + msg.payload});\n\n\nreturn msg;","outputs":1,"noerr":0,"x":350,"y":320,"wires":[["42211210.5ad674"]]},{"id":"9c3a9ae4.9fd19","type":"function","z":"b2f6ae2d.6314f","name":"Set Current","func":"let w = msg.payload;\n\nw = Number(w);\n\nmsg = {\n    payload: w,\n    topic: 'setCurrent',\n    }\nnode.status({fill:\"blue\",shape:\"dot\",text:\"Set Current \" + msg.payload});\n\nreturn msg;","outputs":1,"noerr":0,"x":350,"y":400,"wires":[["42211210.5ad674"]]},{"id":"ca6bc05b.83ee3","type":"function","z":"b2f6ae2d.6314f","name":"H Minus","func":"msg = {\n    payload: '1',\n    topic:'setHysteresisMinus'\n}\n\nnode.status({fill:\"blue\",shape:\"dot\",text:\"Hysteresis Minus \" + msg.payload});\n\nreturn msg;","outputs":1,"noerr":0,"x":360,"y":480,"wires":[["42211210.5ad674"]]},{"id":"4985888d.3162","type":"function","z":"b2f6ae2d.6314f","name":"H Plus","func":"msg = {\n    payload: '1',\n    topic:'setHysteresisPlus'\n}\n\nnode.status({fill:\"blue\",shape:\"dot\",text:\"Hysteresis Plus \" + msg.payload});\n\nreturn msg;","outputs":1,"noerr":0,"x":350,"y":540,"wires":[["42211210.5ad674"]]},{"id":"5537bcf6.b721ec","type":"inject","z":"b2f6ae2d.6314f","name":"Once at 4","topic":"Once at 4","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"onceDelay":"4","x":130,"y":540,"wires":[["4985888d.3162"]]},{"id":"e07e5500.6d3118","type":"inject","z":"b2f6ae2d.6314f","name":"Once at 3","topic":"Once at 3","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"onceDelay":"3","x":130,"y":480,"wires":[["ca6bc05b.83ee3"]]},{"id":"28cd15ed.4fd96a","type":"function","z":"b2f6ae2d.6314f","name":"set profile","func":"let row = flow.get('row');\nlet update = flow.get('update');\n\n\nlet y = flow.get('minute');\nif (y < 10){\n    y = \"0\" + y;\n}\n\n\nlet x = flow.get('hour');\nlet temperature = flow.get('temperature');\n\nvar time1 = {}\nvar time2 = {}\nvar time3 = {}\nvar time4 = {}\nvar time5 = {}\nvar time6 = {}\nvar time7 = {}\nvar time8 = {}\ntime1.hr = 0;\ntime1.min = 0;\ntime1.temp = flow.get('time1.temp');\ntime2.hr = flow.get('time2.hr');\ntime2.min = flow.get('time2.min');\ntime2.temp = flow.get('time2.temp');\ntime3.hr = flow.get('time3.hr');\ntime3.min = flow.get('time3.min');\ntime3.temp = flow.get('time3.temp');\ntime4.hr = flow.get('time4.hr');\ntime4.min = flow.get('time4.min');\ntime4.temp = flow.get('time4.temp');\ntime5.hr = flow.get('time5.hr');\ntime5.min = flow.get('time5.min');\ntime5.temp = flow.get('time5.temp');\ntime6.hr = flow.get('time6.hr');\ntime6.min = flow.get('time6.min');\ntime6.temp = flow.get('time6.temp');\ntime7.hr = flow.get('time7.hr');\ntime7.min = flow.get('time7.min');\ntime7.temp = flow.get('time7.temp');\ntime8.hr = 23;\ntime8.min = 59;\ntime8.temp = flow.get('time8.temp');\npoint1 = {};\npoint2 = {};\npoint3 = {};\npoint4 = {};\npoint5 = {};\npoint6 = {};\npoint7 = {};\npoint8 = {};\npoint1[`${time1.hr}:${time1.min}`] = time1.temp\npoint2[`${time2.hr}:${time2.min}`] = time2.temp\npoint3[`${time3.hr}:${time3.min}`] = time3.temp\npoint4[`${time4.hr}:${time4.min}`] = time4.temp\npoint5[`${time5.hr}:${time5.min}`] = time5.temp\npoint6[`${time6.hr}:${time6.min}`] = time6.temp\npoint7[`${time7.hr}:${time7.min}`] = time7.temp\npoint8[`${time8.hr}:${time8.min}`] = time8.temp\n\nmsg.topic = \"setProfile\"\nmsg.payload = { \"name\":\"YoProfile\", points: [ ]  }\nmsg.payload.points.push(point1)\nmsg.payload.points.push(point2)\nmsg.payload.points.push(point3)\nmsg.payload.points.push(point4)\nmsg.payload.points.push(point5)\nmsg.payload.points.push(point6)\nmsg.payload.points.push(point7)\nmsg.payload.points.push(point8)\n\n\nif (time1.min < 10){\n   time1.min = \"0\" + time1.min\n   let str = time1.min;\n   if (str.length == 3){\n       str = str.slice(1,3);\n       time1.min = str;\n   }\n}\n\nif (time2.min < 10){\n   time2.min = \"0\" + time2.min\n   let str = time2.min;\n   if (str.length == 3){\n       str = str.slice(1,3);\n       time2.min = str;\n   }\n}\nif (time3.min < 10){\n   time3.min = \"0\" + time3.min\n   let str = time3.min;\n   if (str.length == 3){\n       str = str.slice(1,3);\n       time3.min = str;\n   }\n}\nif (time4.min < 10){\n   time4.min = \"0\" + time4.min\n   let str = time4.min;\n   if (str.length == 3){\n       str = str.slice(1,3);\n       time4.min = str;\n   }\n}\nif (time5.min < 10){\n   time5.min = \"0\" + time5.min\n   let str = time5.min;\n   if (str.length == 3){\n       str = str.slice(1,3);\n       time5.min = str;\n   }\n}\nif (time6.min < 10){\n   time6.min = \"0\" + time6.min\n   let str = time6.min;\n   if (str.length == 3){\n       str = str.slice(1,3);\n       time6.min = str;\n   }\n}\nif (time7.min < 10){\n   time7.min = \"0\" + time7.min\n   let str = time7.min;\n   if (str.length == 3){\n       str = str.slice(1,3);\n       time7.min = str;\n   }\n}\nif (time8.min < 10){\n   time8.min = \"0\" + time8.min\n   let str = time8.min;\n   if (str.length == 3){\n       str = str.slice(1,3);\n       time8.min = str;\n   }\n}\n\n//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\nlet program = flow.get('program');\nif (program === true){\n    row = 0;\n}\n\nif (row == 1){\n    time1.row = true;\n}\nif (row == 2){\n    time2.row = true;\n} \nif (row == 3){\n    time3.row = true;\n}\nif (row == 4){\n    time4.row = true;\n} \nif (row == 5){\n    time5.row = true;\n}\nif (row == 6){\n    time6.row = true;\n} \nif (row == 7){\n    time7.row = true;\n}\nif (row == 8){\n    time8.row = true;\n} \n\nmsgc = {\n    payload:[\n       {\"timehr\": time1.hr,\n       \"timemin\": time1.min,\n       \"temp\": time1.temp,\n       \"row\": time1.row},\n       {\"timehr\": time2.hr,\n       \"timemin\": time2.min,\n       \"temp\": time2.temp,\n       \"row\": time2.row},\n       {\"timehr\": time3.hr,\n       \"timemin\": time3.min,\n       \"temp\": time3.temp,\n       \"row\": time3.row},\n       {\"timehr\": time4.hr,\n       \"timemin\": time4.min,\n       \"temp\": time4.temp,\n       \"row\": time4.row},\n       {\"timehr\": time5.hr,\n       \"timemin\": time5.min,\n       \"temp\": time5.temp,\n       \"row\": time5.row},\n       {\"timehr\": time6.hr,\n       \"timemin\": time6.min,\n       \"temp\": time6.temp,\n       \"row\": time6.row},\n       {\"timehr\": time7.hr,\n       \"timemin\": time7.min,\n       \"temp\": time7.temp,\n        \"row\": time7.row},\n       {\"timehr\": time8.hr,\n       \"timemin\": time8.min,\n       \"temp\": time8.temp,\n        \"row\": time8.row},\n       ]\n}\n\n\n\nnode.status({fill:\"blue\",shape:\"dot\",text:temperature });\n\nreturn [msg, msgc];","outputs":2,"noerr":0,"x":340,"y":180,"wires":[["42211210.5ad674"],["5028164.3fd68e8"]]},{"id":"5028164.3fd68e8","type":"ui_table","z":"b2f6ae2d.6314f","group":"1e799288.43fbf5","name":"in process","order":10,"width":6,"height":5,"columns":[{"field":"timehr","title":"Hour","width":"25%","align":"center","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"timemin","title":"Minute","width":"25%","align":"center","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"temp","title":"temp","width":"30%","align":"center","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"row","title":"Adj","width":"20%","align":"center","formatter":"tickCross","formatterParams":{"target":"_blank"}}],"outputs":1,"cts":true,"x":570,"y":180,"wires":[["d57bb00a.7b6db"]]},{"id":"d57bb00a.7b6db","type":"function","z":"b2f6ae2d.6314f","name":"click to set","func":"let z = msg.payload.timehr;\nlet y = msg.payload.timemin;\nlet x = msg.payload.temp;\nlet w = msg.row;\nlet v = flow.get(\"RunProgram\");\n\nif (v === false){\n    return null;\n}\n\nw = w + 1;\nlet a = flow.get('program');\nif (a === false){\n    row = 0;\n    w = 0;\n    node.status({fill:\"blue\",shape:\"dot\",text:\"Program \" + a});\n    return null;\n}\n\nflow.set('hour',z);\nflow.set('minute',y);\nflow.set('set_temp',x);\n\nflow.set('time'+w+\".hr\",z);\nflow.set('time'+w+\".min\",y);\nflow.set('time'+w+\".temp\",x);\nflow.set('row',w);\n\nmsg = {\n    payload: w,\n    row: w,\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":790,"y":180,"wires":[["28cd15ed.4fd96a"]]},{"id":"74ccf12b.736b28","type":"comment","z":"b2f6ae2d.6314f","name":"explain","info":"the input of the set profile node runs to a button that triggers the node to put profile to thermostat node\n\nset target node runs to a numeric input that sets the node to manual mode and a temperature\n\nset current node runs to the temperature sensor attached to the pi\n\ninitialize serves to set the profile on the first power up, you must manually push the inject node to set the profile. Afterwards I adjust all the parameters manually","x":230,"y":260,"wires":[]},{"id":"d053d036.a67b1","type":"function","z":"b2f6ae2d.6314f","name":"initialize","func":"flow.set(\"time1.hr\",0);\nflow.set(\"time1.min\",0);\nflow.set(\"time1.temp\",18);\nflow.set(\"time2.hr\",5);\nflow.set(\"time2.min\",15);\nflow.set(\"time2.temp\",18);\nflow.set(\"time3.hr\",8);\nflow.set(\"time3.min\",30);\nflow.set(\"time3.temp\",22);\nflow.set(\"time4.hr\",11);\nflow.set(\"time4.min\",45);\nflow.set(\"time4.temp\",22);\nflow.set(\"time5.hr\",14);\nflow.set(\"time5.min\",0);\nflow.set(\"time5.temp\",22);\nflow.set(\"time6.hr\",16);\nflow.set(\"time6.min\",30);\nflow.set(\"time6.temp\",22);\nflow.set(\"time7.hr\",18);\nflow.set(\"time7.min\",40);\nflow.set(\"time7.temp\",22);\nflow.set(\"time8.hr\",18);\nflow.set(\"time8.min\",59);\nflow.set(\"time8.temp\",18);\n\nflow.set(\"set_temp\",10);\n\nflow.set('manual_temp',11);\nflow.set('row',0);\n\nnode.status({fill:\"blue\",shape:\"dot\",text:\"initialized\"});\n\nreturn msg;","outputs":1,"noerr":0,"x":420,"y":100,"wires":[["28cd15ed.4fd96a"]]},{"id":"5aefca33.8e729c","type":"inject","z":"b2f6ae2d.6314f","name":"","topic":"","payload":"1","payloadType":"num","repeat":"","crontab":"","once":false,"onceDelay":"3","x":250,"y":100,"wires":[["d053d036.a67b1"]]},{"id":"7db8afc9.a611d8","type":"profile","z":"","name":"Once","time1":"00:00","temp1":"20","time2":"23:59","temp2":"20","time3":"","temp3":"","time4":"","temp4":"","time5":"","temp5":"","time6":"","temp6":"","time7":"","temp7":"","time8":"","temp8":"","time9":"","temp9":"","time10":"","temp10":""},{"id":"1e799288.43fbf5","type":"ui_group","z":"","name":"Table","tab":"2c4d95d6.83b042","order":2,"disp":false,"width":6,"collapse":false},{"id":"2c4d95d6.83b042","type":"ui_tab","z":"","name":"Thermostat","icon":"fa-thermometer","order":1,"disabled":false,"hidden":false}]

Can you make an example with just inject nodes (and change or whatever) and the thermostat node so we don't need to enter any data?

once more into the breach

[{"id":"2e0b4452.8dfd4c","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"a53a8f4.b56b87","type":"ramp-thermostat","z":"2e0b4452.8dfd4c","name":"Once","profile":"1f284451.4cfe44","hysteresisplus":"1","hysteresisminus":"1","x":670,"y":360,"wires":[["8a3d169b.f9496"],["182f0119.5dc4e7"],["54bee0f8.268228"]]},{"id":"8a3d169b.f9496","type":"function","z":"2e0b4452.8dfd4c","name":"Convert True to 1","func":"let a = flow.get('program');\nlet b = flow.get('row');\nif (b !== 0){\n    msg.label = \"Programming\";\n    msg.color = \"White\";\n    msg.background = \"Green\";\n    node.status({fill:\"blue\",shape:\"dot\",text:\"Row \" + b});\n    return msg;\n}\n\nlet z = msg.payload;\n\nif (z === true){\n    msg.payload = 1;\n    msg.label = \"Heater Is On\";\n    msg.color = \"White\";\n    msg.background = \"Red\";\n} else {\n    msg.payload = 0;\n    msg.label = \"Heater Is Off\";\n    msg.color = \"Black\";\n    msg.background = \"paleblue\";\n}\n\n\nnode.status({fill:\"blue\",shape:\"dot\",text:\"Payload \" + msg.payload});\n\nreturn msg;","outputs":1,"noerr":0,"x":870,"y":360,"wires":[[]]},{"id":"182f0119.5dc4e7","type":"function","z":"2e0b4452.8dfd4c","name":"Current Temperature","func":"let z = msg.payload;\n\nnode.status({fill:\"blue\",shape:\"dot\",text:\"Current Temperature \" + msg.payload});\n\nreturn msg;","outputs":1,"noerr":0,"x":880,"y":420,"wires":[[]]},{"id":"54bee0f8.268228","type":"function","z":"2e0b4452.8dfd4c","name":"Target Temperature","func":"let z = msg.payload;\n\nmsg.label = \"Target Temperature \" + z;\nmsg.color = \"White\";\nmsg.background = \"Teal\";\nflow.set('target_temp', z);\n\nnode.status({fill:\"blue\",shape:\"dot\",text:\"Target Temperaute \" + msg.payload});\n\nreturn msg;","outputs":1,"noerr":0,"x":820,"y":480,"wires":[[]]},{"id":"c9d6e0d7.3d8f28","type":"function","z":"2e0b4452.8dfd4c","name":"set_target","func":"let z = flow.get('RunProgram');\n\nif (z === true){\n    node.status({fill:\"blue\",shape:\"dot\",text:\"Running Program \"});\n    return null;\n}\n\n\nlet w = flow.get('manual_temp');\n\nw = Number(w);\n\nmsg = {\n    payload: 23,\n    topic: 'setTarget',\n}\n\n\nnode.status({fill:\"blue\",shape:\"dot\",text:\"Set Target \" + msg.payload});\n\n\nreturn msg;","outputs":1,"noerr":0,"x":470,"y":360,"wires":[["a53a8f4.b56b87"]]},{"id":"7d4a984.924f468","type":"function","z":"2e0b4452.8dfd4c","name":"Set Current","func":"let w = msg.payload;\n\nw = Number(w);\n\nmsg = {\n    payload: 22,\n    topic: 'setCurrent',\n    }\nnode.status({fill:\"blue\",shape:\"dot\",text:\"Set Current \" + msg.payload});\n\nreturn msg;","outputs":1,"noerr":0,"x":470,"y":440,"wires":[["a53a8f4.b56b87"]]},{"id":"e390c1b8.9031a","type":"function","z":"2e0b4452.8dfd4c","name":"H Minus","func":"msg = {\n    payload: '1',\n    topic:'setHysteresisMinus'\n}\n\nnode.status({fill:\"blue\",shape:\"dot\",text:\"Hysteresis Minus \" + msg.payload});\n\nreturn msg;","outputs":1,"noerr":0,"x":480,"y":520,"wires":[["a53a8f4.b56b87"]]},{"id":"1d8bcea6.c308c1","type":"function","z":"2e0b4452.8dfd4c","name":"H Plus","func":"msg = {\n    payload: '1',\n    topic:'setHysteresisPlus'\n}\n\nnode.status({fill:\"blue\",shape:\"dot\",text:\"Hysteresis Plus \" + msg.payload});\n\nreturn msg;","outputs":1,"noerr":0,"x":470,"y":580,"wires":[["a53a8f4.b56b87"]]},{"id":"1723e1fa.b21f5e","type":"inject","z":"2e0b4452.8dfd4c","name":"Once at 4","topic":"Once at 4","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"onceDelay":"4","x":250,"y":580,"wires":[["1d8bcea6.c308c1"]]},{"id":"2ef681d1.20fb5e","type":"inject","z":"2e0b4452.8dfd4c","name":"Once at 3","topic":"Once at 3","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"onceDelay":"3","x":250,"y":520,"wires":[["e390c1b8.9031a"]]},{"id":"13fa468e.74c309","type":"function","z":"2e0b4452.8dfd4c","name":"set profile","func":"let row = flow.get('row');\nlet update = flow.get('update');\n\n\nlet y = flow.get('minute');\nif (y < 10){\n    y = \"0\" + y;\n}\n\n\nlet x = flow.get('hour');\nlet temperature = flow.get('temperature');\n\nvar time1 = {}\nvar time2 = {}\nvar time3 = {}\nvar time4 = {}\nvar time5 = {}\nvar time6 = {}\nvar time7 = {}\nvar time8 = {}\ntime1.hr = 0;\ntime1.min = 0;\ntime1.temp = flow.get('time1.temp');\ntime2.hr = flow.get('time2.hr');\ntime2.min = flow.get('time2.min');\ntime2.temp = flow.get('time2.temp');\ntime3.hr = flow.get('time3.hr');\ntime3.min = flow.get('time3.min');\ntime3.temp = flow.get('time3.temp');\ntime4.hr = flow.get('time4.hr');\ntime4.min = flow.get('time4.min');\ntime4.temp = flow.get('time4.temp');\ntime5.hr = flow.get('time5.hr');\ntime5.min = flow.get('time5.min');\ntime5.temp = flow.get('time5.temp');\ntime6.hr = flow.get('time6.hr');\ntime6.min = flow.get('time6.min');\ntime6.temp = flow.get('time6.temp');\ntime7.hr = flow.get('time7.hr');\ntime7.min = flow.get('time7.min');\ntime7.temp = flow.get('time7.temp');\ntime8.hr = 23;\ntime8.min = 59;\ntime8.temp = flow.get('time8.temp');\npoint1 = {};\npoint2 = {};\npoint3 = {};\npoint4 = {};\npoint5 = {};\npoint6 = {};\npoint7 = {};\npoint8 = {};\npoint1[`${time1.hr}:${time1.min}`] = time1.temp\npoint2[`${time2.hr}:${time2.min}`] = time2.temp\npoint3[`${time3.hr}:${time3.min}`] = time3.temp\npoint4[`${time4.hr}:${time4.min}`] = time4.temp\npoint5[`${time5.hr}:${time5.min}`] = time5.temp\npoint6[`${time6.hr}:${time6.min}`] = time6.temp\npoint7[`${time7.hr}:${time7.min}`] = time7.temp\npoint8[`${time8.hr}:${time8.min}`] = time8.temp\n\nmsg.topic = \"setProfile\"\nmsg.payload = { \"name\":\"YoProfile\", points: [ ]  }\nmsg.payload.points.push(point1)\nmsg.payload.points.push(point2)\nmsg.payload.points.push(point3)\nmsg.payload.points.push(point4)\nmsg.payload.points.push(point5)\nmsg.payload.points.push(point6)\nmsg.payload.points.push(point7)\nmsg.payload.points.push(point8)\n\n\nif (time1.min < 10){\n   time1.min = \"0\" + time1.min\n   let str = time1.min;\n   if (str.length == 3){\n       str = str.slice(1,3);\n       time1.min = str;\n   }\n}\n\nif (time2.min < 10){\n   time2.min = \"0\" + time2.min\n   let str = time2.min;\n   if (str.length == 3){\n       str = str.slice(1,3);\n       time2.min = str;\n   }\n}\nif (time3.min < 10){\n   time3.min = \"0\" + time3.min\n   let str = time3.min;\n   if (str.length == 3){\n       str = str.slice(1,3);\n       time3.min = str;\n   }\n}\nif (time4.min < 10){\n   time4.min = \"0\" + time4.min\n   let str = time4.min;\n   if (str.length == 3){\n       str = str.slice(1,3);\n       time4.min = str;\n   }\n}\nif (time5.min < 10){\n   time5.min = \"0\" + time5.min\n   let str = time5.min;\n   if (str.length == 3){\n       str = str.slice(1,3);\n       time5.min = str;\n   }\n}\nif (time6.min < 10){\n   time6.min = \"0\" + time6.min\n   let str = time6.min;\n   if (str.length == 3){\n       str = str.slice(1,3);\n       time6.min = str;\n   }\n}\nif (time7.min < 10){\n   time7.min = \"0\" + time7.min\n   let str = time7.min;\n   if (str.length == 3){\n       str = str.slice(1,3);\n       time7.min = str;\n   }\n}\nif (time8.min < 10){\n   time8.min = \"0\" + time8.min\n   let str = time8.min;\n   if (str.length == 3){\n       str = str.slice(1,3);\n       time8.min = str;\n   }\n}\n\n//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\nlet program = flow.get('program');\nif (program === true){\n    row = 0;\n}\n\nif (row == 1){\n    time1.row = true;\n}\nif (row == 2){\n    time2.row = true;\n} \nif (row == 3){\n    time3.row = true;\n}\nif (row == 4){\n    time4.row = true;\n} \nif (row == 5){\n    time5.row = true;\n}\nif (row == 6){\n    time6.row = true;\n} \nif (row == 7){\n    time7.row = true;\n}\nif (row == 8){\n    time8.row = true;\n} \n\nmsgc = {\n    payload:[\n       {\"timehr\": time1.hr,\n       \"timemin\": time1.min,\n       \"temp\": time1.temp,\n       \"row\": time1.row},\n       {\"timehr\": time2.hr,\n       \"timemin\": time2.min,\n       \"temp\": time2.temp,\n       \"row\": time2.row},\n       {\"timehr\": time3.hr,\n       \"timemin\": time3.min,\n       \"temp\": time3.temp,\n       \"row\": time3.row},\n       {\"timehr\": time4.hr,\n       \"timemin\": time4.min,\n       \"temp\": time4.temp,\n       \"row\": time4.row},\n       {\"timehr\": time5.hr,\n       \"timemin\": time5.min,\n       \"temp\": time5.temp,\n       \"row\": time5.row},\n       {\"timehr\": time6.hr,\n       \"timemin\": time6.min,\n       \"temp\": time6.temp,\n       \"row\": time6.row},\n       {\"timehr\": time7.hr,\n       \"timemin\": time7.min,\n       \"temp\": time7.temp,\n        \"row\": time7.row},\n       {\"timehr\": time8.hr,\n       \"timemin\": time8.min,\n       \"temp\": time8.temp,\n        \"row\": time8.row},\n       ]\n}\n\n\n\nnode.status({fill:\"blue\",shape:\"dot\",text:temperature });\n\nreturn [msg, msgc];","outputs":2,"noerr":0,"x":460,"y":220,"wires":[["a53a8f4.b56b87"],["cd06f167.aa5fa"]]},{"id":"cd06f167.aa5fa","type":"ui_table","z":"2e0b4452.8dfd4c","group":"1c58e99.85d0b96","name":"in process","order":10,"width":6,"height":5,"columns":[{"field":"timehr","title":"Hour","width":"25%","align":"center","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"timemin","title":"Minute","width":"25%","align":"center","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"temp","title":"temp","width":"30%","align":"center","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"row","title":"Adj","width":"20%","align":"center","formatter":"tickCross","formatterParams":{"target":"_blank"}}],"outputs":1,"cts":true,"x":690,"y":220,"wires":[["147155e6.a91aea"]]},{"id":"147155e6.a91aea","type":"function","z":"2e0b4452.8dfd4c","name":"click to set","func":"let z = msg.payload.timehr;\nlet y = msg.payload.timemin;\nlet x = msg.payload.temp;\nlet w = msg.row;\nlet v = flow.get(\"RunProgram\");\n\nif (v === false){\n    return null;\n}\n\nw = w + 1;\nlet a = flow.get('program');\nif (a === false){\n    row = 0;\n    w = 0;\n    node.status({fill:\"blue\",shape:\"dot\",text:\"Program \" + a});\n    return null;\n}\n\nflow.set('hour',z);\nflow.set('minute',y);\nflow.set('set_temp',x);\n\nflow.set('time'+w+\".hr\",z);\nflow.set('time'+w+\".min\",y);\nflow.set('time'+w+\".temp\",x);\nflow.set('row',w);\n\nmsg = {\n    payload: w,\n    row: w,\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":910,"y":220,"wires":[["13fa468e.74c309"]]},{"id":"885452db.461038","type":"comment","z":"2e0b4452.8dfd4c","name":"explain","info":"the input of the set profile node runs to a button that triggers the node to put profile to thermostat node\n\nset target node runs to a numeric input that sets the node to manual mode and a temperature\n\nset current node runs to the temperature sensor attached to the pi\n\ninitialize serves to set the profile on the first power up, you must manually push the inject node to set the profile. Afterwards I adjust all the parameters manually","x":350,"y":300,"wires":[]},{"id":"6fcaa15c.81f2b","type":"function","z":"2e0b4452.8dfd4c","name":"initialize","func":"flow.set(\"time1.hr\",0);\nflow.set(\"time1.min\",0);\nflow.set(\"time1.temp\",18);\nflow.set(\"time2.hr\",5);\nflow.set(\"time2.min\",15);\nflow.set(\"time2.temp\",18);\nflow.set(\"time3.hr\",8);\nflow.set(\"time3.min\",30);\nflow.set(\"time3.temp\",22);\nflow.set(\"time4.hr\",11);\nflow.set(\"time4.min\",45);\nflow.set(\"time4.temp\",22);\nflow.set(\"time5.hr\",14);\nflow.set(\"time5.min\",0);\nflow.set(\"time5.temp\",22);\nflow.set(\"time6.hr\",16);\nflow.set(\"time6.min\",30);\nflow.set(\"time6.temp\",22);\nflow.set(\"time7.hr\",18);\nflow.set(\"time7.min\",40);\nflow.set(\"time7.temp\",22);\nflow.set(\"time8.hr\",18);\nflow.set(\"time8.min\",59);\nflow.set(\"time8.temp\",18);\n\nflow.set(\"set_temp\",10);\n\nflow.set('manual_temp',11);\nflow.set('row',0);\n\nnode.status({fill:\"blue\",shape:\"dot\",text:\"initialized\"});\n\nreturn msg;","outputs":1,"noerr":0,"x":540,"y":140,"wires":[["13fa468e.74c309"]]},{"id":"5a3d2c97.f20dec","type":"inject","z":"2e0b4452.8dfd4c","name":"push to enter data","topic":"","payload":"1","payloadType":"num","repeat":"","crontab":"","once":false,"onceDelay":"3","x":290,"y":140,"wires":[["6fcaa15c.81f2b"]]},{"id":"16f34e80.eaeee9","type":"inject","z":"2e0b4452.8dfd4c","name":"set target","topic":"","payload":"true","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":240,"y":360,"wires":[["c9d6e0d7.3d8f28"]]},{"id":"9d6e4dd7.9a9d5","type":"inject","z":"2e0b4452.8dfd4c","name":"set current","topic":"","payload":"true","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":240,"y":440,"wires":[["7d4a984.924f468"]]},{"id":"1f284451.4cfe44","type":"profile","z":"","name":"Once","time1":"00:00","temp1":"20","time2":"23:59","temp2":"20","time3":"","temp3":"","time4":"","temp4":"","time5":"","temp5":"","time6":"","temp6":"","time7":"","temp7":"","time8":"","temp8":"","time9":"","temp9":"","time10":"","temp10":""},{"id":"1c58e99.85d0b96","type":"ui_group","z":"","name":"Table","tab":"bd9845a6.0e4f38","order":2,"disp":false,"width":6,"collapse":false},{"id":"bd9845a6.0e4f38","type":"ui_tab","z":"","name":"Thermostat","icon":"fa-thermometer","order":1,"disabled":false,"hidden":false}]

Instructions for demonstrating the failure please.

It is probably not so much a failure of the node as a failure of my understanding. If you input a temperature of 25 let's say, with the hysteresis set to plus one and minus one I would expect to see a target of 25 with the state going high on 26 and low on 24. The target temp as reported by the node is something quite a bit lower, in one instance 23.67. I do not understand where that temp comes from. If the target is 25 I would think the target would say 25, or maybe 26 or even 24 but definitely not 23.67. I would like to understand where that target temp comes from or how it's decided. I was hoping the author of the node would help with that or if you would know that would be great

Sorry, but I don't want a lengthy description, I want a Do this, Enter this, Click this then this should happen but I see this. Then I can run it and see what you mean.
That is why I really wanted a flow with just a few injects and so on which demonstrates what you don't understand. Otherwise I am not necessarily doing exactly the same as you.

This topic was automatically closed 60 days after the last reply. New replies are no longer allowed.