Files
controls-web/includes/millprojected60min_mssql.php
2026-02-17 12:44:37 -06:00

130 lines
3.4 KiB
PHP

<?php
/**
* Mill Projected Total - MSSQL Version (60 minute window)
*
* Uses SQL Server archive table (row-based storage) instead of MySQL
*
* Tags:
* - WTOTGROUND (ID: 342) - West Mill Total Ground
* - CANETOT (ID: 218) - East Mill Total Ground
* - TotalGround (ID: 230) - Total Ground Since 5 AM
*/
$servername = "192.168.0.13\\SQLEXPRESS";
$username = "opce";
$password = "opcelasuca";
$dbname = "history";
try {
$pdo = new PDO(
"sqlsrv:Server=$servername;Database=$dbname",
$username,
$password,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]
);
} catch (PDOException $e) {
echo "0";
return;
}
// Tag IDs
$eastId = 218; // CANETOT
$westId = 342; // WTOTGROUND
$totalId = 230; // TotalGround
$query = "
DECLARE @now DATETIME = GETDATE();
DECLARE @oneHourAgo DATETIME = DATEADD(HOUR, -1, @now);
-- Calculate hours remaining until 5 AM
-- If before 5 AM, time until 5 AM today
-- If after 5 AM, time until 5 AM tomorrow
DECLARE @hoursRemaining FLOAT;
DECLARE @targetTime DATETIME;
IF CAST(@now AS TIME) < '05:00:00'
SET @targetTime = CAST(CAST(@now AS DATE) AS DATETIME) + CAST('05:00:00' AS DATETIME)
ELSE
SET @targetTime = CAST(DATEADD(DAY, 1, CAST(@now AS DATE)) AS DATETIME) + CAST('05:00:00' AS DATETIME)
SET @hoursRemaining = DATEDIFF(SECOND, @now, @targetTime) / 3600.0;
-- Get latest East value
DECLARE @eastLatest FLOAT = (
SELECT TOP 1 Value
FROM dbo.archive
WHERE ID = :eastId
ORDER BY TimeStamp DESC
);
-- Get East value from ~60 minutes ago
DECLARE @eastOld FLOAT = (
SELECT TOP 1 Value
FROM dbo.archive
WHERE ID = :eastId2 AND TimeStamp <= @oneHourAgo
ORDER BY TimeStamp DESC
);
-- Get latest West value
DECLARE @westLatest FLOAT = (
SELECT TOP 1 Value
FROM dbo.archive
WHERE ID = :westId
ORDER BY TimeStamp DESC
);
-- Get West value from ~60 minutes ago
DECLARE @westOld FLOAT = (
SELECT TOP 1 Value
FROM dbo.archive
WHERE ID = :westId2 AND TimeStamp <= @oneHourAgo
ORDER BY TimeStamp DESC
);
-- Get current total ground
DECLARE @totalGround FLOAT = (
SELECT TOP 1 Value
FROM dbo.archive
WHERE ID = :totalId
ORDER BY TimeStamp DESC
);
-- Calculate rates (tons per hour)
DECLARE @eastRate FLOAT = COALESCE(@eastLatest, 0) - COALESCE(@eastOld, 0);
DECLARE @westRate FLOAT = COALESCE(@westLatest, 0) - COALESCE(@westOld, 0);
-- Handle negative rates (mill reset or bad data)
IF @eastRate < 0 SET @eastRate = 0;
IF @westRate < 0 SET @westRate = 0;
-- Calculate projection
SELECT ROUND(
((@eastRate + @westRate) * @hoursRemaining) + COALESCE(@totalGround, 0),
0
) AS millprojected;
";
try {
$stmt = $pdo->prepare($query);
$stmt->execute([
':eastId' => $eastId,
':eastId2' => $eastId,
':westId' => $westId,
':westId2' => $westId,
':totalId' => $totalId,
]);
$result = $stmt->fetch();
$projected = $result ? round($result['millprojected']) : 0;
} catch (PDOException $e) {
$projected = 0;
}
$pdo = null;
?>
<?php echo $projected; ?>