<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>電子資料>專業水培數據庫管理開源分享

專業水培數據庫管理開源分享

2022-11-03 | zip | 0.24 MB | 次下載 | 免費

資料介紹

描述

車庫水培

專業水培數據庫管理

因為你真的不知道你的水培系統發生了什么而感到沮喪?

然后使用您的水培控制系統收集數據,并使用它來監控和做出更明智的決策。查看趨勢并了解實際情況!

在讀取溫度、濕度、土壤濕度或任何水培數據后,我們需要首先使用 WiFi 連接將數據發布到數據庫。這是通過使用簡單的 REST API 完成的。REST 或具象狀態傳輸是使用帶有 JSON(JavaScript 對象表示法)格式的有效負載的 HTTP 方法 (POST)。

void HttpPost(const char *url, String &post_data)
{
  HTTPClient http;
  http.begin(url);
  http.addHeader("Content-Type", "application/x-www-form-urlencoded");
 
  int http_code = http.POST(post_data);   // Send the request
  String payload = http.getString();      // Get the response payload
 
  SerialDebug.println(http_code);         // Print HTTP return code
  SerialDebug.println(payload);           // Print request response payload
 
  if (payload.length() > 0) {
    int index = 0;
    do
    {
      if (index > 0) index++;
      int next = payload.indexOf('\n', index);
      if (next == -1) break;
      String request = payload.substring(index, next);
      if (request.substring(0, 9).equals(")) break;
 
      SerialDebug.println(request);
      StaticJsonDocument<100> doc;
      DeserializationError error = deserializeJson(doc, request);
      if (!error) {
        if (doc["OVERRIDE_LIGHTS_TIME"])   OVERRIDE_LIGHTS_TIME = doc["OVERRIDE_LIGHTS_TIME"];
        if (doc["OVERRIDE_LIGHTS"])        OVERRIDE_LIGHTS = doc["OVERRIDE_LIGHTS"];
        if (doc["OVERRIDE_VENT_FAN_TIME"]) OVERRIDE_VENT_FAN_TIME = doc["OVERRIDE_VENT_FAN_TIME"];
        if (doc["OVERRIDE_VENT_FAN"])      OVERRIDE_VENT_FAN = doc["OVERRIDE_VENT_FAN"];
      }
      index = next;
    } while (index >= 0);
  }
 
  http.end();                             // Close connection
}
 
...
 
void loop() {
 
...
 
        char buffer[80];
        strftime(buffer, sizeof(buffer), "%m/%d/%Y %H:%M:%S", &rtc);
 
        // Allocate JsonDocument
        // Use arduinojson.org/assistant to compute the capacity
        StaticJsonDocument<500> doc;
 
        // Create the root object
        doc["ReadingTime"] = buffer;
        doc["InsideTemp"] = (inside.error) ? ERROR_READ : inside.temp;
        doc["InsideRelative"] = (inside.error) ? ERROR_READ : inside.relative;
        doc["InsideAbsolute"] = (inside.error) ? ERROR_READ : inside.absolute;
        doc["OutsideTemp"] = (outside.error) ? ERROR_READ : outside.temp;
        doc["OutsideRelative"] = (outside.error) ? ERROR_READ : outside.relative;
        doc["OutsideAbsolute"] = (outside.error) ? ERROR_READ : outside.absolute;
        doc["VentFan"] = vent_fan;
        doc["Lights"] = lights;
        doc["Power"] = power;
        doc["DailyCost"] = cost;
        doc["ColorTemp"] = color_temp;
        doc["Lux"] = lux;
        doc["CO2"] = co2;
        doc["CO2Temp"] = co2_temp;
        doc["CO2Relative"] = co2_relative;
        doc["GerminationTemp"] = germination_temp;
        doc["ChillerTemp"] = chiller_temp;
        doc["pH"] = pH;
        doc["DO"] = DO;
        JsonArray array = doc.createNestedArray("GrowBed");
        for (i = 0; i < sizeof(grow_bed_table) / sizeof(GROWBED_t); i++) {
          JsonObject object = array.createNestedObject();
          object["WaterTemp"] = (grow_bed_table[i].water_temp_error) ? ERROR_READ : grow_bed_table[i].water_temp;
          object["WaterTDS"] = grow_bed_table[i].water_tds;
          object["WaterLevel"] = grow_bed_table[i].water_level;
        }
        String json_data;
        serializeJson(doc, json_data);
        post_data = "data=" json_data;
        SerialDebug.println(post_data);
 
#ifdef MySQL
        HttpPost(mysql_url, post_data);
#endif
#ifdef MSSQL
        HttpPost(mssql_url, post_data);
#endif
 
...
 
}

服務器/數據庫

您可以使用兩種不同的流行的用戶控制的數據庫平臺。

  • 使用 Microsoft SQL 數據庫服務器的 Windows 虛擬主機。
  • 使用 MySQL 數據庫服務器的本地 Raspberry Pi 4 服務器。

您還可以使用 MQTT 客戶端使用任何 IoT 服務,但此處不解釋該方法。

使用 Microsoft SQL 數據庫服務器的 Windows 虛擬主機

對于 Windows 虛擬主機,我一直在使用WinHost。他們提供每月只需 3.95 美元的基本計劃,應該適合包括我自己在內的大多數家庭愛好者的預算,但您可以使用任何您喜歡的 Windows 虛擬主機。我已經使用了多年,對他們的產品和服務非常滿意。

優點

  • 基于網絡,可在任何計算機網絡瀏覽器的任何地方訪問。
  • 無需維護硬件。
  • 使用 Windows/數據庫安全性更安全。
  • 比 MySQL 快。
  • 可擴展。需要更多性能訂閱更大的平臺,甚至專用服務器。

缺點

  • 在 Web 上,如果未實施安全性(SSL 等),則可被黑客入侵。安全成本為 $$$。
  • 如果您的互聯網連接中斷,您將無法訪問您的系統。
  • 基本計劃限制為 500MB SQL。電源計劃最大為 10GB。較大的費用為$$。

使用SQL Server Management Studio連接到您的 Microsoft SQL Server 并使用以下 SQL 腳本創建數據庫和表。

CREATE TABLE [dbo].[Hydroponics](
    [ReadingTime] [datetime] NOT NULL,
    [InsideTemp] [DECIMAL](9, 2) NULL,
    [InsideRelative] [DECIMAL](9, 2) NULL,
    [InsideAbsolute] [DECIMAL](9, 2) NULL,
    [OutsideTemp] [DECIMAL](9, 2) NULL,
    [OutsideRelative] [DECIMAL](9, 2) NULL,
    [OutsideAbsolute] [DECIMAL](9, 2) NULL,
    [VentFan] [bit] NULL,
    [Lights] [bit] NULL,
    [POWER] [SMALLINT] NULL,
    [GrowBed1WaterTemp] [DECIMAL](9, 2) NULL,
    [GrowBed1WaterTDS] [SMALLINT] NULL,
    [GrowBed1WaterLevel] [bit] NULL,
    [GrowBed2WaterTemp] [DECIMAL](9, 2) NULL,
    [GrowBed2WaterTDS] [SMALLINT] NULL,
    [GrowBed2WaterLevel] [bit] NULL,
    [DailyCost] [DECIMAL](9, 2) NULL,
    [ColorTemp] [INT] NULL,
    [Lux] [INT] NULL,
    [CO2] [DECIMAL](9, 2) NULL,
    [CO2Temp] [DECIMAL](9, 2) NULL,
    [CO2Relative] [DECIMAL](9, 2) NULL,
    [GerminationTemp] [DECIMAL](9,2) NULL,
    [ChillerTemp] [DECIMAL](9,2) NULL,
    [pH] [DECIMAL](9,2) NULL,
    [DO] [DECIMAL](9,2) NULL,
PRIMARY KEY CLUSTERED
(
    [ReadingTime] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
 
CREATE TABLE [dbo].[Request](
    [RequestTime] [DATETIME] NOT NULL,
    [JsonData] [VARCHAR](MAX) NULL,
    [Processed] [BIT] NULL,
PRIMARY KEY CLUSTERED
(
    [RequestTime] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

使用Microsoft IIS 管理器設置和管理您的網站。使用以下 Active Server Page Extended 'adddata.aspx' 連接和傳輸數據負載。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Script;
using System.Web.Script.Serialization;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
 
namespace Hydroponics
{
    public partial class adddata : System.Web.UI.Page
    {
        class GrowBed
        {
            public decimal WaterTemp { get; set; }
            public int WaterTDS { get; set; }
            public bool WaterLevel { get; set; }
        }
 
        class HydroponicsData
        {
            public DateTime ReadingTime { get; set; }
            public decimal InsideTemp { get; set; }
            public decimal InsideRelative { get; set; }
            public decimal InsideAbsolute { get; set; }
            public decimal OutsideTemp { get; set; }
            public decimal OutsideRelative { get; set; }
            public decimal OutsideAbsolute { get; set; }
            public bool VentFan { get; set; }
            public bool Lights { get; set; }
            public int Power { get; set; }
            public decimal DailyCost { get; set; }
            public int ColorTemp { get; set; }
            public int Lux { get; set; }
            public decimal CO2 { get; set; }
            public decimal CO2Temp { get; set; }
            public decimal CO2Relative { get; set; }
            public decimal GerminationTemp { get; set; }
            public decimal ChillerTemp { get; set; }
            public List GrowBed { get; set; }
 
 
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            var data = new JavaScriptSerializer().Deserialize(Request["data"].ToString());
 
            String strSQL = "INSERT INTO Hydroponics (ReadingTime,"
                "InsideTemp,InsideRelative,InsideAbsolute,"
                "OutsideTemp,OutsideRelative,OutsideAbsolute,"
                "VentFan,Lights,Power,DailyCost,"
                "ColorTemp,Lux,"
                "CO2,CO2Temp,CO2Relative,"
                "GerminationTemp,ChillerTemp,"
                "GrowBed1WaterTemp,GrowBed1WaterTDS,GrowBed1WaterLevel,"
                "GrowBed2WaterTemp,GrowBed2WaterTDS,GrowBed2WaterLevel)"
                " VALUES ("
                "'" data.ReadingTime.ToString() "',";
                if (data.InsideTemp >= 0) strSQL += data.InsideTemp.ToString() "," data.InsideRelative.ToString() "," data.InsideAbsolute.ToString() ",";
                else strSQL += "NULL,NULL,NULL,";
                if (data.OutsideTemp >= 0) strSQL += data.OutsideTemp.ToString() "," data.OutsideRelative.ToString() "," data.OutsideAbsolute.ToString() ",";
                else strSQL += "NULL,NULL,NULL,";
                strSQL += ((data.VentFan) ? "1" : "0") "," ((data.Lights) ? "1" : "0") "," data.Power.ToString() "," data.DailyCost.ToString() ",";
                if (data.ColorTemp >= 0) strSQL += data.ColorTemp.ToString() "," data.Lux.ToString() ",";
                else strSQL += "NULL,NULL,";
                if (data.CO2 >= 0) strSQL += data.CO2.ToString() "," data.CO2Temp.ToString() "," data.CO2Relative.ToString() ",";
                else strSQL += "NULL,NULL,NULL,";
                if (data.GerminationTemp >= 0) strSQL += data.GerminationTemp.ToString() ",";
                else strSQL += "NULL,";
                if (data.ChillerTemp >= 0) strSQL += data.ChillerTemp.ToString() ",";
                else strSQL += "NULL,";
                if (data.GrowBed[0].WaterTemp >= 0) strSQL += data.GrowBed[0].WaterTemp.ToString() ",";
                else strSQL += "NULL,";
                if (data.GrowBed[0].WaterTDS >= 0) strSQL += data.GrowBed[0].WaterTDS.ToString() ",";
                else strSQL += "NULL,";
                strSQL += ((data.GrowBed[0].WaterLevel) ? "1" : "0") ",";
                if (data.GrowBed[1].WaterTemp >= 0) strSQL += data.GrowBed[1].WaterTemp.ToString() ",";
                else strSQL += "NULL,";
                if (data.GrowBed[1].WaterTDS >= 0) strSQL += data.GrowBed[1].WaterTDS.ToString() ",";
                else strSQL += "NULL,";
                strSQL += ((data.GrowBed[1].WaterLevel) ? "1" : "0") ")";
 
            try
            {
                SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ServerConnectionString"].ConnectionString);
                con.Open();
 
                SqlCommand cmd = new SqlCommand(strSQL, con);
                cmd.ExecuteNonQuery();
 
                strSQL = "SELECT * FROM Request WHERE Processed IS NULL ORDER BY RequestTime ASC";
                SqlCommand req = new SqlCommand(strSQL, con);
                SqlDataAdapter sda = new SqlDataAdapter(req);
                DataTable dtRequest = new DataTable();
                sda.Fill(dtRequest);
 
                if (dtRequest.Rows.Count > 0)
                {
                    for (int rows = 0; rows < dtRequest.Rows.Count; rows++)
                    {
                        if (dtRequest.Rows[0]["JsonData"] != DBNull.Value)
                        {
                            Response.Write(dtRequest.Rows[0]["JsonData"].ToString());
                            Response.Write("\n");
                        }
                    }
 
                    DateTime dt = (DateTime)dtRequest.Rows[dtRequest.Rows.Count-1]["RequestTime"];
                    strSQL = "UPDATE Request SET Processed=1 WHERE Processed IS NULL AND RequestTime <='" dt.ToString("yyyy-MM-dd HH:mm:ss.fff") "'";
                    SqlCommand upd = new SqlCommand(strSQL,con);
                    upd.ExecuteNonQuery();
                }
 
                con.Close();
            }
            catch (SqlException sqlex)
            {
                Response.Write(sqlex.Message.ToString() "\r\n");
            }
 
 
        }
    }
}

使用 IIS 管理器添加一個連接字符串“ServerConnectionString”,它將允許 .aspx 網頁連接到您的數據庫。

到目前為止,我們應該每分鐘都在捕獲數據。為了動態查看數據庫數據,我們將使用Grafana。 這個動態圖形工具將允許您修改和添加圖表,幫助您查看時間序列數據以管理您的水培系統。

poYBAGNh6RCAZ7wyAAFF3HgKlVA110.png
?

在您的計算機上下載并安裝 Grafana或獲取免費的托管 Grafana 實例并創建 localhost 服務器。

登錄到 Grafana 后,使用 MSSQL 創建數據庫連接,然后導入以下腳本以創建 Garage Hydroponics 儀表板。

格拉法納 MSSQL v1.0

要允許來自 grafana 的請求,例如打開燈或風扇,請添加以下“addrequest.aspx”,以便在下次發送有效負載時做出響應。這意味著一旦選擇了該選項,可能需要一分鐘的時間才能處理該操作。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
 
namespace Hydroponics
{
    public partial class addrequest : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Request["data"] != null)
            {
                String strSQL = "INSERT INTO Request (RequestTime, JsonData) VALUES (GETUTCDATE(),'" + Request["data"].ToString() + "')";
                try
                {
                    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ServerConnectionString"].ConnectionString);
                    con.Open();
 
                    SqlCommand cmd = new SqlCommand(strSQL, con);
                    cmd.ExecuteNonQuery();
 
                    con.Close();
                }
                catch (SqlException sqlex)
                {
                    Response.Write(sqlex.Message.ToString() + "\r\n");
                }
            }
 
            ClientScript.RegisterStartupScript(typeof(Page), "closePage", "window.close();", true);
        }
    }
}

使用 MySQL 數據庫服務器的本地 Raspberry Pi 4 服務器

使用新的 Raspberry Pi 4 作為服務器。隨著 4GB RAM、USB 3.0 和 1Gb 以太網的加入,Raspberry Pi 4 終于成為低成本家庭服務器的真正競爭者。

優點

  • 在本地家庭網絡上。所有數據都被收集并留在家中。
  • 不依賴互聯網連接來收集數據。
  • 數據庫大小受限于您??的驅動器大小。
  • 沒有月費。

缺點

  • 在您的本地家庭網絡上,因此除非打開,否則無法通過網絡訪問它。
  • 硬件維護。
  • 數據庫性能比 Microsoft SQL 慢。
  • 不可擴展。
  • 安全性不強。
poYBAGNh6RKABxgnAABnfg9-b9A050.jpg
?

服務器部件

x1 CanaKit Raspberry Pi2 4GB 入門套件 - 4GB RAM。
x1東芝 HDTB410EK3AA 1TB 2.5" USB 3.0 黑色。

服務器軟件安裝

下載并安裝最新版本的 Raspberry Pi OS。
確保操作系統從 USB 3.0 硬盤啟動。
使用 PHP 下載并安裝 Apache Web 服務器。
下載并安裝 MySQL 數據庫服務器。
下載并安裝 PHPMyAdmin 以輕松管理 MySQL。
下載并安裝 Grafana 服務器。
將以太網設置為您的家庭靜態 IP 地址。
下載并安裝用于遠程訪問的 VNC 查看器。
將您的 Raspberry Pi 4 設置為無頭服務器(無鍵盤/鼠標/顯示器)。

使用 phpMyAdmin 創建一個名為“mydata”的新數據庫,并使用 SQL 腳本創建下表。

CREATE TABLE Hydroponics(
    ReadingTime DATETIME NOT NULL,
    InsideTemp DECIMAL(9, 2) NULL,
    InsideRelative DECIMAL(9, 2) NULL,
    InsideAbsolute DECIMAL(9, 2) NULL,
    OutsideTemp DECIMAL(9, 2) NULL,
    OutsideRelative DECIMAL(9, 2) NULL,
    OutsideAbsolute DECIMAL(9, 2) NULL,
    VentFan BIT NULL,
    Lights BIT NULL,
    Power SMALLINT NULL,
    GrowBed1WaterTemp DECIMAL(9, 2) NULL,
    GrowBed1WaterTDS SMALLINT NULL,
    GrowBed1WaterLevel BIT NULL,
    GrowBed2WaterTemp DECIMAL(9, 2) NULL,
    GrowBed2WaterTDS SMALLINT NULL,
    GrowBed2WaterLevel BIT NULL,
    DailyCost INT NULL,
    ColorTemp INT NULL,
    Lux INT NULL,
    CO2 DECIMAL(9, 2) NULL,
    CO2Temp DECIMAL(9, 2) NULL,
    CO2Relative DECIMAL(9, 2) NULL,
    GerminationTemp DECIMAL(9,2) NULL,
    ChillerTemp DECIMAL(9,2) NULL,
    pH DECIMAL(9,2) NULL,
    DO DECIMAL(9,2) NULL,
    PRIMARY KEY(ReadingTime)
);
 
CREATE TABLE Request(
    RequestTime DATETIME NOT NULL,
    JsonData VARCHAR(4096) NULL,
    Processed BIT NULL,
    PRIMARY KEY(RequestTime)
);

在 Apache Web 服務器中使用以下 PHP 文件“adddata.php”連接到 MySQL 并注入 JSON 數據負載。


 
$servername = "localhost";
$dbname = "mydata";
$username = "admin";
$password = "password";
 
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $data = json_decode($_POST["data"]);
 
    // Create database connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
 
    ini_set("date.timezone", "UTC");
 
    $sql = "INSERT INTO Hydroponics (ReadingTime," .
    "InsideTemp,InsideRelative,InsideAbsolute," .
    "OutsideTemp,OutsideRelative,OutsideAbsolute," .
    "VentFan,Lights,Power,DailyCost," .
    "ColorTemp,Lux," .
    "CO2,CO2Temp,CO2Relative," .
    "GerminationTemp,ChillerTemp," .
    "pH,DO," .
    "GrowBed1WaterTemp,GrowBed1WaterTDS,GrowBed1WaterLevel," .
    "GrowBed2WaterTemp,GrowBed2WaterTDS,GrowBed2WaterLevel) " .
    "VALUES (" .
    "STR_TO_DATE('" . $data->ReadingTime . "','%m/%d/%Y %H:%i:%s'),";
    if ($data->InsideTemp >= 0) $sql .= $data->InsideTemp . "," . $data->InsideRelative . "," . $data->InsideAbsolute . ",";
    else $sql .= "NULL,NULL,NULL,";
    if ($data->OutsideTemp >= 0) $sql .= $data->OutsideTemp . "," . $data->OutsideRelative . "," . $data->OutsideAbsolute . ",";
    else $sql .= "NULL,NULL,NULL,";
    $sql .= ($data->VentFan ? "1":"0") . "," . ($data->Lights ? "1":"0") . "," . $data->Power . "," . $data->DailyCost . ",";
    if ($data->ColorTemp >= 0) $sql .= $data->ColorTemp . "," . $data->Lux . ",";
    else $sql .= "NULL,NULL,";    
    if ($data->CO2 >= 0) $sql .= $data->CO2 . "," . $data->CO2Temp . "," . $data->CO2Relative . ",";
    else $sql .= "NULL,NULL,NULL,";
    if ($data->GerminationTemp >= 0) $sql .= $data->GerminationTemp . ",";
    else $sql .= "NULL,";
    if ($data->ChillerTemp >= 0) $sql .= $data->ChillerTemp . ",";
    else $sql .= "NULL,";
    if ($data->pH >= 0) &sql .= $data->pH . ",";
    else $sql .= "NULL,";
    if ($data->DO >= 0) &sql .= $data->DO . ",";
    else $sql .= "NULL,";
    if ($data->GrowBed[0]->WaterTemp >= 0) $sql .= $data->GrowBed[0]->WaterTemp . ",";
    else $sql .= "NULL,";
    if ($data->GrowBed[0]->WaterTDS >= 0) $sql .= $data->GrowBed[0]->WaterTDS . ",";
    else $sql .= "NULL,";
    $sql .= ($data->GrowBed[0]->WaterLevel ? "1":"0") . ",";
    if ($data->GrowBed[1]->WaterTemp >= 0) $sql .= $data->GrowBed[1]->WaterTemp . ",";
    else $sql .= "NULL,";
    if ($data->GrowBed[1]->WaterTDS >= 0) $sql .= $data->GrowBed[1]->WaterTDS . ",";
    else $sql .= "NULL,";
    $sql .= ($data->GrowBed[1]->WaterLevel ? "1":"0") . ")";
 
    if ($conn->query($sql) == FALSE) {
        echo "Error: " . $sql . "\r\n" . $conn->error . "\r\n";
    }
 
    $sql = "SELECT * FROM Request WHERE Processed IS NULL ORDER BY RequestTime ASC";
    $result = $conn->query($sql);  
    if ($result->num_rows > 0) {
        $lasttime = "";
        while($row = $result->fetch_assoc()) {
            echo $row["JsonData"] . "\n";
            $lasttime = $row["RequestTime"];  
        }
 
        $sql = "UPDATE Request SET Processed=1 WHERE Processed IS NULL AND RequestTime <= '" . $lasttime . "'";
        $conn->query($sql);
    }
 
    $conn->close();
}
else {
    echo "No data posted with HTTP POST.";
}

在 Pi 4 上的端口 3000 登錄 Grafana 后,創建與 MySQL 的數據庫連接,然后導入以下腳本以創建 Garage Hydroponics 儀表板。

格拉法納 MySQL v1.0

注意:為了讓 Grafana 檢索正確的時間序列數據,請確保將 MySQL 中的默認時區設置為 UTC。

要允許來自 grafana 的請求,例如打開燈或風扇,請添加以下 PHP 文件“addrequest.php”,該文件將允許在下次發送有效負載時做出響應。這意味著一旦選擇了該選項,可能需要一分鐘的時間才能處理該操作。


 
$servername = "localhost";
$dbname = "mydata";
$username = "admin";
$password = "mysql";
 
if ($_SERVER["REQUEST_METHOD"] == "GET") {
 
    // Create database connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
 
    ini_set("date.timezone", "UTC");
 
    $sql = "INSERT INTO Request (RequestTime,JsonData) " .
    "VALUES (" .
    "UTC_TIMESTAMP(),'" . $_GET["data"] . "')";
 
    if ($conn->query($sql) == FALSE) {
        echo "Error: " . $sql . "\r\n" . $conn->error;
    }
 
    $conn->close();
 
    echo "";
}
else {
    echo "No data posted with HTTP POST.";
}
 
echo "\r\n";

有關完整的車庫水培解決方案,請參閱我們的其他項目

車庫水培 水
培 深水培養 斗系統
水培 種植傳感器/顯示模塊
水培 冷水機
水培 水/養分控制
水培 數據庫管理
水培 發芽控制
水培 CO2 監測
水培 光照監測
水培 pH 和 DO 監測


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數據手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費
亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>