Vejrstation del 4

Gammel vipperbund med vipper og proximitysensor.

Det hele samles i en web-server med en mariadb database.
Først oprettes en database med:

CREATE DATABASE arduinovejr;
CREATE USER 'vejr'@'localhost' IDENTIFIED BY '_DITPASSWORD_';
GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT ON arduinovejr.* TO 'vejr'@'localhost';
FLUSH PRIVILEGES;

USE arduinovejr;
CREATE 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) );

Databasen burde nu være klar til brug.

For at hente data til databasen har jeg lavet et lille python script. Python skal være version 3.11 eller derover.

#!/usr/bin/python3.11

import serial
import time
from datetime import datetime
import re
import mysql.connector as mysql

# Setup serial

tty = serial.Serial(port='/dev/ttyUSB0', baudrate=9600, timeout=1)

# Setup mysql connection
vejrDB = mysql.connect(
        host = "localhost",
        user = "vejr",
        password = "DITPASSWORD",
        database = "arduinovejr")

def speakToArduino(txt):
    tty.write(bytes(txt, 'utf-8'))
    time.sleep(0.05)
    data = tty.readline().decode('utf-8').rstrip()
    return data

time.sleep(2)

svar = "na"

while not (re.search(r'[0-9\.:\?]+', svar)):
    svar = speakToArduino('\n')
    time.sleep(0.1)

svar = speakToArduino('getPress')
#print("Lufttryk         : %8s"%svar)
tryk = svar

svar = speakToArduino('getTempIn')
#print("Temperatur cpu   : %8s"%svar)
tempCpu = svar

svar = speakToArduino('getTempOut')
#print("Temperatur ude   : %8s"%svar)
tempUd = svar

svar = speakToArduino('getOutHumidity')
#print("Luftfugtighed ude: %8s"%svar)
humid = svar

svar = speakToArduino('getrain5')
#print("5 minuters regn  : %8s"%svar)
rain5 = svar

svar = speakToArduino('getrain1')
#print("1 minuters regn  : %8s"%svar)
rain1 = svar


vejrCursor = vejrDB.cursor()
now = datetime.now()
tid = now.strftime('%Y-%m-%d %H:%M:%S')

sql = "INSERT INTO vejrdata (tid, temp_cpu, tryk, temp_ud, humid, regn5min, regn1min ) VALUES (%s, %s, %s, %s, %s, %s, %s)"
val = (str(tid), str(tempCpu), str(tryk), str(tempUd), str(humid), str(rain5), str(rain1))

vejrCursor.execute(sql, val)
vejrDB.commit()

Husk DTR skal være klippet i FTDI kablet, da arduinoen ellers resetter hver gang programmet køres. Brugeren der kører scriptet, skal også være i dialout gruppen. Gøres med: ‘sudo usermod -a -G dialout exampleusername’.

Jeg kører scriptet i crontab:

* * * * * /home/BRUGER/arduinoVejr/getWeather

Dernæst skal der laves et lille php script for at displayenheden kan hente data:

<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");

error_reporting(0);

# Hent logindata til databasen.
# Disse ligger ikke i web-serverens datapath og kan derfor ikke hentes af andet
# skriptet.
include('/home/BRUGER/vejrgraf/dbinfo.php');

$conn = new mysqli("localhost", $dbuser, $dbpasswd, $dbname);

#$result = $conn->query("SELECT systtamp, t_out, rho, ws, dir0, wc, r1h, r24h FROM vejrlog ORDER BY systtamp DESC LIMIT 1");

$result = $conn->query("SELECT tid, temp_ud, tryk, humid FROM vejrdata ORDER BY tid DESC LIMIT 1");
while ( $rs = $result->fetch_array(MYSQLI_ASSOC) ) {
        $tid     = $rs["tid"];
        $temp_ud = $rs["temp_ud"];
        $humid   = $rs["humid"];
        $tryk    = $rs["tryk"];
}
# Hent summerede data

# find 24 timer regn
#
$result   = $conn->query("SELECT SUM(regn1min) AS r24timer FROM vejrdata WHERE tid >= NOW() - INTERVAL 1 DAY;");
while ( $rs = $result->fetch_array(MYSQLI_ASSOC) ) {
        $r24timer = $rs["r24timer"];
}


# find 1 time regn
#
$result   = $conn->query("SELECT SUM(regn1min) AS r1timer FROM vejrdata WHERE tid >= NOW() - INTERVAL 1 HOUR;");
while ( $rs = $result->fetch_array(MYSQLI_ASSOC) ) {
        $r1timer = $rs["r1timer"];
}

# find 15 min regn
#
$result   = $conn->query("SELECT SUM(regn1min) AS r15min from vejrdata where tid >= NOW() - INTERVAL 15 MINUTE;");
while ( $rs = $result->fetch_array(MYSQLI_ASSOC) ) {
        $r15min = $rs["r15min"];
}


$outp = "";
#while ( $rs = $result->fetch_array(MYSQLI_ASSOC) ) {

        $outp .= '{"systid":"'  . $tid      . '",';
        $outp .= '"tempout":'   . $temp_ud  . ',';
        $outp .= '"rhout":'     . $humid    . ',';
        $outp .= '"tryk":'      . $tryk     . ',';
        $outp .= '"r1hour":'    . $r1timer  . ',';
        $outp .= '"r24hour":'   . $r24timer . ',';
        $outp .= '"r15min":'    . $r15min   . '}';
#}

$conn->close();

echo ($outp);
?>
Logindata filen:
<?php
        $dbname = "arduinovejr";
        $dbuser = "vejr";
        $dbpasswd = "DITPASSWORD";
?>

Min webserver er en apache i et temmelig standard setup.

Har du spørgsmål, så skriv endelig på tcj snabel_a tomas.dk

Skriv kommentar

This site uses Akismet to reduce spam. Learn how your comment data is processed.