{
  "__inputs": [
    {
      "name": "DS_INFLUXDB",
      "label": "InfluxDB (Flux)",
      "description": "InfluxDB v2 datasource configured with Flux query language",
      "type": "datasource",
      "pluginId": "influxdb",
      "pluginName": "InfluxDB"
    }
  ],
  "__requires": [
    {
      "type": "grafana",
      "id": "grafana",
      "name": "Grafana",
      "version": "10.0.0"
    },
    {
      "type": "datasource",
      "id": "influxdb",
      "name": "InfluxDB",
      "version": "1.0.0"
    },
    {
      "type": "panel",
      "id": "timeseries",
      "name": "Time series",
      "version": ""
    },
    {
      "type": "panel",
      "id": "histogram",
      "name": "Histogram",
      "version": ""
    },
    {
      "type": "panel",
      "id": "stat",
      "name": "Stat",
      "version": ""
    }
  ],
  "title": "Clockd - Vehicle Speed Monitoring",
  "uid": "clockd-speed",
  "tags": [
    "clockd",
    "speed",
    "vehicles"
  ],
  "timezone": "browser",
  "refresh": "30s",
  "time": {
    "from": "now-24h",
    "to": "now"
  },
  "panels": [
    {
      "title": "Total Detections",
      "type": "stat",
      "gridPos": {
        "x": 0,
        "y": 0,
        "w": 6,
        "h": 4
      },
      "datasource": {
        "type": "influxdb",
        "uid": "${DS_INFLUXDB}"
      },
      "fieldConfig": {
        "defaults": {
          "unit": "short",
          "color": {
            "mode": "fixed",
            "fixedColor": "purple"
          },
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {
                "color": "purple",
                "value": null
              }
            ]
          }
        }
      },
      "options": {
        "colorMode": "value",
        "graphMode": "none",
        "textMode": "value"
      },
      "targets": [
        {
          "query": "from(bucket: \"metrics\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r._measurement == \"processing_summary\")\n  |> filter(fn: (r) => r._field == \"vehicle_count\")\n  |> group()\n  |> count()\n  |> set(key: \"_field\", value: \"total\")",
          "refId": "A",
          "datasource": {
            "type": "influxdb",
            "uid": "${DS_INFLUXDB}"
          }
        }
      ]
    },
    {
      "title": "Vehicles >25mph",
      "type": "stat",
      "gridPos": {
        "x": 6,
        "y": 0,
        "w": 6,
        "h": 4
      },
      "datasource": {
        "type": "influxdb",
        "uid": "${DS_INFLUXDB}"
      },
      "fieldConfig": {
        "defaults": {
          "unit": "short",
          "color": {
            "mode": "fixed",
            "fixedColor": "red"
          },
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {
                "color": "red",
                "value": null
              }
            ]
          }
        }
      },
      "options": {
        "colorMode": "value",
        "graphMode": "none",
        "textMode": "value"
      },
      "targets": [
        {
          "query": "from(bucket: \"metrics\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r._measurement == \"vehicle_speed\")\n  |> filter(fn: (r) => r._field == \"speed_avg\")\n  |> filter(fn: (r) => r._value > 25.0)\n  |> group()\n  |> count()\n  |> set(key: \"_field\", value: \"total\")",
          "refId": "A",
          "datasource": {
            "type": "influxdb",
            "uid": "${DS_INFLUXDB}"
          }
        }
      ]
    },
    {
      "title": "Average Speed",
      "type": "stat",
      "gridPos": {
        "x": 12,
        "y": 0,
        "w": 6,
        "h": 4
      },
      "datasource": {
        "type": "influxdb",
        "uid": "${DS_INFLUXDB}"
      },
      "fieldConfig": {
        "defaults": {
          "unit": "mph",
          "decimals": 1,
          "color": {
            "mode": "fixed",
            "fixedColor": "green"
          },
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {
                "color": "green",
                "value": null
              }
            ]
          }
        }
      },
      "options": {
        "colorMode": "value",
        "graphMode": "none",
        "textMode": "value"
      },
      "targets": [
        {
          "query": "from(bucket: \"metrics\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r._measurement == \"vehicle_speed\")\n  |> filter(fn: (r) => r._field == \"speed_avg\")\n  |> group()\n  |> mean()\n  |> set(key: \"_field\", value: \"avg\")",
          "refId": "A",
          "datasource": {
            "type": "influxdb",
            "uid": "${DS_INFLUXDB}"
          }
        }
      ]
    },
    {
      "title": "Top Speed",
      "type": "stat",
      "gridPos": {
        "x": 18,
        "y": 0,
        "w": 6,
        "h": 4
      },
      "datasource": {
        "type": "influxdb",
        "uid": "${DS_INFLUXDB}"
      },
      "fieldConfig": {
        "defaults": {
          "unit": "mph",
          "decimals": 1,
          "color": {
            "mode": "fixed",
            "fixedColor": "orange"
          },
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {
                "color": "orange",
                "value": null
              }
            ]
          }
        }
      },
      "options": {
        "colorMode": "value",
        "graphMode": "none",
        "textMode": "value"
      },
      "targets": [
        {
          "query": "from(bucket: \"metrics\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r._measurement == \"vehicle_speed\")\n  |> filter(fn: (r) => r._field == \"speed_avg\")\n  |> group()\n  |> max()\n  |> set(key: \"_field\", value: \"max\")",
          "refId": "A",
          "datasource": {
            "type": "influxdb",
            "uid": "${DS_INFLUXDB}"
          }
        }
      ]
    },
    {
      "title": "Vehicle Speed (avg, min, max)",
      "type": "timeseries",
      "gridPos": {
        "x": 0,
        "y": 4,
        "w": 24,
        "h": 10
      },
      "fieldConfig": {
        "defaults": {
          "unit": "mph",
          "custom": {
            "lineWidth": 2,
            "pointSize": 3,
            "drawStyle": "line",
            "showPoints": "never",
            "spanNulls": true,
            "lineInterpolation": "smooth",
            "thresholdsStyle": {
              "mode": "area"
            }
          },
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {
                "color": "transparent",
                "value": null
              },
              {
                "color": "rgba(255, 0, 0, 0.1)",
                "value": 25
              }
            ]
          }
        },
        "overrides": [
          {
            "matcher": {
              "id": "byName",
              "options": "max"
            },
            "properties": [
              {
                "id": "color",
                "value": {
                  "fixedColor": "red",
                  "mode": "fixed"
                }
              }
            ]
          },
          {
            "matcher": {
              "id": "byName",
              "options": "avg"
            },
            "properties": [
              {
                "id": "color",
                "value": {
                  "fixedColor": "green",
                  "mode": "fixed"
                }
              }
            ]
          },
          {
            "matcher": {
              "id": "byName",
              "options": "min"
            },
            "properties": [
              {
                "id": "color",
                "value": {
                  "fixedColor": "blue",
                  "mode": "fixed"
                }
              }
            ]
          },
          {
            "matcher": {
              "id": "byName",
              "options": "raw"
            },
            "properties": [
              {
                "id": "color",
                "value": {
                  "fixedColor": "rgba(255, 255, 255, 0.4)",
                  "mode": "fixed"
                }
              },
              {
                "id": "custom.drawStyle",
                "value": "points"
              },
              {
                "id": "custom.showPoints",
                "value": "always"
              },
              {
                "id": "custom.pointSize",
                "value": 3
              },
              {
                "id": "custom.lineWidth",
                "value": 0
              }
            ]
          }
        ]
      },
      "targets": [
        {
          "query": "from(bucket: \"metrics\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r._measurement == \"vehicle_speed\")\n  |> filter(fn: (r) => r._field == \"speed_avg\")\n  |> drop(columns: [\"track_id\", \"camera_id\", \"unit\"])\n  |> aggregateWindow(every: 15m, fn: max, createEmpty: false)\n  |> set(key: \"_field\", value: \"max\")",
          "refId": "A",
          "datasource": {
            "type": "influxdb",
            "uid": "${DS_INFLUXDB}"
          }
        },
        {
          "query": "from(bucket: \"metrics\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r._measurement == \"vehicle_speed\")\n  |> filter(fn: (r) => r._field == \"speed_avg\")\n  |> drop(columns: [\"track_id\", \"camera_id\", \"unit\"])\n  |> aggregateWindow(every: 15m, fn: mean, createEmpty: false)\n  |> set(key: \"_field\", value: \"avg\")",
          "refId": "B",
          "datasource": {
            "type": "influxdb",
            "uid": "${DS_INFLUXDB}"
          }
        },
        {
          "query": "from(bucket: \"metrics\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r._measurement == \"vehicle_speed\")\n  |> filter(fn: (r) => r._field == \"speed_avg\")\n  |> drop(columns: [\"track_id\", \"camera_id\", \"unit\"])\n  |> aggregateWindow(every: 15m, fn: min, createEmpty: false)\n  |> set(key: \"_field\", value: \"min\")",
          "refId": "C",
          "datasource": {
            "type": "influxdb",
            "uid": "${DS_INFLUXDB}"
          }
        },
        {
          "query": "from(bucket: \"metrics\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r._measurement == \"vehicle_speed\")\n  |> filter(fn: (r) => r._field == \"speed_avg\")\n  |> drop(columns: [\"track_id\", \"camera_id\", \"unit\"])\n  |> set(key: \"_field\", value: \"raw\")",
          "refId": "D",
          "datasource": {
            "type": "influxdb",
            "uid": "${DS_INFLUXDB}"
          }
        }
      ],
      "datasource": {
        "type": "influxdb",
        "uid": "${DS_INFLUXDB}"
      }
    },
    {
      "title": "Speed Distribution",
      "type": "histogram",
      "gridPos": {
        "x": 0,
        "y": 14,
        "w": 12,
        "h": 8
      },
      "fieldConfig": {
        "defaults": {
          "unit": "mph",
          "color": {
            "mode": "palette-classic"
          }
        }
      },
      "options": {
        "bucketSize": 5,
        "combine": false,
        "fillOpacity": 80,
        "legendPlacement": "bottom",
        "legend": {
          "displayMode": "hidden",
          "showLegend": false
        }
      },
      "targets": [
        {
          "query": "from(bucket: \"metrics\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r._measurement == \"vehicle_speed\")\n  |> filter(fn: (r) => r._field == \"speed_avg\")\n  |> drop(columns: [\"track_id\", \"camera_id\", \"unit\"])\n  |> group()",
          "refId": "A",
          "datasource": {
            "type": "influxdb",
            "uid": "${DS_INFLUXDB}"
          }
        }
      ],
      "datasource": {
        "type": "influxdb",
        "uid": "${DS_INFLUXDB}"
      }
    },
    {
      "title": "Detections",
      "type": "timeseries",
      "gridPos": {
        "x": 12,
        "y": 14,
        "w": 12,
        "h": 8
      },
      "fieldConfig": {
        "defaults": {
          "unit": "short",
          "custom": {
            "drawStyle": "line",
            "lineWidth": 2,
            "showPoints": "never",
            "spanNulls": true,
            "lineInterpolation": "smooth"
          },
          "color": {
            "fixedColor": "purple",
            "mode": "fixed"
          }
        }
      },
      "targets": [
        {
          "query": "from(bucket: \"metrics\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r._measurement == \"processing_summary\")\n  |> filter(fn: (r) => r._field == \"vehicle_count\")\n  |> drop(columns: [\"camera_id\"])\n  |> aggregateWindow(every: 15m, fn: count, createEmpty: false)",
          "refId": "A",
          "datasource": {
            "type": "influxdb",
            "uid": "${DS_INFLUXDB}"
          }
        }
      ],
      "datasource": {
        "type": "influxdb",
        "uid": "${DS_INFLUXDB}"
      },
      "options": {
        "legend": {
          "displayMode": "hidden",
          "showLegend": false
        }
      }
    },
    {
      "title": "Processing Time",
      "type": "timeseries",
      "gridPos": {
        "x": 0,
        "y": 22,
        "w": 12,
        "h": 8
      },
      "fieldConfig": {
        "defaults": {
          "unit": "s",
          "custom": {
            "drawStyle": "points",
            "pointSize": 5,
            "showPoints": "always"
          },
          "color": {
            "fixedColor": "orange",
            "mode": "fixed"
          }
        }
      },
      "targets": [
        {
          "query": "from(bucket: \"metrics\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r._measurement == \"processing_summary\")\n  |> filter(fn: (r) => r._field == \"processing_time_s\")\n  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)",
          "refId": "A",
          "datasource": {
            "type": "influxdb",
            "uid": "${DS_INFLUXDB}"
          }
        }
      ],
      "datasource": {
        "type": "influxdb",
        "uid": "${DS_INFLUXDB}"
      },
      "options": {
        "legend": {
          "displayMode": "hidden",
          "showLegend": false
        }
      }
    },
    {
      "title": "Detection Confidence",
      "type": "timeseries",
      "gridPos": {
        "x": 12,
        "y": 22,
        "w": 12,
        "h": 8
      },
      "fieldConfig": {
        "defaults": {
          "unit": "percentunit",
          "min": 0,
          "max": 1,
          "custom": {
            "drawStyle": "points",
            "pointSize": 4,
            "showPoints": "always"
          },
          "color": {
            "fixedColor": "yellow",
            "mode": "fixed"
          }
        }
      },
      "targets": [
        {
          "query": "from(bucket: \"metrics\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r._measurement == \"vehicle_speed\")\n  |> filter(fn: (r) => r._field == \"detection_confidence\")\n  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)",
          "refId": "A",
          "datasource": {
            "type": "influxdb",
            "uid": "${DS_INFLUXDB}"
          }
        }
      ],
      "datasource": {
        "type": "influxdb",
        "uid": "${DS_INFLUXDB}"
      },
      "options": {
        "legend": {
          "displayMode": "hidden",
          "showLegend": false
        }
      }
    },
    {
      "title": "Requests / sec",
      "type": "timeseries",
      "gridPos": {
        "x": 0,
        "y": 30,
        "w": 12,
        "h": 8
      },
      "fieldConfig": {
        "defaults": {
          "unit": "reqps",
          "custom": {
            "drawStyle": "line",
            "lineWidth": 2,
            "showPoints": "never",
            "spanNulls": true,
            "lineInterpolation": "smooth",
            "stacking": {
              "mode": "none"
            }
          }
        }
      },
      "targets": [
        {
          "query": "from(bucket: \"metrics\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r._measurement == \"http_request\")\n  |> filter(fn: (r) => r._field == \"count\")\n  |> drop(columns: [\"method\", \"path\", \"status\"])\n  |> aggregateWindow(every: 1m, fn: sum, createEmpty: false)\n  |> map(fn: (r) => ({r with _value: float(v: r._value) / 60.0}))",
          "refId": "A",
          "datasource": {
            "type": "influxdb",
            "uid": "${DS_INFLUXDB}"
          }
        }
      ],
      "datasource": {
        "type": "influxdb",
        "uid": "${DS_INFLUXDB}"
      },
      "options": {
        "legend": {
          "displayMode": "hidden",
          "showLegend": false
        }
      }
    },
    {
      "title": "HTTP Request Duration",
      "type": "timeseries",
      "gridPos": {
        "x": 12,
        "y": 30,
        "w": 12,
        "h": 8
      },
      "fieldConfig": {
        "defaults": {
          "unit": "s",
          "custom": {
            "drawStyle": "line",
            "lineWidth": 2,
            "showPoints": "never",
            "spanNulls": true,
            "lineInterpolation": "smooth"
          }
        }
      },
      "targets": [
        {
          "query": "from(bucket: \"metrics\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r._measurement == \"http_request\")\n  |> filter(fn: (r) => r._field == \"duration_s\")\n  |> drop(columns: [\"method\", \"path\", \"status\"])\n  |> aggregateWindow(every: 1m, fn: mean, createEmpty: false)",
          "refId": "A",
          "datasource": {
            "type": "influxdb",
            "uid": "${DS_INFLUXDB}"
          }
        }
      ],
      "datasource": {
        "type": "influxdb",
        "uid": "${DS_INFLUXDB}"
      },
      "options": {
        "legend": {
          "displayMode": "hidden",
          "showLegend": false
        }
      }
    }
  ],
  "schemaVersion": 39,
  "version": 0,
  "id": null
}