118 | function formatDateForPicker(date) { |
119 | var h = date.getHours(); |
120 | var m = date.getMinutes(); |
121 | |
122 | function dd(n) { return (n < 10) ? '0' + n : n; } |
123 | return date.getFullYear() + "-" + dd(date.getMonth() + 1) + "-" + dd(date.getDate()) + "T" + dd(h) + ":" + dd(m); |
124 | }</script><script>var logurl="log";Number.prototype.format=function(e,t,r,i){var o="\\d(?=(\\d{"+(t||3)+"})+"+(e>0?"\\D":"$")+")",n=this.toFixed(Math.max(0,~~e));return(i?n.replace(".",i):n).replace(new RegExp(o,"g"),"$&"+(r||","))},String.prototype.escapeJSON=function(){return this.replace(/[\\]/g,"\\\\").replace(/[\"]/g,'\\"').replace(/[\/]/g,"\\/").replace(/[\b]/g,"\\b").replace(/[\f]/g,"\\f").replace(/[\n]/g,"\\n").replace(/[\r]/g,"\\r").replace(/[\t]/g,"\\t")};var logs={url:"loglist.php",rmurl:"loglist.php?rm=",starturl:"loglist.php?start=",stopurl:"loglist.php?stop=1",dlurl:"loglist.php?dl=",ll:[],fs:{},logging:!1,vname:function(e){return""!=e&&!e.match(/[\W]/g)},dupname:function(e){var t=!1;return this.ll.forEach(function(r){e==r.name&&(t=!0)}),t},fsinfo:function(e,t){Q("#fssize").innerHTML=e.format(0,3,","),Q("#fsused").innerHTML=t.format(0,3,","),Q("#fsfree").innerHTML=(e-t).format(0,3,",")},stoplog:function(){if(this.logging&&confirm("Parar o registro atual?")){var e=Q("#logname").value.trim();s_ajax({url:this.stopurl+e,m:"GET",success:function(e){location.reload()},fail:function(e){alert("Falha ao parar por:"+e)}})}},startlog:function(){var e=this;if(!e.logging){if(e.ll.length>=10)return void alert("Registros demais. Apague algum antes de criar um novo.");if(e.fs.size-e.fs.used<=2*e.fs.block)return void alert("Não há espaço livre suficiente!");var t=Q("#logname").value.trim();if(!1===e.vname(t))return void alert("Nome da arquivo inválido, não use caracateres especiais e espaços.");if(e.dupname(t))return void alert("Nome já existente.");var r="";if(Q("#calispindel").checked){var i=parseFloat(Q("#tiltinw").value.trim()),o=parseFloat(Q("#hydrometer").value.trim());if(window.plato&&(o=0),isNaN(i))alert("Valor de inclição é necessário!");else if(!window.plato&&(isNaN(i)||isNaN(o)))return void alert("valor de inclição e valor da densidade são necessários!");r="&tw="+i+"&hr="+o}confirm("Iniciar novo registro?")&&s_ajax({url:e.starturl+t+r,m:"GET",success:function(e){location.reload()},fail:function(e){alert("Falha ao iniciar por:"+e)}})}},recording:function(e,t){this.logging=!0;var r=new Date(1e3*t);Q("#start-log-date").innerHTML=r.toLocaleString(),Q("#loggingtitle").innerHTML=e,Q("#logstartinput").style.display="none",Q("#logstopinput").style.display="block"},stop:function(){this.logging=!1,Q("#logstartinput").style.display="block",Q("#logstopinput").style.display="none"},rm:function(e){var t=this;confirm("Apagar o registro "+t.ll[e].name)&&(console.log("rm "+t.ll[e].name),s_ajax({url:t.rmurl+e,m:"GET",success:function(r){var i=JSON.parse(r);t.fs=i,t.fsinfo(i.size,i.used),t.ll.splice(e,1),t.list(t.ll)},fail:function(e){alert("Falha ao deletar por:"+e)}}))},dl:function(e){window.open(this.dlurl+e)},list:function(e){for(var t,r=Q("#loglist").querySelector("tbody");t=r.querySelector("tr:nth-of-type(2)");)r.removeChild(t);var i=this,o=i.row;e.forEach(function(e,t){var n=e.name,a=new Date(1e3*e.time),l=o.cloneNode(!0);l.querySelector(".logid").innerHTML=n,l.querySelector(".logdate").innerHTML=a.toLocaleString(),l.querySelector(".dlbutton").onclick=function(){i.dl(t)},l.querySelector(".rmbutton").onclick=function(){i.rm(t)},r.appendChild(l)})},init:function(){var e=this;Q("#startlogbutton").onclick=function(){e.startlog()},Q("#stoplogbutton").onclick=function(){e.stoplog()},e.row=Q("#loglist").querySelector("tr:nth-of-type(2)"),e.row.parentNode.removeChild(e.row),s_ajax({url:e.url,m:"GET",success:function(t){var r=JSON.parse(t);if(e.fs=r.fs,r.rec&&e.recording(r.log,r.start),e.ll=r.list,e.list(r.list),e.fsinfo(r.fs.size,r.fs.used),void 0!==r.plato&&r.plato){window.plato=!0;for(var i=document.querySelectorAll(".tiltwatercorrect"),o=0;o<i.length;o++)i[o].style.display="none"}else window.plato=!1},fail:function(e){alert("falha:"+e)}})}};function checkurl(e){e.value.trim().startsWith("https")&&alert("HTTPS não é suportado")}function checkformat(e){e.value.length>256&&(e.value=t.value.substring(0,256)),Q("#fmthint").innerHTML=e.value.length+"/256"}function cmethod(e){for(var t=document.querySelectorAll('input[name$="method"]'),r=0;r<t.length;r++)t[r].id!=e.id&&(t[r].checked=!1);window.selectedMethod=e.value}function generichttp_get(){if(void 0===window.selectedMethod)return alert("Selecione o Método!"),null;var e=Q("#format").value.trim();if("GET"==window.selectedMethod&&new RegExp("s","g").exec(e))return alert("espaço não é permitido"),null;var t={};return t.url=Q("#url").value.trim(),t.format=encodeURIComponent(e.escapeJSON()),t.method=Q("#m_post").checked?"POST":"GET",t.type=Q("#data-type").value.trim(),t.service=0,t}function generichttp_set(e){Q("#service-type").value="generichttp",serviceOption("generichttp"),window.selectedMethod=e.method,Q("#m_"+e.method.toLowerCase()).checked=!0,Q("#url").value=void 0===e.url?"":e.url,Q("#data-type").value=void 0===e.type?"":e.type,Q("#format").value=void 0===e.format?"":e.format,checkformat(Q("#format"))}function ubidots_set(e){Q("#service-type").value="ubidots",serviceOption("ubidots");var t=/http:\/\/([\w\.]+)\.ubidots\.com\/api\/v1\.6\/devices\/(\w+)\/\?token=(\w+)$/.exec(e.url);Q("select[name=ubidots-account]").value="things"==t[1]?1:2,Q("#ubidots-device").value=t[2],Q("#ubidots-token").value=t[3]}function ubidots_get(){var e=Q("#ubidots-device").value.trim();if(!e)return null;var t=Q("#ubidots-token").value.trim();if(!t)return null;var r={};return r.url=1==Q("select[name=ubidots-account]").value?"http://things.ubidots.com/api/v1.6/devices/"+e+"/?token="+t:"http://industrial.api.ubidots.com/v1.6/devices/"+e+"/?token="+t,r.format=encodeURIComponent("{}".escapeJSON()),r.method="POST",r.type="application/json",r.service=1,r}function thingspeak_set(e){Q("#service-type").value="thingspeak",serviceOption("thingspeak");for(var t={},r=e.format.split("&"),i=0;i<r.length;i++){var o=r[i].split("=");t[o[0]]=o[1]}Q("#thingspeak-apikey").value=t.api_key;for(i=1;i<9;i++)Q("select[name=thingspeak-f"+i+"]").value=void 0===t["field"+i]?"unused":t["field"+i].substring(1)}function thingspeak_get(){var e=Q("#thingspeak-apikey").value.trim();if(!e)return null;for(var t=e="api_key="+e,r=1;r<9;r++){var i=Q("select[name=thingspeak-f"+r+"]").value;"unused"!=i&&(t=t+"&field"+r+"=%"+i)}if(t==e)return null;var o={url:"http://api.thingspeak.com/update"};return o.format=encodeURIComponent(t.escapeJSON()),o.method="POST",o.type="application/x-www-form-urlencoded",o.service=0,o}function brewfather_set(e){Q("#service-type").value="brewfather",serviceOption("brewfather");var t=/http:\/\/log\.brewfather\.net\/brewpiless\?id=(\w+)$/.exec(e.url);Q("#brewfather-id").value=t[1];var r=/"id":"([^"]+)"/.exec(e.format);Q("#brewfather-device").value=r[1]}function brewfather_get(e){var t=Q("#brewfather-id").value.trim(),r=Q("#brewfather-device").value.trim();if(!t||!r)return null;var i={};i.url="http://log.brewfather.net/brewpiless?id="+t;var o='{"id":"'+r+'","beerTemp":%b,"beerSet":%B,"fridgeTemp":%f,"fridgeSet":%F,"roomTemp":%r,"gravity":%g,"tiltValue":%t,"auxTemp":%a,"extVolt":%v,"timestamp":%u,"tempUnit":"%U","pressure":%P,"mode":"%M"}';return i.format=encodeURIComponent(o.escapeJSON()),i.method="POST",i.type="application/json",i.service=0,i}function brewersfriend_set(e){Q("#service-type").value="brewersfriend",serviceOption("brewersfriend"),Q("#brewersfriend-url").value=e.url;var t=/"beer":"([^"]+)"/.exec(e.format);Q("#brewersfriend-beer").value=t[1],"P"==/"gravity_unit":"([P|G])"/.exec(e.format)[1]?(Q("#gu-sg").checked=!1,Q("#gu-plato").checked=!0):(Q("#gu-sg").checked=!0,Q("#gu-plato").checked=!1)}function brewersfriend_get(e){var t="%g",r="G";if("gu-plato"==Q('input[name="BF-gu"]:checked').value)t="%p",r="P";var i=Q("#brewersfriend-url").value.trim(),o='{"name":"BrewPiLess","temp": %b,"temp_unit": "%U","gravity":'+t+',"gravity_unit":"'+r+'","ph": "","comment": "","beer":"'+Q("#brewersfriend-beer").value.trim()+'","battery":%v,"RSSI": "","angle": %t}',n={};return n.url=i,n.format=encodeURIComponent(o.escapeJSON()),n.method="POST",n.type="application/json",n.service=2,n}function service_set(e){1==e.service?ubidots_set(e):/http:\/\/api\.thingspeak\.com\//.exec(e.url)?thingspeak_set(e):/http:\/\/log\.brewfather\.net\//.exec(e.url)?brewfather_set(e):/http:\/\/log\.brewersfriend\.com\//.exec(e.url)?brewersfriend_set(e):generichttp_set(e)}function update(){var e,t=Q("#service-type").value,r=Q("#enabled").checked;"generichttp"==t?e=generichttp_get():"ubidots"==t?e=ubidots_get():"thingspeak"==t?e=thingspeak_get():"brewfather"==t?e=brewfather_get():"brewersfriend"==t&&(e=brewersfriend_get()),r&&!e||(e||(e={url:"",format:"",method:"POST",type:"",service:0}),e.enabled=r,e.period=Q("#period").value,e.period<60&&(e.period=60),s_ajax({url:logurl,m:"POST",data:"data="+JSON.stringify(e),success:function(e){alert("Concluído!")},fail:function(e){alert("falha:"+e)}}))}function remote_init(e){var t={generichttp:1,thingspeak:15,brewfather:900,ubidots:1};Q("#period").onchange=function(){var e=t[Q("#service-type").value];Q("#period").value<e&&(Q("#period").value=e)},serviceOption("generichttp"),s_ajax({url:logurl+"?data=1",m:"GET",success:function(e){var t=JSON.parse(e);void 0!==t.enabled&&(Q("#enabled").checked=t.enabled,Q("#period").value=void 0===t.period?300:t.period,service_set(t))}})}function showformat(e){var t=Q("#formatlist"),r=e.getBoundingClientRect();t.style.display="block",t.style.left=r.right+5+"px",t.style.top=r.bottom+5+"px"}function hideformat(){Q("#formatlist").style.display="none"}function serviceOption(e){for(var t=document.querySelectorAll("#service-opt > div"),r=0;r<t.length;r++){var i=t[r];i.id==e?i.style.display="block":i.style.display="none"}Q("#period").onchange()}function serviceChange(){serviceOption(Q("#service-type").value)}function init(e){function t(){var e=parseFloat(Q("#watertemp").value),t=parseFloat(Q("#caltemp").value),r=Q("#tempunit").value;if(!isNaN(e)&&!isNaN(t)){"C"==r&&(t=C2F(t),e=C2F(e));var i=BrewMath.tempCorrectionF(1,t,e);Q("#hydrometer").value=i.toFixed(3)}}void 0===e&&(e=!1),e||(getActiveNavItem(),Q("#verinfo").innerHTML="v"+JSVERSION),Q("#watertemp").onchange=t,Q("#caltemp").onchange=t,Q("#tempunit").onchange=t,remote_init(e),logs.init()}</script><style>#loglist,#loglist td,#loglist th,#loglist tr{border:1px solid #000}fieldset{margin:10px}#fsinfo{margin:10px}#formatlist{display:none;position:absolute;border:1px solid #fff;background:#d3d3d3}#formatlist table,#formatlist td,#formatlist th{border:1px solid #000;border-collapse:collapse}ul.inputlist{list-style-type:none}ul.inputlist li{display:table-row}ul.inputlist .itemtitle{display:table-cell;font-weight:700}ul.inputlist .iteminput{display:table-cell}.listgrid{margin:4px}</style></head><body onload=init(!0)><fieldset><legend> Registro Remoto </legend><form><ul class=inputlist><li><span class=itemtitle>Habilitar</span><span class=itemvalue><input type=checkbox id=enabled value=yes></span></li><li><span class=itemtitle>Intervalo de registro:</span><span class=itemvalue><input type=text id=period size=4> segundos </span></li><li><span class=itemtitle>Tipo de Serviço:</span><span class=itemvalue><select id=service-type name=service onchange=serviceChange()><option value=generichttp> Generic HTTP </option><option value=thingspeak>thingspeak.com</option><option value=ubidots>ubidots.com</option><option value=brewfather>Brewfather</option><option value=brewersfriend>Brewer'sFriend</option></select></span></li></ul><div id=service-opt><div id=brewersfriend class=service-options><ul class=inputlist><li><span class=itemtitle>Stream URL:</span><span class=itemvalue><input type=text id=brewersfriend-url size=42></span></li><li><span class=itemtitle> Beer: </span><span class=itemvalue><input type=text id=brewersfriend-beer size=42></span></li><li><span class=itemtitle> Gravity Unit </span><span class=itemvalue><span class="md-radio md-radio-inline"><input id=gu-sg type=radio name=BF-gu value=gu-sg checked><label for=gu-sg>SG(1.x)</label></span><span class="md-radio md-radio-inline"><input id=gu-plato type=radio name=BF-gu value=gu-plato><label for=gu-plato>Plato(°P)</label></span></span></li></ul></div><div id=thingspeak><ul class=inputlist><li><span class=itemtitle>Write API Key:</span><span class=itemvalue><input type=text id=thingspeak-apikey size=42></span></li><li><span class=itemtitle>Fields:</span><span class=itemvalue><span class=listgrid><label for=thingspeak-f1>Field 1:</label><select name=thingspeak-f1><option value=unused>Unused</option><option value=b> Temp. Cerv.: </option><option value=B> SP Cerv.: </option><option value=f> Temp. Refrig.: </option><option value=F> SP Refrig.: </option><option value=r> Temp. Ambiente: </option><option value=g> Densidade </option><option value=p> Plato </option><option value=a> Temp. iSpindel </option><option value=v> Voltagem iSpindel </option><option value=t> Inclinação </option><option value=P> Pressure in PSI</option><option value=m> mode in integer</option></select></span><span class=listgrid><label for=thingspeak-f2>Field 2:</label><select name=thingspeak-f2><option value=unused>Unused</option><option value=b> Temp. Cerv.: </option><option value=B> SP Cerv.: </option><option value=f> Temp. Refrig.: </option><option value=F> SP Refrig.: </option><option value=r> Temp. Ambiente: </option><option value=g> Densidade </option><option value=p> Plato </option><option value=a> Temp. iSpindel </option><option value=v> Voltagem iSpindel </option><option value=t> Inclinação </option><option value=P> Pressure in PSI</option><option value=m> mode in integer</option></select></span><span class=listgrid><label for=thingspeak-f3>Field 3:</label><select name=thingspeak-f3><option value=unused>Unused</option><option value=b> Temp. Cerv.: </option><option value=B> SP Cerv.: </option><option value=f> Temp. Refrig.: </option><option value=F> SP Refrig.: </option><option value=r> Temp. Ambiente: </option><option value=g> Densidade </option><option value=p> Plato </option><option value=a> Temp. iSpindel </option><option value=v> Voltagem iSpindel </option><option value=t> Inclinação </option><option value=P> Pressure in PSI</option><option value=m> mode in integer</option></select></span><br><span class=listgrid><label for=thingspeak-f4>Field 4:</label><select name=thingspeak-f4><option value=unused>Unused</option><option value=b> Temp. Cerv.: </option><option value=B> SP Cerv.: </option><option value=f> Temp. Refrig.: </option><option value=F> SP Refrig.: </option><option value=r> Temp. Ambiente: </option><option value=g> Densidade </option><option value=p> Plato </option><option value=a> Temp. iSpindel </option><option value=v> Voltagem iSpindel </option><option value=t> Inclinação </option><option value=P> Pressure in PSI</option><option value=m> mode in integer</option></select></span><span class=listgrid><label for=thingspeak-f5>Field 5:</label><select name=thingspeak-f5><option value=unused>Unused</option><option value=b> Temp. Cerv.: </option><option value=B> SP Cerv.: </option><option value=f> Temp. Refrig.: </option><option value=F> SP Refrig.: </option><option value=r> Temp. Ambiente: </option><option value=g> Densidade </option><option value=p> Plato </option><option value=a> Temp. iSpindel </option><option value=v> Voltagem iSpindel </option><option value=t> Inclinação </option><option value=P> Pressure in PSI</option><option value=m> mode in integer</option></select></span><span class=listgrid><label for=thingspeak-f6>Field 6:</label><select name=thingspeak-f6><option value=unused>Unused</option><option value=b> Temp. Cerv.: </option><option value=B> SP Cerv.: </option><option value=f> Temp. Refrig.: </option><option value=F> SP Refrig.: </option><option value=r> Temp. Ambiente: </option><option value=g> Densidade </option><option value=p> Plato </option><option value=a> Temp. iSpindel </option><option value=v> Voltagem iSpindel </option><option value=t> Inclinação </option><option value=P> Pressure in PSI</option><option value=m> mode in integer</option></select></span><br><span class=listgrid><label for=thingspeak-f7>Field 7:</label><select name=thingspeak-f7><option value=unused>Unused</option><option value=b> Temp. Cerv.: </option><option value=B> SP Cerv.: </option><option value=f> Temp. Refrig.: </option><option value=F> SP Refrig.: </option><option value=r> Temp. Ambiente: </option><option value=g> Densidade </option><option value=p> Plato </option><option value=a> Temp. iSpindel </option><option value=v> Voltagem iSpindel </option><option value=t> Inclinação </option><option value=P> Pressure in PSI</option><option value=m> mode in integer</option></select></span><span class=listgrid><label for=thingspeak-f8>Field 8:</label><select name=thingspeak-f8><option value=unused>Unused</option><option value=b> Temp. Cerv.: </option><option value=B> SP Cerv.: </option><option value=f> Temp. Refrig.: </option><option value=F> SP Refrig.: </option><option value=r> Temp. Ambiente: </option><option value=g> Densidade </option><option value=p> Plato </option><option value=a> Temp. iSpindel </option><option value=v> Voltagem iSpindel </option><option value=t> Inclinação </option><option value=P> Pressure in PSI</option><option value=m> mode in integer</option></select></span></span></li></ul></div><div id=brewfather><ul class=inputlist><li><span class=itemtitle>ID:</span><span class=itemvalue><input type=text id=brewfather-id size=42></span></li><li><span class=itemtitle>Device Label:</span><span class=itemvalue><input type=text id=brewfather-device size=42></span></li></ul></div><div id=ubidots><ul class=inputlist><li><span class=itemtitle>Account:</span><span class=itemvalue><select name=ubidots-account class=nb><option value=1>Educational</option><option value=2>Industrial></option></select></span></li><li><span class=itemtitle>Token:</span><span class=itemvalue><input type=text id=ubidots-token size=42></span></li><li><span class=itemtitle>Device:</span><span class=itemvalue><input type=text id=ubidots-device size=42></span></li></ul></div><div id=generichttp><ul class=inputlist><li><span class=itemtitle>Método:</span><span class=itemvalue><input type=checkbox id=m_get name=method value=GET onchange=cmethod(this)>Get <input type=checkbox id=m_post name=method value=POST onchange=cmethod(this)>Post <input type=checkbox id=m_put name=method value=PUT onchange=cmethod(this)>Put</span></li><li><span class=itemtitle>URL:</span><span class=itemvalue><input type=text id=url size=128 placeholder="input link " onchange=checkurl(this)></span></li><li><span class=itemtitle>DataType:</span> <span class=itemvalue><input type=text id=data-type size=42 placeholder=Content-Type></span></li><li><span class=itemtitle></span> <span class=itemvalue onmouseover=showformat(this) onmouseout=hideformat()><u>Especificadores de formato...</u></span></li><li><span class=itemtitle>Formato:</span><span class=itemvalue><textarea id=format rows=4 cols=64 oninput=checkformat(this)></textarea></span></li><li><span class=itemtitle></span> <span class=itemvalue>Caracteres:<span id=fmthint></span></span></li></ul></div></div><br><button type=button onclick=update()>Atualizar</button></form></fieldset><fieldset><legend> Registro Local </legend><div id=logctrl style=border-style:outset;padding:16px><div id=logstartinput><span id=logtitle>Nome do novo registro:</span><input type=text id=logname size=24 maxlength=24> <button id=startlogbutton>Iniciar registro</button><div style=margin-left:16px><strong> Opções:</strong><br> Calibrar iSpindel <input type=checkbox id=calispindel><br> Inclinação na água: <input type=text id=tiltinw size=6> <span class=tiltwatercorrect> Densidade medida: <input type=text id=hydrometer size=6> , ou água @ <input type=text id=watertemp size=4>° calibrado <input type=text id=caltemp size=4>°<select id=tempunit><option vlue=C>C</option><option value=F>F</option></select></span></div></div><div id=logstopinput style=display:none><strong id=loggingtitle></strong> desde <strong id=start-log-date></strong> <button id=stoplogbutton>Parar registro</button></div></div><div id=fsinfo> Memória Livre: <span id=fsfree>0</span> Bytes, Memória Utilizada: <span id=fsused>0</span> Bytes, Memória Total: <span id=fssize>0</span> Bytes</div><table id=loglist><tr><th style=width:30%> Nome do novo registro: </th><th style=width:40%> Data </th><th> Ação </th></tr><tr><td class=logid></td><td class=logdate></td><td><button class=dlbutton>Download</button><button class=rmbutton>Apagar</button></td></tr></table></fieldset><div id=formatlist><table><tr><th>%b</th><td> Temp. Cerv.: </td></tr><tr><th>%B</th><td> SP Cerv.: </td></tr><tr><th>%f</th><td> Temp. Refrig.: </td></tr><tr><th>%F</th><td> SP Refrig.: </td></tr><tr><th>%r</th><td> Temp. Ambiente: </td></tr><tr><th>%g</th><td> Densidade </td></tr><tr><th>%p</th><td> Plato </td></tr><tr><th>%a</th><td> Temp. iSpindel </td></tr><tr><th>%v</th><td> Voltagem iSpindel </td></tr><tr><th>%t</th><td> Inclinação </td></tr><tr><th>%u</th><td> Registro de data/hora da última atualização de densidade </td></tr><tr><th>%U</th><td> Temperature in C or F </td></tr><tr><th>%m</th><td> mode in integer </td></tr><tr><th>%M</th><td> mode in character </td></tr><tr><th>%P</th><td> Pressure in PSI </td></tr></table></div></body></html> |