Icon

Day3_​S1_​ok

1 · Sensor fault

A dead transmitter writes a sentinel number, not a blank.

Step 1 · Read, flag, and blank the impossible values


  1. Read the minute file with the CSV Reader, parse the stamp with String to Date&Time: 173,549 rows
  2. One Expression node raises flag_range FIRST, then REPLACES each impossible cell with a missing cell: temp outside 20-120 C, negative flow or vibration
  3. 12 rows carry flag_range = 1 and 0 rows are deleted - the other two tags in that row are still good data
  4. The flag is what makes those 12 countable in the DQ report; blanking alone made them vanish

2 · The same minute written twice

The later write is the corrected value.

Step 2 · Keep the corrected write


  1. Sorter by time, then Duplicate Row Filter keeps the LAST row: 173,549 rows become 173,449
  2. One Expression marks the minute before the filter - measured on this machine, KNIME 5.11 writes no status column when it removes
  3. 100 minutes carry had_dup = 1 all the way to the DQ report

3 · One time axis

Rows are not one minute apart, and the historian never writes an empty row.

Step 3 · Profile the gaps, then put every minute on the axis


  1. Carry the previous stamp with the Expression node, measure it with Date&Time Difference, read the Histogram: 301 gaps of 2 minutes or more
  2. 2 min x172, 3 min x64, 4 min x32, 5 min x30 - then nothing at all until 26, 71 and 181, the three real outages
  3. Two cleanly separated populations, and that is what justifies cutting sparse from outage at 5 minutes
  4. Date&Time Range Creator builds the 174,240 minute calendar, Joiner LEFT with the calendar on the left leaves 791 minutes unmatched, then Sorter - the Joiner returns ARBITRARY order

4 · A sensor that stopped moving

The value still arrives, it just never changes.

Step 4 · Catch the stuck tag on the time axis


  1. Minute-to-minute change of all three tags with the Expression node
  2. Sum and Count over a 10 row backward window with the Moving Aggregator
  3. On the axis 10 rows is exactly 10 minutes, and a window over a hole has Count under 10 so it is skipped
  4. Sum zero on a full window is stuck: 190 minutes, every one of them flow

5 · Count what was lost, and why

Every minute leaves this step with a label.

Step 5 · Label every minute and report


  1. One Expression builds cov - how many of the three tags the minute really holds - and a 0/1 presence column
  2. Two Moving Aggregator windows of 6 rows on that column, one backward and one forward: is there a real reading within 5 minutes on each side?
  3. An empty minute with a real neighbour on BOTH sides is sparse, the logger simply wrote on change; with none it is outage
  4. ok 173,214 - sparse 516 - outage 275 - frozen 190 - low_cov 45 = 174,240, and GroupBy on quality, had_dup AND flag_range writes 7 rows

6 · Hand over to Session 2

Only the hours you can defend leave this workflow.

Step 6 · Roll up to hours and write the file


  1. Round to the hour with the Time Rounder, keep the 173,214 ok minutes with the Row Filter - nothing is imputed anywhere in this workflow
  2. Group to 2,898 hours with GroupBy, rename for Session 2 with the Column Renamer
  3. Read the Line Plot of minutes per hour: at 30 real minutes the hourly figure is off by at most 0.042 C, 0.29 m3/h and 0.033 mm/s against the pre-deadband truth, inside the per-minute noise of the tags
  4. A second Row Filter at 30 on all three tag counts writes 2,895 rows - the thinnest tag count left in the file is exactly 30
Node 1Read minute CSV173,549 rows
CSV Reader
Node 2Parse timestamp0 failed
String to Date&Time
Node 19Look ahead 5 minwindow of 6 rows
Moving Aggregator
Node 3Impossible to NA12 cells flagged
Expression
Node 4Order by time173,549 rows
Sorter
Node 5Mark rewritten min100 rows
Expression
Node 6Dedupe: keep last173,449 rows
Duplicate Row Filter
Node 7Previous stampfirst = missing
Expression
Node 20Label every minuteok 173,214
Expression
Node 21Count by 3 keys7 rows
GroupBy
Node 24Keep ok minutes173,214 min
Row Filter
Node 25Roll up to hourly2,898 hours
GroupBy
Node 22Write DQ report7 rows
CSV Writer
Node 23Round to hour174,240 min in
Time Rounder
Node 28Drop thin hours2,895 hours
Row Filter
Node 29Write hourly file2,895 rows
CSV Writer
Node 26Back to tag names9 columns
Column Renamer
Node 27Minutes per hour2,898 points
Line Plot
Node 10Gap sizes5 min, then 26
Histogram
Node 8Gap from previousmax 181 min
Date&Time Difference
Node 13Order the grid174,240 rows
Sorter
Node 9Keep the gaps301 rows >= 2 min
Row Filter
Node 14Change per minuteall three tags
Expression
Node 11Build the calendar174,240 min
Date&Time Range Creator
Node 12Calendar LEFT JOIN791 unmatched
Joiner
Node 17Presence and cov791 rows empty
Expression
Node 18Look back 5 minwindow of 6 rows
Moving Aggregator
Node 15Sum over 10 rows174,240 rows in
Moving Aggregator
Node 16Flag a stuck tag190 min, all flow
Expression

Nodes

Extensions

Links