カントリーハウスのインターネット温度計またはテレメトリー

私は「郊外」の家を建てました。私はそこに住んでいないので、温度を決定する問題に直面しました。 義理の母が建設現場に住んでいます。 水は暖房システムに引き込まれます。 家の+8で、乾式壁の後ろの壁のパイプが凍結し始め、+ 18で義母が傷ついたことが実験的に決定されました。 そこで、温度をリモートで監視するというアイデアが生まれました。



インターネットを検索した後、2つのデバイスを購入しました:国内生産BM1707と中国語termoHID 。 ソフトウェアは両方に添付されました。 中国の創造性はいたずらでしたが、その機能は私たちのものよりわずかに優れていましたが、最大10個のDS18B20センサーをデバイスに接続できます。 この議論は決定的でした。



現在、システムには、ストリート、1階、2階、屋根裏部屋の4つのセンサーがあります。 1年間の統計が蓄積されました。 正面は次のようになります。





openweathermap.orgプロジェクトのATP Dennsy温度計、 こちらのステーション。

プロジェクトnarodmon.ruのATP SSar温度計、 こちらのステーション。

ネイティブサイトtarasii.dyndns.orgは、Windows XPの制限により、10接続でダウンします。



BM1707ソフトウェアは、測定結果をテキストファイルに書き込むことができます。 そのため、長い間考えずに、ファイルからテーブルへのコンバーターがASPでスローされました。 そのような表を読むことは容易ではありませんでした、そして最も重要なことは、すべて同じ温度が正常でない瞬間に気付くことは困難です。 ここで同僚(ATP KOJISI)が救助に来て、正しい道を進みました。 Javascript Highstockが登場しました。 使用方法はHighstockの記事に記載されています:Runstock Awardhighstockに基づく動的チャートを監視します。



いくつかの徹夜の後、ASPのテーブルはJSと結合されました。 実際、グラフィックは現在と同じであることが判明しましたが、ファイルに従って作成されました。 2か月の作業の後、ファイルを破棄する必要がありました。 ファイルの処理には非常に長い時間がかかりました。 決定は非常に高速に行われました-MySQLからグラフを読み取ります。 BM1707ソフトウェアを使用すると、センサーに定期的に問い合わせてから、batファイルを実行できます。 MySQLに測定結果を保存するVBScriptが作成されました。 このスクリプトは、1970年以降のテキスト日付から秒単位の日付への変換、およびそのような時間を持つレコードの存在のチェックを行います。

Const ForReading = 1 Const TristateUseDefault = -2 Dim FSO Set FSO = CreateObject("Scripting.FileSystemObject") Dim FilePath FilePath = "C:\BM1707\bm1707.temp" set cn = CreateObject("ADODB.Connection") cn.connectionstring = "Driver={MySQL ODBC 5.1 Driver};Server=localhost;DataBase=test; " &_ "USER=usr;PASSWORD=psw;" cn.open If FSO.FileExists(FilePath) Then Dim file Set file = FSO.GetFile(FilePath) Dim TextFileStream Set TextFileStream = file.OpenAsTextStream(ForReading,TristateUseDefault) Do While Not TextFileStream.AtEndOfStream Dim line line = TextFileStream.ReadLine curday = Mid(Line,2,2) curmnth = Mid(Line,5,2) curyear = Mid(Line,8,4) curData = Mid(Line,2,10) curhour = Mid(Line,13,2) curmin = Mid(Line,16,2) cursec = Mid(Line,19,2) curdt = curyear & curmnth & curday & curhour & curmin & cursec curhour = Cint(curhour) curmin = Cint(curmin) cursec = Cint(cursec) aspdate = CDate(curData) javadt = ((((aspdate - 25569) * 24 + curhour) * 60 + curmin) * 60 + cursec) * 1000 sqlStr = "SELECT Count( * ) FROM temperatures WHERE javadatetime = " & javadt res = cn.execute(sqlStr) if res(0)="0" then line = trim(Mid(Line,24)) cnt = 1 lst = Split(line) for each str in lst nm = "" val = "" vals = Split(str,"=") for each z in vals if nm = "" then nm = z else val = Replace(z,",",".") end if next if (nm <> "") and (val <> "") then cmdStr = "INSERT INTO temperatures" &_ "(measurementdatetime, thermometerid, value, javadatetime, thermometername)" &_ "VALUES ('" & curdt & "','" & cnt & "','" & val & "','" & javadt & "','" & nm & "')" cn.execute cmdStr End If cnt = cnt + 1 next End if Loop TextFileStream.Close Set TextFileStream = Nothing End If cn.close
      
      





次は、Highstock用のJSONを生成するPHPアダプターです。

 $rcn = mysql_connect("localhost","usr","psw"); mysql_select_db("test"); $termid = " and `thermometerid` = 2"; $last = "order by `measurementdatetime`"; $from = ""; $to = ""; $funk = "MIN"; if (isset($_GET['termid'])) $termid=" and `thermometerid` = ".$_GET['termid']; if (isset($_GET['last'])) $last="order by `measurementdatetime` desc, 'termid' limit ".$_GET['last']; if (isset($_GET['from'])) $from=" and `measurementdatetime` >= ".$_GET['from']; if (isset($_GET['to'])) $to=" and `measurementdatetime` <= ".$_GET['to']; if (isset($_GET['funk'])) $funk="".$_GET['funk']; $sqlstr = "SELECT MIN(`javadatetime`) as javadatetime, ROUND(".$funk."(`value`),1) as value FROM `temperatures` WHERE 1 ".$termid." ".$from." ".$to." group by TO_DAYS(`measurementdatetime`) ".$last; $res = mysql_query($sqlstr); $number = mysql_num_rows($res); printf("["); $first = false; if ($number > 0) { while ($row=mysql_fetch_array($res)) { if ($first) printf(","); printf("["); printf($row['javadatetime']); printf(", "); printf($row['value']); printf("]"); $first = true; } } printf("]"); mysql_close();
      
      





グラフ出力の例:

  var cnt = 0, seriesOptions = [], names = ['MAX','AVG', 'MIN']; createAll(); function createAll() { cnt = 0; $.each(names, function(i, name) { $.getJSON('http://tarasii.dyndns.org/minmax.php?termid=2&funk='+name, function(data) { seriesOptions[i] = {name: name, data: data, tooltip: { yDecimals: 1}}; cnt++; if (cnt == names.length) { createChart(); } }); }); } function createChart() { window.chart = new Highcharts.StockChart({ chart : { renderTo : 'container'}, title : { text : 'Day Temperature Statistics'}, xAxis : { maxZoom : 1 * 24 * 3600000 // fourteen days}, series : seriesOptions }); }
      
      





最近、再び、同僚がjQueryゲージウィジェット(ATP ASM)を要求しました。 アナログ温度計と時計が判明

  function createGauge(inGauge) { inGauge.jqxLinearGauge({ orientation: 'vertical', width: 80, height: 150, ticksMajor: { size: '10%', interval: 10 }, ticksMinor: { size: '5%', interval: 2.5, style: { 'stroke-width': 1, stroke: '#aaaaaa'} }, max: 40, min: -40, pointer: { size: '5%' }, colorScheme: 'scheme05', labels: {position: 'far', interval: 20, formatValue: function (value, position) { if (value === -40) { return '°C'; } return value + '°'; } }, animationDuration: 100 }); };
      
      





結果をopenweathermapに送信するスクリプト

 On Error Resume Next set cn = CreateObject("ADODB.Connection") cn.connectionstring = "Driver={MySQL ODBC 5.1 Driver};Server=localhost;DataBase=test; " &_ "USER=usr;PASSWORD=pwd;" cn.open sqlStr = "SELECT t.value as vl, transactiondatetime,thermometername FROM temperatures t where thermometername='Outdor' order by transactiondatetime desc limit 1; " res = cn.execute(sqlStr) str = FormatNumber(res(0),1,-1,0,0) str = Replace(Str,",",".") cn.close Set cn = Nothing strURL = "http://openweathermap.org/data/post" strDatatoSend ="user=usr&password=pwd&temp="&str&"&lat=50.5193&long=30.5915&alt=100" Dim objHTTP Set objHTTP = CreateObject("Microsoft.XMLHTTP") 'Create XML HTTP object for the Post method objHTTP.open "POST", strURL, False, "usr", "pwd" 'Opening the HTTP post method objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" objHTTP.send strDatatoSend 'Sending the request Set objHTTP = Nothing
      
      





openweathermapステーションからの温度を表示するwindows7のガジェットの例

データの読み取りはjqueryスクリプトによって行われます

 function updateList() { $.getJSON('http://openweathermap.org/data/2.1/weather/station/46933?type=json&callback=?', function(json) { $.each(json, function(i, head) { if(i=="main"){ curTmp = Math.round((head.temp-273)*10)/10; if (curTmp>0){ $('#main').html('<p>+'+curTmp+'°C</p>'); }else{ $('#main').html('<p>-'+curTmp+'°C</p>'); } } }); }); }
      
      







機器について少し。


BM1707コントローラーはDS18B20ツイストペアセンサーに接続され、センサーは並列に接続されます。 タイヤの長さは約10メートルです。



最初は、サーバーはWIN XPを実行しているEeePC900Hネットブックでした。 しばらくして、古いATケースではサーバーはminiITX VIA C7-D 1800MHzに移行しました。





「サーバー」を含むコンポーネントのコストで、100ドル節約できます



この記事がUniPing RS-485に基づくWebインターフェースで電子体温計を補完することを願っています



All Articles