{"id":2710,"date":"2025-01-12T18:16:32","date_gmt":"2025-01-12T17:16:32","guid":{"rendered":"https:\/\/tomas.dk\/ps\/?p=2710"},"modified":"2025-01-12T18:24:40","modified_gmt":"2025-01-12T17:24:40","slug":"vejrstation-del-4","status":"publish","type":"post","link":"https:\/\/tomas.dk\/ps\/vejrstation-del-4\/","title":{"rendered":"Vejrstation del 4"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1004\" height=\"1024\" data-attachment-id=\"2713\" data-permalink=\"https:\/\/tomas.dk\/ps\/vejrstation-del-4\/vippervipperbund\/\" data-orig-file=\"https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2025\/01\/VipperVipperBund.jpg\" data-orig-size=\"2459,2508\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;1.7&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;XQ-BQ52&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1734605440&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;5.11&quot;,&quot;iso&quot;:&quot;200&quot;,&quot;shutter_speed&quot;:&quot;0.00625&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}\" data-image-title=\"VipperVipperBund\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2025\/01\/VipperVipperBund-294x300.jpg\" data-large-file=\"https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2025\/01\/VipperVipperBund-1004x1024.jpg\" src=\"https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2025\/01\/VipperVipperBund-1004x1024.jpg\" alt=\"Gammel vipperbund med vipper og proximitysensor.\" class=\"wp-image-2713\" srcset=\"https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2025\/01\/VipperVipperBund-1004x1024.jpg 1004w, https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2025\/01\/VipperVipperBund-294x300.jpg 294w, https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2025\/01\/VipperVipperBund-147x150.jpg 147w, https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2025\/01\/VipperVipperBund-768x783.jpg 768w, https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2025\/01\/VipperVipperBund-1506x1536.jpg 1506w, https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2025\/01\/VipperVipperBund-2008x2048.jpg 2008w, https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2025\/01\/VipperVipperBund-1568x1599.jpg 1568w\" sizes=\"auto, (max-width: 1004px) 100vw, 1004px\" \/><\/figure>\n\n\n\n<p>Det hele samles i en web-server med en mariadb database.<br \/>F\u00f8rst oprettes en database med:<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"font-size:10px\"><code>CREATE DATABASE arduinovejr;\nCREATE USER 'vejr'@'localhost' IDENTIFIED BY '_DITPASSWORD_';\nGRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT ON arduinovejr.* TO 'vejr'@'localhost';\nFLUSH PRIVILEGES;\n\nUSE arduinovejr;\nCREATE TABLE vejrdata ( tid DATETIME, temp_inde FLOAT(6,2), temp_ud FLOAT(6,2), tryk FLOAT(6,2), temp_cpu FLOAT(6,2), humid FLOAT(6,2), regn1min FLOAT(6,2), regn5min FLOAT(6,2), temp_1 FLOAT(6,2), temp2 FLOAT(6,2), temp3 FLOAT(6,2) );<\/code><\/pre>\n\n\n\n<p>Databasen burde nu v\u00e6re klar til brug.<\/p>\n\n\n\n<p>For at hente data til databasen har jeg lavet et lille python script. Python skal v\u00e6re version 3.11 eller derover.<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"font-size:10px\"><code>#!\/usr\/bin\/python3.11\n\nimport serial\nimport time\nfrom datetime import datetime\nimport re\nimport mysql.connector as mysql\n\n# Setup serial\n\ntty = serial.Serial(port='\/dev\/ttyUSB0', baudrate=9600, timeout=1)\n\n# Setup mysql connection\nvejrDB = mysql.connect(\n        host = \"localhost\",\n        user = \"vejr\",\n        password = \"DITPASSWORD\",\n        database = \"arduinovejr\")\n\ndef speakToArduino(txt):\n    tty.write(bytes(txt, 'utf-8'))\n    time.sleep(0.05)\n    data = tty.readline().decode('utf-8').rstrip()\n    return data\n\ntime.sleep(2)\n\nsvar = \"na\"\n\nwhile not (re.search(r'&#91;0-9\\.:\\?]+', svar)):\n    svar = speakToArduino('\\n')\n    time.sleep(0.1)\n\nsvar = speakToArduino('getPress')\n#print(\"Lufttryk         : %8s\"%svar)\ntryk = svar\n\nsvar = speakToArduino('getTempIn')\n#print(\"Temperatur cpu   : %8s\"%svar)\ntempCpu = svar\n\nsvar = speakToArduino('getTempOut')\n#print(\"Temperatur ude   : %8s\"%svar)\ntempUd = svar\n\nsvar = speakToArduino('getOutHumidity')\n#print(\"Luftfugtighed ude: %8s\"%svar)\nhumid = svar\n\nsvar = speakToArduino('getrain5')\n#print(\"5 minuters regn  : %8s\"%svar)\nrain5 = svar\n\nsvar = speakToArduino('getrain1')\n#print(\"1 minuters regn  : %8s\"%svar)\nrain1 = svar\n\n\nvejrCursor = vejrDB.cursor()\nnow = datetime.now()\ntid = now.strftime('%Y-%m-%d %H:%M:%S')\n\nsql = \"INSERT INTO vejrdata (tid, temp_cpu, tryk, temp_ud, humid, regn5min, regn1min ) VALUES (%s, %s, %s, %s, %s, %s, %s)\"\nval = (str(tid), str(tempCpu), str(tryk), str(tempUd), str(humid), str(rain5), str(rain1))\n\nvejrCursor.execute(sql, val)\nvejrDB.commit()\n<\/code><\/pre>\n\n\n\n<p>Husk DTR skal v\u00e6re klippet i FTDI kablet, da arduinoen ellers resetter hver gang programmet k\u00f8res. Brugeren der k\u00f8rer scriptet, skal ogs\u00e5 v\u00e6re i dialout gruppen. G\u00f8res med: &#8216;sudo usermod -a -G dialout exampleusername&#8217;.<\/p>\n\n\n\n<p>Jeg k\u00f8rer scriptet i crontab:<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"font-size:10px\"><code>* * * * * \/home\/BRUGER\/arduinoVejr\/getWeather<\/code><\/pre>\n\n\n\n<p>Dern\u00e6st skal der laves et lille php script for at displayenheden kan hente data:<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"font-size:10px\"><code>&lt;?php\nheader(\"Access-Control-Allow-Origin: *\");\nheader(\"Content-Type: application\/json; charset=UTF-8\");\n\nerror_reporting(0);\n\n# Hent logindata til databasen.\n# Disse ligger ikke i web-serverens datapath og kan derfor ikke hentes af andet\n# skriptet.\ninclude('\/home\/BRUGER\/vejrgraf\/dbinfo.php');\n\n$conn = new mysqli(\"localhost\", $dbuser, $dbpasswd, $dbname);\n\n#$result = $conn-&gt;query(\"SELECT systtamp, t_out, rho, ws, dir0, wc, r1h, r24h FROM vejrlog ORDER BY systtamp DESC LIMIT 1\");\n\n$result = $conn-&gt;query(\"SELECT tid, temp_ud, tryk, humid FROM vejrdata ORDER BY tid DESC LIMIT 1\");\nwhile ( $rs = $result-&gt;fetch_array(MYSQLI_ASSOC) ) {\n        $tid     = $rs&#91;\"tid\"];\n        $temp_ud = $rs&#91;\"temp_ud\"];\n        $humid   = $rs&#91;\"humid\"];\n        $tryk    = $rs&#91;\"tryk\"];\n}\n# Hent summerede data\n\n# find 24 timer regn\n#\n$result   = $conn-&gt;query(\"SELECT SUM(regn1min) AS r24timer FROM vejrdata WHERE tid &gt;= NOW() - INTERVAL 1 DAY;\");\nwhile ( $rs = $result-&gt;fetch_array(MYSQLI_ASSOC) ) {\n        $r24timer = $rs&#91;\"r24timer\"];\n}\n\n\n# find 1 time regn\n#\n$result   = $conn-&gt;query(\"SELECT SUM(regn1min) AS r1timer FROM vejrdata WHERE tid &gt;= NOW() - INTERVAL 1 HOUR;\");\nwhile ( $rs = $result-&gt;fetch_array(MYSQLI_ASSOC) ) {\n        $r1timer = $rs&#91;\"r1timer\"];\n}\n\n# find 15 min regn\n#\n$result   = $conn-&gt;query(\"SELECT SUM(regn1min) AS r15min from vejrdata where tid &gt;= NOW() - INTERVAL 15 MINUTE;\");\nwhile ( $rs = $result-&gt;fetch_array(MYSQLI_ASSOC) ) {\n        $r15min = $rs&#91;\"r15min\"];\n}\n\n\n$outp = \"\";\n#while ( $rs = $result-&gt;fetch_array(MYSQLI_ASSOC) ) {\n\n        $outp .= '{\"systid\":\"'  . $tid      . '\",';\n        $outp .= '\"tempout\":'   . $temp_ud  . ',';\n        $outp .= '\"rhout\":'     . $humid    . ',';\n        $outp .= '\"tryk\":'      . $tryk     . ',';\n        $outp .= '\"r1hour\":'    . $r1timer  . ',';\n        $outp .= '\"r24hour\":'   . $r24timer . ',';\n        $outp .= '\"r15min\":'    . $r15min   . '}';\n#}\n\n$conn-&gt;close();\n\necho ($outp);\n?&gt;\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\" style=\"font-size:10px\"><code>Logindata filen:\n&lt;?php\n        $dbname = \"arduinovejr\";\n        $dbuser = \"vejr\";\n        $dbpasswd = \"DITPASSWORD\";\n?&gt;\n<\/code><\/pre>\n\n\n\n<p>Min webserver er en apache i et temmelig standard setup.<\/p>\n\n\n\n<p>Har du sp\u00f8rgsm\u00e5l, s\u00e5 skriv endelig p\u00e5 tcj snabel_a tomas.dk<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Det hele samles i en web-server med en mariadb database.F\u00f8rst oprettes en database med: Databasen burde nu v\u00e6re klar til brug. For at hente data til databasen har jeg lavet et lille python script. Python skal v\u00e6re version 3.11 eller derover. Husk DTR skal v\u00e6re klippet i FTDI kablet, da arduinoen ellers resetter hver gang&hellip; <a class=\"more-link\" href=\"https:\/\/tomas.dk\/ps\/vejrstation-del-4\/\">L\u00e6s mere <span class=\"screen-reader-text\">Vejrstation del 4<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"gallery","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[12231,12242,12237,28,6,17],"tags":[12339,12333,12336,12334,12340,12338],"class_list":["post-2710","post","type-post","status-publish","format-gallery","hentry","category-3d","category-goer-det-selv","category-hobby","category-linux","category-teknik","category-vejr","tag-linux","tag-mariadb","tag-php","tag-python3","tag-sql","tag-webserver","post_format-post-format-gallery","entry"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/tomas.dk\/ps\/wp-json\/wp\/v2\/posts\/2710","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tomas.dk\/ps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tomas.dk\/ps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tomas.dk\/ps\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tomas.dk\/ps\/wp-json\/wp\/v2\/comments?post=2710"}],"version-history":[{"count":3,"href":"https:\/\/tomas.dk\/ps\/wp-json\/wp\/v2\/posts\/2710\/revisions"}],"predecessor-version":[{"id":2716,"href":"https:\/\/tomas.dk\/ps\/wp-json\/wp\/v2\/posts\/2710\/revisions\/2716"}],"wp:attachment":[{"href":"https:\/\/tomas.dk\/ps\/wp-json\/wp\/v2\/media?parent=2710"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tomas.dk\/ps\/wp-json\/wp\/v2\/categories?post=2710"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tomas.dk\/ps\/wp-json\/wp\/v2\/tags?post=2710"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}