-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMeterSenseDb.sql
More file actions
340 lines (305 loc) · 11.2 KB
/
MeterSenseDb.sql
File metadata and controls
340 lines (305 loc) · 11.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
/* ============================================================
1. CREATE DATABASE
============================================================ */
CREATE DATABASE MeterSenseDB;
GO
USE MeterSenseDB;
GO
/* ============================================================
2. TABLES
============================================================ */
-- 2.1 Customers
CREATE TABLE Customers (
CustomerID INT IDENTITY(1,1) PRIMARY KEY,
CustomerName NVARCHAR(100) NOT NULL,
PhoneNumber NVARCHAR(20),
AddressLine1 NVARCHAR(150),
City NVARCHAR(80),
Country NVARCHAR(80) DEFAULT 'Kenya'
);
GO
-- 2.2 Meters
CREATE TABLE Meters (
MeterID INT IDENTITY(1,1) PRIMARY KEY,
MeterSerial NVARCHAR(50) NOT NULL UNIQUE,
CustomerID INT NULL,
InstallDate DATE,
Status VARCHAR(20) NOT NULL CHECK (Status IN ('ACTIVE','INACTIVE','FAULTY','RETIRED')),
SIM_ICCID NVARCHAR(25),
NetworkProvider NVARCHAR(30),
FirmwareVersion NVARCHAR(20),
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);
GO
-- 2.3 Firmware Versions
CREATE TABLE FirmwareVersions (
FirmwareID INT IDENTITY(1,1) PRIMARY KEY,
VersionCode NVARCHAR(20) NOT NULL UNIQUE,
ReleaseDate DATE,
Notes NVARCHAR(200)
);
GO
-- 2.4 Failure Stages
CREATE TABLE FailureStages (
FailureStageCode VARCHAR(30) PRIMARY KEY,
Description NVARCHAR(200)
);
GO
INSERT INTO FailureStages VALUES
('DOWNLOAD','Failed during download'),
('FLASH','Failed while flashing memory'),
('AUTO_CONFIG','Failed during auto-configuration'),
('REBOOT','Failed during reboot/startup'),
('UNKNOWN','Failure cause not classified');
GO
-- 2.5 Firmware Updates (Core KPI table)
CREATE TABLE FirmwareUpdates (
UpdateID INT IDENTITY(1,1) PRIMARY KEY,
MeterID INT NOT NULL,
FirmwareID INT NOT NULL,
RequestedAt DATETIME2(0) NOT NULL,
StartedAt DATETIME2(0),
CompletedAt DATETIME2(0),
Status VARCHAR(20) NOT NULL CHECK (Status IN ('PENDING','IN_PROGRESS','SUCCESS','FAILED','TIMEOUT')),
FailureReason NVARCHAR(200),
UploadDurationSec INT,
AutoConfigDurationSec INT,
TotalProcessDurationSec AS (ISNULL(UploadDurationSec,0) + ISNULL(AutoConfigDurationSec,0)) PERSISTED,
FailureStage VARCHAR(30),
FOREIGN KEY (MeterID) REFERENCES Meters(MeterID),
FOREIGN KEY (FirmwareID) REFERENCES FirmwareVersions(FirmwareID),
FOREIGN KEY (FailureStage) REFERENCES FailureStages(FailureStageCode)
);
GO
-- 2.6 Configuration Events
CREATE TABLE ConfigurationEvents (
ConfigID INT IDENTITY(1,1) PRIMARY KEY,
MeterID INT NOT NULL,
EventTime DATETIME2(0) NOT NULL,
ConfigType VARCHAR(50) NOT NULL,
Details NVARCHAR(200),
DurationSec INT,
FOREIGN KEY (MeterID) REFERENCES Meters(MeterID)
);
GO
-- 2.7 Connectivity Logs
CREATE TABLE ConnectivityLogs (
LogID BIGINT IDENTITY(1,1) PRIMARY KEY,
MeterID INT NOT NULL,
LogTime DATETIME2(0) NOT NULL,
SignalRSSI_dBm INT,
NetworkType VARCHAR(10),
IsConnected BIT NOT NULL,
ErrorCode NVARCHAR(50),
LinkType VARCHAR(20) NULL
);
GO
-- 2.8 Usage Readings
CREATE TABLE UsageReadings (
ReadingID BIGINT IDENTITY(1,1) PRIMARY KEY,
MeterID INT NOT NULL,
ReadingTime DATETIME2(0) NOT NULL,
GasVolume_m3 DECIMAL(10,3),
BatteryVoltage DECIMAL(5,2),
Temperature_C DECIMAL(5,2),
FOREIGN KEY (MeterID) REFERENCES Meters(MeterID)
);
GO
-- 2.9 Indexes
CREATE INDEX IX_FirmwareUpdates_MeterID ON FirmwareUpdates (MeterID, RequestedAt);
CREATE INDEX IX_ConnLogs_MeterID_Time ON ConnectivityLogs(MeterID, LogTime);
CREATE INDEX IX_Usage_MeterID_Time ON UsageReadings(MeterID, ReadingTime);
GO
/* ============================================================
3. SAMPLE DATA
============================================================ */
-- Customers
INSERT INTO Customers (CustomerName, PhoneNumber, AddressLine1, City) VALUES
('Alice Njeri','+254711000111','House 12, Embakasi','Nairobi'),
('Demo Site – PLANT','+254722333444','Industrial Area','Nairobi');
GO
-- Meters
INSERT INTO Meters VALUES
('MSENSE-KE-0001',1,'2024-01-15','ACTIVE','8925401234567890001','Safaricom','v1.0.0'),
('MSENSE-KE-0002',2,'2024-02-10','ACTIVE','8925401234567890002','Safaricom','v1.0.0');
GO
-- Firmware Versions
INSERT INTO FirmwareVersions VALUES
('v1.0.0','2024-01-01','Initial firmware'),
('v1.1.0','2024-03-01','Optimized retries'),
('v1.2.0','2024-05-15','Faster auto-config');
GO
-- FirmwareUpdates sample
INSERT INTO FirmwareUpdates
(MeterID,FirmwareID,RequestedAt,StartedAt,CompletedAt,Status,FailureReason,UploadDurationSec,AutoConfigDurationSec,FailureStage)
VALUES
(1,2,'2024-06-01 10:00','2024-06-01 10:00','2024-06-01 10:05','SUCCESS',NULL,120,180,NULL),
(1,3,'2024-07-01 11:00','2024-07-01 11:00','2024-07-01 11:02','SUCCESS',NULL,40,40,NULL),
(2,2,'2024-06-02 09:30','2024-06-02 09:30','2024-06-02 09:40','TIMEOUT','Network drop',120,300,'AUTO_CONFIG');
GO
-- Connectivity logs
INSERT INTO ConnectivityLogs (MeterID,LogTime,SignalRSSI_dBm,NetworkType,IsConnected,ErrorCode) VALUES
(2,'2024-06-02 09:35',-105,'4G',0,'PDP_FAIL'),
(2,'2024-06-02 09:36',-110,'4G',0,'NETWORK_TIMEOUT');
GO
-- Usage readings
INSERT INTO UsageReadings VALUES
(1,'2024-06-01 10:03',12.345,3.78,27.5),
(1,'2024-06-02 11:15',13.100,3.75,28.1),
(2,'2024-06-02 09:35',10.540,3.70,26.8);
GO
/* ============================================================
4. CONNECTIVITY & LINK-SWITCHING LOGIC
============================================================ */
-- Link Types
CREATE TABLE LinkTypes (
LinkTypeCode VARCHAR(20) PRIMARY KEY,
Description NVARCHAR(200)
);
GO
INSERT INTO LinkTypes VALUES
('CELLULAR','Terrestrial mobile network'),
('SATELLITE','LEO/GEO satellite link');
GO
-- Connectivity Config (Thresholds)
CREATE TABLE MeterConnectivityConfig (
MeterID INT PRIMARY KEY,
PrimaryLinkType VARCHAR(20) NOT NULL,
SecondaryLinkType VARCHAR(20),
MinCellularRSSI_dBm INT NOT NULL DEFAULT -100,
MaxAllowedFailures INT NOT NULL DEFAULT 3,
PreferredSatProvider NVARCHAR(50),
UseMLSwitching BIT NOT NULL DEFAULT 0,
MLThreshold_Prob FLOAT,
MLModelVersion NVARCHAR(50),
FOREIGN KEY (MeterID) REFERENCES Meters(MeterID),
FOREIGN KEY (PrimaryLinkType) REFERENCES LinkTypes(LinkTypeCode),
FOREIGN KEY (SecondaryLinkType) REFERENCES LinkTypes(LinkTypeCode)
);
GO
INSERT INTO MeterConnectivityConfig
(MeterID,PrimaryLinkType,SecondaryLinkType,MinCellularRSSI_dBm,MaxAllowedFailures)
VALUES
(1,'CELLULAR','SATELLITE',-100,3),
(2,'CELLULAR','SATELLITE',-95,2);
GO
-- LinkSwitchEvents
CREATE TABLE LinkSwitchEvents (
SwitchID INT IDENTITY(1,1) PRIMARY KEY,
MeterID INT NOT NULL,
SwitchTime DATETIME2(0) NOT NULL,
FromLinkType VARCHAR(20) NOT NULL,
ToLinkType VARCHAR(20) NOT NULL,
Reason NVARCHAR(200),
PrevRSSI_dBm INT,
PrevFailCount INT,
FOREIGN KEY (MeterID) REFERENCES Meters(MeterID),
FOREIGN KEY (FromLinkType) REFERENCES LinkTypes(LinkTypeCode),
FOREIGN KEY (ToLinkType) REFERENCES LinkTypes(LinkTypeCode)
);
GO
/* ============================================================
5. MACHINE LEARNING TABLES
============================================================ */
-- ML Models
CREATE TABLE MLModels (
ModelID INT IDENTITY(1,1) PRIMARY KEY,
ModelName NVARCHAR(100) NOT NULL,
ModelVersion NVARCHAR(50) NOT NULL,
UseCase NVARCHAR(50) NOT NULL,
TrainedFrom DATE,
TrainedTo DATE,
MetricName NVARCHAR(50),
MetricValue FLOAT,
Notes NVARCHAR(200)
);
GO
INSERT INTO MLModels VALUES
('Link Failure Classifier','v1.0','LINK_SWITCHING','2024-01-01','2024-06-30','AUC',0.87,'GBM model predicting failures');
GO
-- ML Predictions
CREATE TABLE LinkFailurePredictions (
PredictionID INT IDENTITY(1,1) PRIMARY KEY,
UpdateID INT NOT NULL,
ModelID INT NOT NULL,
PredictionTime DATETIME2(0) NOT NULL,
ProbFailure FLOAT NOT NULL,
RecommendedLinkType VARCHAR(20),
UsedForDecision BIT NOT NULL DEFAULT 0,
FOREIGN KEY (UpdateID) REFERENCES FirmwareUpdates(UpdateID),
FOREIGN KEY (ModelID) REFERENCES MLModels(ModelID),
FOREIGN KEY (RecommendedLinkType) REFERENCES LinkTypes(LinkTypeCode)
);
GO
/* ============================================================
6. VIEWS
============================================================ */
-- Firmware KPIs
CREATE VIEW vw_FirmwareVersionKPI AS
SELECT
fv.VersionCode,
COUNT(*) AS TotalUpdates,
SUM(CASE WHEN fu.Status='SUCCESS' THEN 1 ELSE 0 END) AS SuccessfulUpdates,
SUM(CASE WHEN fu.Status IN ('FAILED','TIMEOUT') THEN 1 ELSE 0 END) AS FailedUpdates,
AVG(CAST(fu.UploadDurationSec AS FLOAT)) AS AvgUploadSec,
AVG(CAST(fu.AutoConfigDurationSec AS FLOAT)) AS AvgAutoConfigSec,
AVG(CAST(fu.TotalProcessDurationSec AS FLOAT)) AS AvgTotalProcessSec
FROM FirmwareUpdates fu
JOIN FirmwareVersions fv ON fu.FirmwareID = fv.FirmwareID
GROUP BY fv.VersionCode;
GO
-- Problem Meters
CREATE VIEW vw_ProblemMeters AS
SELECT
m.MeterSerial,
m.NetworkProvider,
COUNT(*) AS TotalUpdates,
SUM(CASE WHEN fu.Status IN ('FAILED','TIMEOUT') THEN 1 ELSE 0 END) AS FailCount,
AVG(CAST(fu.TotalProcessDurationSec AS FLOAT)) AS AvgTotalSec
FROM FirmwareUpdates fu
JOIN Meters m ON fu.MeterID = m.MeterID
GROUP BY m.MeterSerial, m.NetworkProvider;
GO
-- Failure Root Cause (Firmware + Network)
CREATE VIEW vw_FailureRootCause AS
SELECT TOP 1000
fu.UpdateID,
m.MeterSerial,
fu.Status,
fu.FailureStage,
fu.FailureReason,
fu.TotalProcessDurationSec,
cl.SignalRSSI_dBm,
cl.NetworkType,
cl.IsConnected,
cl.ErrorCode
FROM FirmwareUpdates fu
JOIN Meters m ON fu.MeterID = m.MeterID
LEFT JOIN ConnectivityLogs cl
ON fu.MeterID = cl.MeterID
AND ABS(DATEDIFF(MINUTE, fu.CompletedAt, cl.LogTime)) <= 5
WHERE fu.Status IN ('FAILED','TIMEOUT');
GO
-- ML Prediction Performance View
CREATE VIEW vw_MLPredictionPerformance AS
SELECT
p.PredictionID,
fu.UpdateID,
m.MeterSerial,
p.ProbFailure,
p.RecommendedLinkType,
fu.Status AS ActualStatus,
CASE WHEN fu.Status IN ('FAILED','TIMEOUT') THEN 1 ELSE 0 END AS ActualFailed,
p.UsedForDecision,
mm.ModelName,
mm.ModelVersion
FROM LinkFailurePredictions p
JOIN FirmwareUpdates fu ON p.UpdateID = fu.UpdateID
JOIN Meters m ON fu.MeterID = m.MeterID
JOIN MLModels mm ON p.ModelID = mm.ModelID;
GO
/* ============================================================
7. DONE
============================================================ */
SELECT 'MeterSenseDB Build Complete' AS Status;
GO