将单个传感器值与校正因子组合成一个整体值

Air*_*ire 5 mysql-5.5 datetime

对于学校项目,我们试图根据 5 个传感器(3x O3、1x 温度、1x 湿度)的组合来计算(校正)臭氧值。

我们在项目的其余部分使用 MySQL 和 PHP。

该表Measurements具有以下结构:

id (int(11))
time (datetime)
value (float)
measured_value (float)
sensor (tinytext)
unit (tinytext)
measurement_short_type (tinytext)
stream_id int(11)
Run Code Online (Sandbox Code Playgroud)

所以一个示例行看起来像这样:

ID    Time                 value  measured_value  sensor  unit   measurement_short_type  stream_id
----  -------------------  -----  --------------  ------  -----  ----------------------  ---------
3324  2016-05-21 11:00:34  0      193             O3r     KOhms  O3                      6511
Run Code Online (Sandbox Code Playgroud)

如您所见,我们有 2 列,value(float) 和measured_value(float)。

为了value根据单个传感器数据(存储在 中measured_value)计算正确的最终数据,我们需要对每个数据点应用与此类似的公式:

Corrected value[datetime] = ("6511".measured_value[datetime] * -0.106830613)
                          + ("6512".measured_value[datetime] * 0.065201457)
                          + ("6513".measured_value[datetime] * 0.335456161)
                          + ("6514".measured_value[datetime] * -0.248569888)
                          + ("6515".measured_value[datetime] * 1.423460009) + -2.113591555
Run Code Online (Sandbox Code Playgroud)

其中 6511、6512、...、6515 是 5 个传感器(3x O3、1x 温度、1x 湿度)的 ID。所有传感器的值都存储在同一个表中。

表示法的"6514". measured_value[datetime]意思是:使用measured_value(不是value!)具有大致相同日期时间戳的行和流 ID 6514

所有传感器大约同时报告它们的值,每 30 分钟(即 x:00 和 x:30),但不完全是:一个传感器可能有10:59:59时间戳,另一个传感器11:00:34

据我所知,解决这个问题有两个要素:

  1. 根据大约每 30 分钟生成的 5 个传感器输入值,我们如何在 MySQL 中应用上述公式的校正以获得准确值?
  2. 由于 5 个单独传感器的时间戳并不总是完全相同,有没有办法获得时间“捏造因素”,因为相应的传感器输入值从未在完全相同的时间戳上报告?

如果这是不可能的,有人可以就如何实现这一目标提出建议吗?我们无法影响传感器的时序,但如果便于计算,我们可以更改 DB/表结构。

Eze*_*nay 1

您可以执行以下操作,前提是您的传感器 6511 每 30 分钟可靠地进行一次测量(使用最可靠的传感器)。这将根据所使用的主传感器的记录(主要是 FROM,在本例中为 6511)计算测量值,显示此类记录的确切日期和时间,还显示 30 分钟时段内的调整时间,并使用任何可用的测量值对于所有其他传感器,以主要测量后 10 分钟内可用的最新传感器为准:

SELECT "date",
       DATE("date") + INTERVAL round((UNIX_TIMESTAMP("date") - UNIX_TIMESTAMP(DATE("date")))/1800) * 30 MINUTE AS adj_date,
       (measured_value * -0.106830613) +
       (SELECT measured_value * 0.065201457
        FROM Measurements
        WHERE stream_id = '6512' AND "date" < (s1."date" + INTERVAL 10 MINUTE)
        ORDER BY "date" DESC LIMIT 1) +
       (SELECT measured_value * 0.335456161
        FROM Measurements
        WHERE stream_id = '6513' AND "date" < (s1."date" + INTERVAL 10 MINUTE)
        ORDER BY "date" DESC LIMIT 1) +
       (SELECT measured_value * -0.248569888
        FROM Measurements
        WHERE stream_id = '6514' AND "date" < (s1."date" + INTERVAL 10 MINUTE)
        ORDER BY "date" DESC LIMIT 1) +
       (SELECT measured_value * 1.423460009
        FROM Measurements
        WHERE stream_id = '6515' AND "date" < (s1."date" + INTERVAL 10 MINUTE)
        ORDER BY "date" DESC LIMIT 1) + -2.113591555 AS "Corrected value"
FROM "Measurements" AS s1
WHERE stream_id = '6511';
Run Code Online (Sandbox Code Playgroud)

确保您有一个索引stream_id, "date"