flutterfungus wooo
This commit is contained in:
@@ -0,0 +1,7 @@
|
|||||||
|
old
|
||||||
|
*.bak*
|
||||||
|
scratch.*
|
||||||
|
chrony_statistics.log
|
||||||
|
conf-*
|
||||||
|
log_backup_*
|
||||||
|
influxdata-archive.key
|
||||||
@@ -0,0 +1,542 @@
|
|||||||
|
{
|
||||||
|
"annotations": {
|
||||||
|
"list": [
|
||||||
|
{
|
||||||
|
"builtIn": 1,
|
||||||
|
"datasource": {
|
||||||
|
"type": "grafana",
|
||||||
|
"uid": "-- Grafana --"
|
||||||
|
},
|
||||||
|
"enable": true,
|
||||||
|
"hide": true,
|
||||||
|
"iconColor": "rgba(0, 211, 255, 1)",
|
||||||
|
"name": "Annotations & Alerts",
|
||||||
|
"type": "dashboard"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"editable": true,
|
||||||
|
"fiscalYearStartMonth": 0,
|
||||||
|
"graphTooltip": 0,
|
||||||
|
"id": 1,
|
||||||
|
"links": [],
|
||||||
|
"panels": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "influxdb",
|
||||||
|
"uid": "cenh879ru0gzkc"
|
||||||
|
},
|
||||||
|
"description": "Long term average of time offset",
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "palette-classic-by-name"
|
||||||
|
},
|
||||||
|
"custom": {
|
||||||
|
"axisBorderShow": false,
|
||||||
|
"axisCenteredZero": false,
|
||||||
|
"axisColorMode": "text",
|
||||||
|
"axisLabel": "",
|
||||||
|
"axisPlacement": "auto",
|
||||||
|
"barAlignment": 0,
|
||||||
|
"barWidthFactor": 0.6,
|
||||||
|
"drawStyle": "line",
|
||||||
|
"fillOpacity": 0,
|
||||||
|
"gradientMode": "none",
|
||||||
|
"hideFrom": {
|
||||||
|
"legend": false,
|
||||||
|
"tooltip": false,
|
||||||
|
"viz": false
|
||||||
|
},
|
||||||
|
"insertNulls": false,
|
||||||
|
"lineInterpolation": "linear",
|
||||||
|
"lineWidth": 1,
|
||||||
|
"pointSize": 5,
|
||||||
|
"scaleDistribution": {
|
||||||
|
"type": "linear"
|
||||||
|
},
|
||||||
|
"showPoints": "auto",
|
||||||
|
"spanNulls": false,
|
||||||
|
"stacking": {
|
||||||
|
"group": "A",
|
||||||
|
"mode": "none"
|
||||||
|
},
|
||||||
|
"thresholdsStyle": {
|
||||||
|
"mode": "off"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"displayName": "RMS Offset (Seconds)",
|
||||||
|
"mappings": [],
|
||||||
|
"thresholds": {
|
||||||
|
"mode": "absolute",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"color": "green"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "red",
|
||||||
|
"value": 80
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"unit": "s"
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 8,
|
||||||
|
"w": 12,
|
||||||
|
"x": 0,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
"id": 5,
|
||||||
|
"options": {
|
||||||
|
"legend": {
|
||||||
|
"calcs": [],
|
||||||
|
"displayMode": "list",
|
||||||
|
"placement": "bottom",
|
||||||
|
"showLegend": true
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"hideZeros": false,
|
||||||
|
"mode": "single",
|
||||||
|
"sort": "none"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pluginVersion": "12.0.1",
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "influxdb",
|
||||||
|
"uid": "cenh879ru0gzkc"
|
||||||
|
},
|
||||||
|
"groupBy": [
|
||||||
|
{
|
||||||
|
"params": [
|
||||||
|
"1m"
|
||||||
|
],
|
||||||
|
"type": "time"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"params": [
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"type": "fill"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"hide": false,
|
||||||
|
"measurement": "chrony",
|
||||||
|
"orderByTime": "ASC",
|
||||||
|
"policy": "autogen",
|
||||||
|
"refId": "A",
|
||||||
|
"resultFormat": "time_series",
|
||||||
|
"select": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"params": [
|
||||||
|
"rms_offset"
|
||||||
|
],
|
||||||
|
"type": "field"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"params": [],
|
||||||
|
"type": "mean"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "RMS Offset",
|
||||||
|
"type": "timeseries"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "influxdb",
|
||||||
|
"uid": "cenh879ru0gzkc"
|
||||||
|
},
|
||||||
|
"description": "Average chrony time offset over last minute in seconds",
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "palette-classic-by-name"
|
||||||
|
},
|
||||||
|
"custom": {
|
||||||
|
"axisBorderShow": false,
|
||||||
|
"axisCenteredZero": false,
|
||||||
|
"axisColorMode": "text",
|
||||||
|
"axisLabel": "",
|
||||||
|
"axisPlacement": "auto",
|
||||||
|
"barAlignment": 0,
|
||||||
|
"barWidthFactor": 0.6,
|
||||||
|
"drawStyle": "line",
|
||||||
|
"fillOpacity": 0,
|
||||||
|
"gradientMode": "none",
|
||||||
|
"hideFrom": {
|
||||||
|
"legend": false,
|
||||||
|
"tooltip": false,
|
||||||
|
"viz": false
|
||||||
|
},
|
||||||
|
"insertNulls": false,
|
||||||
|
"lineInterpolation": "linear",
|
||||||
|
"lineWidth": 1,
|
||||||
|
"pointSize": 5,
|
||||||
|
"scaleDistribution": {
|
||||||
|
"type": "linear"
|
||||||
|
},
|
||||||
|
"showPoints": "auto",
|
||||||
|
"spanNulls": false,
|
||||||
|
"stacking": {
|
||||||
|
"group": "A",
|
||||||
|
"mode": "none"
|
||||||
|
},
|
||||||
|
"thresholdsStyle": {
|
||||||
|
"mode": "off"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"displayName": "Offset (S)",
|
||||||
|
"mappings": [],
|
||||||
|
"thresholds": {
|
||||||
|
"mode": "absolute",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"color": "green"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "red",
|
||||||
|
"value": 80
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"unit": "s"
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 8,
|
||||||
|
"w": 12,
|
||||||
|
"x": 0,
|
||||||
|
"y": 8
|
||||||
|
},
|
||||||
|
"id": 3,
|
||||||
|
"options": {
|
||||||
|
"legend": {
|
||||||
|
"calcs": [],
|
||||||
|
"displayMode": "list",
|
||||||
|
"placement": "bottom",
|
||||||
|
"showLegend": true
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"hideZeros": false,
|
||||||
|
"mode": "single",
|
||||||
|
"sort": "none"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pluginVersion": "12.0.1",
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"groupBy": [
|
||||||
|
{
|
||||||
|
"params": [
|
||||||
|
"1m"
|
||||||
|
],
|
||||||
|
"type": "time"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"params": [
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"type": "fill"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"measurement": "chrony",
|
||||||
|
"orderByTime": "ASC",
|
||||||
|
"policy": "autogen",
|
||||||
|
"refId": "A",
|
||||||
|
"resultFormat": "time_series",
|
||||||
|
"select": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"params": [
|
||||||
|
"last_offset"
|
||||||
|
],
|
||||||
|
"type": "field"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"params": [],
|
||||||
|
"type": "mean"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Last Time Offset (Seconds)",
|
||||||
|
"type": "timeseries"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "influxdb",
|
||||||
|
"uid": "cenh879ru0gzkc"
|
||||||
|
},
|
||||||
|
"description": "Chrony frequency offset over last minute in PPM",
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "palette-classic-by-name"
|
||||||
|
},
|
||||||
|
"custom": {
|
||||||
|
"axisBorderShow": false,
|
||||||
|
"axisCenteredZero": false,
|
||||||
|
"axisColorMode": "text",
|
||||||
|
"axisLabel": "",
|
||||||
|
"axisPlacement": "auto",
|
||||||
|
"barAlignment": 0,
|
||||||
|
"barWidthFactor": 0.6,
|
||||||
|
"drawStyle": "line",
|
||||||
|
"fillOpacity": 0,
|
||||||
|
"gradientMode": "none",
|
||||||
|
"hideFrom": {
|
||||||
|
"legend": false,
|
||||||
|
"tooltip": false,
|
||||||
|
"viz": false
|
||||||
|
},
|
||||||
|
"insertNulls": false,
|
||||||
|
"lineInterpolation": "linear",
|
||||||
|
"lineWidth": 1,
|
||||||
|
"pointSize": 5,
|
||||||
|
"scaleDistribution": {
|
||||||
|
"type": "linear"
|
||||||
|
},
|
||||||
|
"showPoints": "auto",
|
||||||
|
"spanNulls": false,
|
||||||
|
"stacking": {
|
||||||
|
"group": "A",
|
||||||
|
"mode": "none"
|
||||||
|
},
|
||||||
|
"thresholdsStyle": {
|
||||||
|
"mode": "off"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"displayName": "Frequency Offset (PPM)",
|
||||||
|
"mappings": [],
|
||||||
|
"thresholds": {
|
||||||
|
"mode": "absolute",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"color": "green"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "red",
|
||||||
|
"value": 80
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"unit": "ppm"
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 8,
|
||||||
|
"w": 12,
|
||||||
|
"x": 0,
|
||||||
|
"y": 16
|
||||||
|
},
|
||||||
|
"id": 4,
|
||||||
|
"options": {
|
||||||
|
"legend": {
|
||||||
|
"calcs": [],
|
||||||
|
"displayMode": "list",
|
||||||
|
"placement": "bottom",
|
||||||
|
"showLegend": true
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"hideZeros": false,
|
||||||
|
"mode": "single",
|
||||||
|
"sort": "none"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pluginVersion": "12.0.1",
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"groupBy": [
|
||||||
|
{
|
||||||
|
"params": [
|
||||||
|
"1m"
|
||||||
|
],
|
||||||
|
"type": "time"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"params": [
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"type": "fill"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"measurement": "chrony",
|
||||||
|
"orderByTime": "ASC",
|
||||||
|
"policy": "autogen",
|
||||||
|
"refId": "A",
|
||||||
|
"resultFormat": "time_series",
|
||||||
|
"select": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"params": [
|
||||||
|
"frequency"
|
||||||
|
],
|
||||||
|
"type": "field"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"params": [],
|
||||||
|
"type": "mean"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Frequency Offset (PPM)",
|
||||||
|
"type": "timeseries"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "influxdb",
|
||||||
|
"uid": "cenh879ru0gzkc"
|
||||||
|
},
|
||||||
|
"description": "Average chrony skew over past minute",
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "palette-classic-by-name"
|
||||||
|
},
|
||||||
|
"custom": {
|
||||||
|
"axisBorderShow": false,
|
||||||
|
"axisCenteredZero": false,
|
||||||
|
"axisColorMode": "text",
|
||||||
|
"axisLabel": "",
|
||||||
|
"axisPlacement": "auto",
|
||||||
|
"barAlignment": 0,
|
||||||
|
"barWidthFactor": 0.6,
|
||||||
|
"drawStyle": "line",
|
||||||
|
"fillOpacity": 0,
|
||||||
|
"gradientMode": "none",
|
||||||
|
"hideFrom": {
|
||||||
|
"legend": false,
|
||||||
|
"tooltip": false,
|
||||||
|
"viz": false
|
||||||
|
},
|
||||||
|
"insertNulls": false,
|
||||||
|
"lineInterpolation": "linear",
|
||||||
|
"lineWidth": 1,
|
||||||
|
"pointSize": 5,
|
||||||
|
"scaleDistribution": {
|
||||||
|
"type": "linear"
|
||||||
|
},
|
||||||
|
"showPoints": "auto",
|
||||||
|
"spanNulls": false,
|
||||||
|
"stacking": {
|
||||||
|
"group": "A",
|
||||||
|
"mode": "none"
|
||||||
|
},
|
||||||
|
"thresholdsStyle": {
|
||||||
|
"mode": "off"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"displayName": "Skew (PPM)",
|
||||||
|
"mappings": [],
|
||||||
|
"thresholds": {
|
||||||
|
"mode": "absolute",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"color": "green"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "red",
|
||||||
|
"value": 80
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"unit": "ppm"
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 8,
|
||||||
|
"w": 12,
|
||||||
|
"x": 0,
|
||||||
|
"y": 24
|
||||||
|
},
|
||||||
|
"id": 2,
|
||||||
|
"options": {
|
||||||
|
"legend": {
|
||||||
|
"calcs": [],
|
||||||
|
"displayMode": "list",
|
||||||
|
"placement": "bottom",
|
||||||
|
"showLegend": true
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"hideZeros": false,
|
||||||
|
"mode": "single",
|
||||||
|
"sort": "none"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pluginVersion": "12.0.1",
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"groupBy": [
|
||||||
|
{
|
||||||
|
"params": [
|
||||||
|
"1m"
|
||||||
|
],
|
||||||
|
"type": "time"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"params": [
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"type": "fill"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"measurement": "chrony",
|
||||||
|
"orderByTime": "ASC",
|
||||||
|
"policy": "autogen",
|
||||||
|
"refId": "A",
|
||||||
|
"resultFormat": "time_series",
|
||||||
|
"select": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"params": [
|
||||||
|
"skew"
|
||||||
|
],
|
||||||
|
"type": "field"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"params": [],
|
||||||
|
"type": "mean"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Frequency Skew (PPM)",
|
||||||
|
"type": "timeseries"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"preload": false,
|
||||||
|
"refresh": "auto",
|
||||||
|
"schemaVersion": 41,
|
||||||
|
"tags": [],
|
||||||
|
"templating": {
|
||||||
|
"list": []
|
||||||
|
},
|
||||||
|
"time": {
|
||||||
|
"from": "now-3h",
|
||||||
|
"to": "now"
|
||||||
|
},
|
||||||
|
"timepicker": {},
|
||||||
|
"timezone": "browser",
|
||||||
|
"title": "Chrony",
|
||||||
|
"uid": "69a006d6-ccaa-4e9e-a8ec-6dba0b30fa1e",
|
||||||
|
"version": 21
|
||||||
|
}
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
# Precision Timekeeping Fuckery
|
||||||
|
|
||||||
|
## How it works
|
||||||
|
### Services
|
||||||
|
* `gpsd`
|
||||||
|
* `chrony`
|
||||||
|
* `telegraf`
|
||||||
|
* `influxdb`
|
||||||
|
* `grafana-server`
|
||||||
|
* `syslog-ng`
|
||||||
|
|
||||||
|
### Testing
|
||||||
|
**Status (Everything)**
|
||||||
|
* `bash ~/Precision-Timekeeping-Fuckery/full_status.sh`
|
||||||
|
|
||||||
|
**Status (Services)**
|
||||||
|
* `bash ~/Precision-Timekeeping-Fuckert/status_services.sh`
|
||||||
|
|
||||||
|
**Test PPS**
|
||||||
|
* `sudo ppstest /dev/pps0`
|
||||||
|
|
||||||
|
|
||||||
|
### Logs Stuff
|
||||||
|
**Chrony Logs**
|
||||||
|
* `sudo tail -f /var/log/chrony/tracking.log`
|
||||||
|
* `sudo tail -f /var/log/chrony/statistics.log`
|
||||||
|
* `sudo tail -f /var/log/chrony/measurements.log`
|
||||||
|
|
||||||
|
**Telegraf Logs**
|
||||||
|
* `sudo tail -f /var/log/telegraf/telegraf.log`
|
||||||
|
|
||||||
|
**Grafana Logs**
|
||||||
|
* `sudo tail -f /var/log/grafana/grafana.log`
|
||||||
|
|
||||||
|
**Influxdb Logs**
|
||||||
|
* `sudo tail -f /var/log/syslog`
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
### Requirements
|
||||||
|
1. Raspberry Pi with
|
||||||
|
1. Raspberry Pi OS Installed
|
||||||
|
2. SSH Access
|
||||||
|
3. sudo permissions
|
||||||
|
2. A timing specific GPS module, wired to the Raspberry Pi GPIOs:
|
||||||
|
1. GPS GND to RPi pin 6
|
||||||
|
2. GPS VIN to RPi pin 2 or 4
|
||||||
|
3. GPS PPS to RPi pin 12 (GPIO 18)
|
||||||
|
4. GPS RX to RPi pin 8
|
||||||
|
5. GPS TX to RPi pin 10
|
||||||
|
|
||||||
|
### Install
|
||||||
|
Clone the repo
|
||||||
|
`git clone https://github.com/PrincessPi3/Precision-Timekeeping-Fuckery.git ~/Precision-Timekeping-Fuckery`
|
||||||
|
|
||||||
|
Run raspi-config
|
||||||
|
1. Interface Options->Serial Port
|
||||||
|
1. Would you like a login shell to be accessible over serial? **<No>**
|
||||||
|
2. Would you like the serial port hardware to be enabled? **<Yes>**
|
||||||
|
2. Advanced Options
|
||||||
|
1. A1 Expand Filesystem
|
||||||
|
|
||||||
|
update os and packages (will reboot when finished)
|
||||||
|
`bash ~/Precision-Timekeeping-Fuckery/update.sh`
|
||||||
|
|
||||||
|
install packages (will reboot when finished)
|
||||||
|
`bash ~/Precision-Timekeeping-Fuckery/packages.sh`
|
||||||
|
|
||||||
|
finish install (will reboot when finished)
|
||||||
|
`bash ~/Precision-Timekeeping-Fuckery/installer.sh`
|
||||||
|
|
||||||
|
check status of everything
|
||||||
|
`bash ~/Precision-Timekeeping-Fuckery/full_status.sh`
|
||||||
|
|
||||||
|
navigate to `http://<ip's ip>:3000`
|
||||||
|
Upload ~/Garfana-Visualization.json to create dashboard
|
||||||
|
|
||||||
|
### Clients
|
||||||
|
**Windows**
|
||||||
|
1. Open the Control Panel and navigate to the Date and Time settings.
|
||||||
|
2. Click on "Internet Time" and then "Change settings".
|
||||||
|
3. Enable the option to "Synchronize with an Internet time server".
|
||||||
|
4. Choose a time server from the available list or enter a custom one.
|
||||||
|
5. Click "OK" to save the changes.
|
||||||
|
|
||||||
|
## Links
|
||||||
|
**Helpful Guide** https://austinsnerdythings.com/2025/02/14/revisiting-microsecond-accurate-ntp-for-raspberry-pi-with-gps-pps-in-2025/
|
||||||
|
|
||||||
|
**Current Module**
|
||||||
|
* Chipset https://www.u-blox.com/en/product/neo-f10n-module
|
||||||
|
* Breakout https://docs.sparkfun.com/SparkFun_u-blox_NEO-F10N/single_page/
|
||||||
|
|
||||||
|
**Next Module**
|
||||||
|
* Chipset https://www.u-blox.com/en/product/neolea-m8t-series
|
||||||
|
* Breakout https://www.ebay.com/itm/134243322249
|
||||||
|
|
||||||
|
**U-Blox Software (U-Center)** https://www.u-blox.com/en/product/u-center
|
||||||
|
|
||||||
|
|
||||||
|
**todo**
|
||||||
|
* x ntp server
|
||||||
|
* outside dial in
|
||||||
|
* cloudflare tunnel?
|
||||||
|
* change gps settings
|
||||||
|
* higher baudrate
|
||||||
|
1. 230400
|
||||||
|
2. 460800
|
||||||
|
3. 921600
|
||||||
|
* uninstall desktop/etc
|
||||||
|
* change boot target to cli
|
||||||
|
* README
|
||||||
|
* installer1-4.sh
|
||||||
|
* grafana
|
||||||
|
* url
|
||||||
|
* default login
|
||||||
|
* import
|
||||||
|
* data source
|
||||||
|
* fix
|
||||||
|
|
||||||
|
**known bugs**
|
||||||
|
doubling of appending to /boot/firmaware/config.txt and /etc/modules when running intstaller3.sh
|
||||||
|
|
||||||
|
notes:
|
||||||
|
reboots
|
||||||
|
grafana
|
||||||
|
connections->data sources
|
||||||
|
add influxdb
|
||||||
|
new dashboard
|
||||||
|
import
|
||||||
|
edit each panel and select influxdb as data source if issues
|
||||||
|
doubling of appending to /boot/firmaware/config.txt and /etc/modules
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
# stolen from https://austinsnerdythings.com/2025/02/14/revisiting-microsecond-accurate-ntp-for-raspberry-pi-with-gps-pps-in-2025/
|
||||||
|
import pandas as pd
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
def parse_chrony_stats(file_path):
|
||||||
|
"""
|
||||||
|
Parse chrony statistics log file and return a pandas DataFrame
|
||||||
|
"""
|
||||||
|
# read file contents first
|
||||||
|
with open(file_path, 'r') as f:
|
||||||
|
file_contents = f.readlines()
|
||||||
|
|
||||||
|
# for each line, if it starts with '=' or ' ', skip it
|
||||||
|
file_contents = [line for line in file_contents if not line.startswith('=') and not line.startswith(' ')]
|
||||||
|
|
||||||
|
# exclude lines that include 'PPS'
|
||||||
|
file_contents = [line for line in file_contents if 'PPS' not in line]
|
||||||
|
|
||||||
|
# Use StringIO to create a file-like object from the filtered contents
|
||||||
|
from io import StringIO
|
||||||
|
csv_data = StringIO(''.join(file_contents))
|
||||||
|
|
||||||
|
# Read the filtered data using pandas
|
||||||
|
df = pd.read_csv(csv_data,
|
||||||
|
delim_whitespace=True,
|
||||||
|
names=['Date', 'Time', 'IP_Address', 'Std_dev', 'Est_offset', 'Offset_sd',
|
||||||
|
'Diff_freq', 'Est_skew', 'Stress', 'Ns', 'Bs', 'Nr', 'Asym'])
|
||||||
|
|
||||||
|
|
||||||
|
# Combine Date and Time columns into a datetime column
|
||||||
|
df['timestamp'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])
|
||||||
|
|
||||||
|
return df
|
||||||
|
|
||||||
|
def plot_est_offset(df):
|
||||||
|
"""
|
||||||
|
Create a plot of Est_offset vs time for each IP address
|
||||||
|
"""
|
||||||
|
plt.figure(figsize=(12, 6))
|
||||||
|
|
||||||
|
# Plot each IP address as a separate series
|
||||||
|
for ip in df['IP_Address'].unique():
|
||||||
|
ip_data = df[df['IP_Address'] == ip]
|
||||||
|
plt.plot(ip_data['timestamp'], ip_data['Est_offset'],
|
||||||
|
marker='o', label=ip, linestyle='-', markersize=4)
|
||||||
|
|
||||||
|
plt.xlabel('Time')
|
||||||
|
plt.ylabel('Estimated Offset (seconds)')
|
||||||
|
plt.title('Chrony Estimated Offset Over Time by IP Address')
|
||||||
|
plt.legend()
|
||||||
|
plt.grid(True)
|
||||||
|
|
||||||
|
# Rotate x-axis labels for better readability
|
||||||
|
plt.xticks(rotation=45)
|
||||||
|
|
||||||
|
# Adjust layout to prevent label cutoff
|
||||||
|
plt.tight_layout()
|
||||||
|
|
||||||
|
return plt
|
||||||
|
|
||||||
|
def analyze_chrony_stats(file_path):
|
||||||
|
"""
|
||||||
|
Main function to analyze chrony statistics
|
||||||
|
"""
|
||||||
|
# Parse the data
|
||||||
|
df = parse_chrony_stats(file_path)
|
||||||
|
|
||||||
|
# Create summary statistics
|
||||||
|
summary = {
|
||||||
|
'IP Addresses': df['IP_Address'].nunique(),
|
||||||
|
'Time Range': f"{df['timestamp'].min()} to {df['timestamp'].max()}",
|
||||||
|
'Average Est Offset by IP': df.groupby('IP_Address')['Est_offset'].mean().to_dict(),
|
||||||
|
'Max Est Offset by IP': df.groupby('IP_Address')['Est_offset'].max().to_dict(),
|
||||||
|
'Min Est Offset by IP': df.groupby('IP_Address')['Est_offset'].min().to_dict(),
|
||||||
|
'Median Est Offset by IP': df.groupby('IP_Address')['Est_offset'].median().to_dict()
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create the plot
|
||||||
|
plot = plot_est_offset(df)
|
||||||
|
|
||||||
|
return df, summary, plot
|
||||||
|
|
||||||
|
# Example usage
|
||||||
|
if __name__ == "__main__":
|
||||||
|
file_path = "chrony_statistics.log" # Replace with your file path
|
||||||
|
df, summary, plot = analyze_chrony_stats(file_path)
|
||||||
|
|
||||||
|
# Print summary statistics
|
||||||
|
print("\nChrony Statistics Summary:")
|
||||||
|
print("-" * 30)
|
||||||
|
print(f"Number of IP Addresses: {summary['IP Addresses']}")
|
||||||
|
print(f"Time Range: {summary['Time Range']}")
|
||||||
|
print("\nAverage Estimated Offset by IP:")
|
||||||
|
for ip, avg in summary['Average Est Offset by IP'].items():
|
||||||
|
print(f"{ip}: {avg:.2e}")
|
||||||
|
|
||||||
|
print("\nMedian Estimated Offset by IP:")
|
||||||
|
for ip, median in summary['Median Est Offset by IP'].items():
|
||||||
|
print(f"{ip}: {median:.2e}")
|
||||||
|
|
||||||
|
# Show the plot
|
||||||
|
plt.show()
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
numlogs=500
|
||||||
|
tmp_log="./chrony_statistics.log"
|
||||||
|
|
||||||
|
sudo tail -n $numlogs /var/log/chrony/statistics.log > $tmp_log
|
||||||
|
sudo chown $USER:$USER $tmp_log
|
||||||
|
echo "$(wc -l $tmp_log) logs entered"
|
||||||
|
python chrony_statistics.py
|
||||||
|
rm -f $tmp_log
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [ -z $SUDO_USER ]; then
|
||||||
|
username=$SUDO_USER
|
||||||
|
else
|
||||||
|
username=$USER
|
||||||
|
fi
|
||||||
|
|
||||||
|
dname=./conf-$(date +%s)
|
||||||
|
mkdir $dname
|
||||||
|
|
||||||
|
sudo cp /etc/default/gpsd $dname/gpsd
|
||||||
|
sudo cp /etc/chrony/chrony.conf $dname/chrony.conf
|
||||||
|
sudo cp /etc/grafana/grafana.ini $dname/grafana.ini
|
||||||
|
sudo cp /etc/influxdb/influxdb.conf $dname/influxdb.conf
|
||||||
|
sudo cp /etc/telegraf/telegraf.conf $dname/telegraf.conf
|
||||||
|
sudo cp /etc/udev/rules.d/50-tty.rules $dname/50-tty.rules
|
||||||
|
|
||||||
|
sudo chown -R $username:$username $dname
|
||||||
|
sudo chmod 775 $dname
|
||||||
|
sudo chmod 664 $dname/*
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# status of services
|
||||||
|
bash ./status_services
|
||||||
|
|
||||||
|
# test pps
|
||||||
|
echo "Testing PPS"
|
||||||
|
sudo ppstest /dev/pps0
|
||||||
|
|
||||||
|
# check gps
|
||||||
|
echo "Checking Normal GPS"
|
||||||
|
cgps
|
||||||
|
|
||||||
|
# check gpsmon
|
||||||
|
echo "Checking Timekeeping GPS"
|
||||||
|
gpsmon
|
||||||
|
|
||||||
|
# chek chrony sources
|
||||||
|
# chronyc sources
|
||||||
|
|
||||||
|
# do same with watch
|
||||||
|
echo "Watching chronyc sources"
|
||||||
|
watch chronyc sources
|
||||||
|
|
||||||
|
# track
|
||||||
|
echo "Watching chronyc tracking"
|
||||||
|
watch -n 10 chronyc tracking
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# updoot this
|
||||||
|
git pull
|
||||||
|
|
||||||
|
# updoot
|
||||||
|
sudo apt update
|
||||||
|
sudo apt dist-upgrade -y
|
||||||
|
sudo apt autoremove
|
||||||
|
|
||||||
|
sudo shutdown -r +1
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# sudo apt update
|
||||||
|
|
||||||
|
# change boot target to cli before deleting desktop environ
|
||||||
|
# sudo systemctl set-default multi-user.target
|
||||||
|
|
||||||
|
# nuke old packages
|
||||||
|
# sudo apt purge cups cups-browsed pulseaudio* bluetooth libgl* xserver* lightdm* raspberrypi-ui-mods vlc* lxde* chromium* desktop* gnome* gstreamer* gtk* hicolor-icon-theme* lx* mesa* -y
|
||||||
|
|
||||||
|
# sudo apt dist-upgrade -y
|
||||||
|
|
||||||
|
# install packages
|
||||||
|
sudo apt install influxdb pps-tools gpsd gpsd-clients chrony syslog-ng -y
|
||||||
|
|
||||||
|
# grafana repo and install
|
||||||
|
sudo mkdir -p /etc/apt/keyrings/
|
||||||
|
wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null
|
||||||
|
echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
|
||||||
|
|
||||||
|
# telegraf repo and install
|
||||||
|
curl --silent --location -O \
|
||||||
|
https://repos.influxdata.com/influxdata-archive.key \
|
||||||
|
&& echo "943666881a1b8d9b849b74caebf02d3465d6beb716510d86a39f6c8e8dac7515 influxdata-archive.key" \
|
||||||
|
| sha256sum -c - && cat influxdata-archive.key \
|
||||||
|
| gpg --dearmor \
|
||||||
|
| sudo tee /etc/apt/trusted.gpg.d/influxdata-archive.gpg > /dev/null \
|
||||||
|
&& echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive.gpg] https://repos.influxdata.com/debian stable main' \
|
||||||
|
| sudo tee /etc/apt/sources.list.d/influxdata.list
|
||||||
|
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install telegraf grafana -y
|
||||||
|
|
||||||
|
sudo apt autoremove # cleanup
|
||||||
|
|
||||||
|
sudo reboot
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e # die on any error
|
||||||
|
|
||||||
|
# configure the overlay
|
||||||
|
echo "Adding lines to /boot/firmware/config.txt to enable pps and gpio uart"
|
||||||
|
sudo bash -c "echo '# the next 3 lines are for GPS PPS signals' >> /boot/firmware/config.txt"
|
||||||
|
sudo bash -c "echo 'dtoverlay=pps-gpio,gpiopin=18' >> /boot/firmware/config.txt"
|
||||||
|
sudo bash -c "echo 'enable_uart=1' >> /boot/firmware/config.txt"
|
||||||
|
sudo bash -c "echo 'init_uart_baud=115200' >> /boot/firmware/config.txt" # set baudrate here too
|
||||||
|
|
||||||
|
# add pps-gpio to modules
|
||||||
|
echo "Adding pps-gpio to modules"
|
||||||
|
sudo bash -c "echo 'pps-gpio' >> /etc/modules"
|
||||||
|
|
||||||
|
sudo shutdown -r +1
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
if [ ! -z $SUDO_USER ]; then
|
||||||
|
username=$SUDO_USER
|
||||||
|
else
|
||||||
|
username=$USER
|
||||||
|
fi
|
||||||
|
|
||||||
|
# handle users serial shit
|
||||||
|
## self
|
||||||
|
echo "Giving your user the right permissions"
|
||||||
|
sudo usermod -aG tty $username
|
||||||
|
sudo usermod -aG root $username
|
||||||
|
sudo usermod -aG dialout $username
|
||||||
|
sudo usermod -aG plugdev $username
|
||||||
|
## service users
|
||||||
|
echo "Giving service users the right permissions"
|
||||||
|
sudo usermod -aG dialout gpsd
|
||||||
|
sudo usermod -aG dialout _chrony
|
||||||
|
|
||||||
|
# reconfigure to normal mode
|
||||||
|
echo "Starting configure script"
|
||||||
|
bash ./reconfig_full.sh ./working-normal-level-conf
|
||||||
|
|
||||||
|
# enable services
|
||||||
|
echo "Enabling Services"
|
||||||
|
sudo systemctl enable gpsd
|
||||||
|
sudo systemctl enable chrony
|
||||||
|
sudo systemctl enable influxdb
|
||||||
|
sudo systemctl enable telegraf
|
||||||
|
sudo systemctl enable grafana-server
|
||||||
|
sudo systemctl enable syslog-ng
|
||||||
|
|
||||||
|
# reboot rq
|
||||||
|
echo "Rebooting in one minute"
|
||||||
|
sudo shutdown -r +1
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e # die on any error
|
||||||
|
|
||||||
|
# log locations
|
||||||
|
chrony_tracking=/var/log/chrony/tracking.log
|
||||||
|
chrony_statistics=/var/log/chrony/statistics.log
|
||||||
|
chrony_measurements=/var/log/chrony/measurements.log
|
||||||
|
telegraf=/var/log/telegraf/telegraf.log
|
||||||
|
grafana=/var/log/grafana/grafana.log
|
||||||
|
syslog=/var/log/syslog
|
||||||
|
|
||||||
|
function backup_logs() {
|
||||||
|
# make log backup dir with unix timestamp
|
||||||
|
dname="./log_backup_$(date +%s)"
|
||||||
|
mkdir $dname
|
||||||
|
|
||||||
|
# copy em
|
||||||
|
sudo cp $chrony_tracking $dname/chrony_tracking.log
|
||||||
|
sudo cp $chrony_statistics $dname/chrony_statistics.log
|
||||||
|
sudo cp $chrony_measurements $dname/chrony_measurements.log
|
||||||
|
sudo cp $telegraf $dname/telegraf.log
|
||||||
|
sudo cp $grafana $dnamme/grafana.log
|
||||||
|
sudo cp $syslog $dname/syslog
|
||||||
|
|
||||||
|
# fix permissions
|
||||||
|
sudo chown -R $USER:$USER $dname
|
||||||
|
chmod 775 $dname
|
||||||
|
chmod 664 $dname/*
|
||||||
|
|
||||||
|
# compress logs
|
||||||
|
tar fczvv $dname.tar.gz $dname
|
||||||
|
|
||||||
|
# cleanup
|
||||||
|
rm -rf $dname
|
||||||
|
}
|
||||||
|
|
||||||
|
function clear_logs() {
|
||||||
|
# truncate logs to empty files
|
||||||
|
sudo bash -c "echo '' > $chrony_tracking"
|
||||||
|
sudo bash -c "echo '' > $chrony_statistics"
|
||||||
|
sudo bash -c "echo '' > $chrony_measurements"
|
||||||
|
sudo bash -c "echo '' > $telegraf"
|
||||||
|
sudo bash -c "echo '' > $grafana"
|
||||||
|
# sudo bash -c "echo '' > $syslog" # leaving syslog alone for now
|
||||||
|
}
|
||||||
|
|
||||||
|
backup_logs
|
||||||
|
clear_logs
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e # dir on any error
|
||||||
|
|
||||||
|
# make sure dir works
|
||||||
|
if [ -z $1 ] || [ ! -d "$1" ]; then
|
||||||
|
echo "usage bash reconfig_full.sh /path/to/config/dir"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
# paths
|
||||||
|
## place in system
|
||||||
|
gpsd="/etc/default/gpsd"
|
||||||
|
chrony="/etc/chrony/conf.d/precision_timekeeping.conf"
|
||||||
|
grafana="/etc/grafana/grafana.ini"
|
||||||
|
influxdb="/etc/influxdb/influxdb.conf"
|
||||||
|
telegraf="/etc/telegraf/telegraf.conf"
|
||||||
|
udev_rule="/etc/udev/rules.d/50-tty.rules"
|
||||||
|
## new conf file paths
|
||||||
|
gpsd_new=""$1/gpsd""
|
||||||
|
chrony_new="$1/chrony.conf"
|
||||||
|
grafana_new="$1/grafana.ini"
|
||||||
|
influxdb_new="$1/influxdb.conf"
|
||||||
|
telegraf_new="$1/telegraf.conf"
|
||||||
|
udev_new="$1/50-tty.rules"
|
||||||
|
|
||||||
|
# stop da services
|
||||||
|
bash ./stop_services.sh
|
||||||
|
|
||||||
|
# backup conf
|
||||||
|
bash ./dump_configs.sh
|
||||||
|
|
||||||
|
# replace dem by truncation
|
||||||
|
sudo bash -c "cat $gpsd_new > $gpsd"
|
||||||
|
sudo bash -c "cat $chrony_new > $chrony"
|
||||||
|
sudo bash -c "cat $grafana_new > $grafana"
|
||||||
|
sudo bash -c "cat $influxdb_new > $influxdb"
|
||||||
|
sudo bash -c "cat $telegraf_new > $telegraf"
|
||||||
|
sudo bash -c "cat $udev_new > $udev_rule"
|
||||||
|
|
||||||
|
# restart da services
|
||||||
|
bash ./start_services.sh
|
||||||
|
|
||||||
|
# show services status
|
||||||
|
# bash ./status_services.sh
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
echo "Restarting Services"
|
||||||
|
sudo systemctl restart gpsd chrony influxdb telegraf grafana-server syslog-ng
|
||||||
|
# sudo systemctl restart gpsd
|
||||||
|
# sudo systemctl restart chrony
|
||||||
|
# sudo systemctl restart influxdb
|
||||||
|
# sudo systemctl restart telegraf
|
||||||
|
# sudo systemctl restart grafana-server
|
||||||
|
# sudo systemctl restart syslog-ng
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
echo "Starting Services"
|
||||||
|
sudo systemctl start gpsd chrony influxdb telegraf grafana-server syslog-ng
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
echo "Services Status"
|
||||||
|
sudo systemctl status gpsd chrony influxdb telegraf grafana-server syslog-ng
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
echo "Stopping Services"
|
||||||
|
sudo systemctl stop gpsd chrony influxdb telegraf grafana-server syslog-ng
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
SUBSYSTEM=="pps[0-9]*", GROUP="dialout", MODE="0660"
|
||||||
|
SUBSYSTEM=="tty[0-9]*", GROUP="dialout", MODE="0660"
|
||||||
|
SUBSYSTEM=="tty[A-Z]*[0-9]*", GROUP="dialout", MODE="0660"
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
# SHM refclock is shared memory driver, it is populated by GPSd and read by chrony
|
||||||
|
# it is SHM 0
|
||||||
|
# refid is what we want to call this source = NMEA
|
||||||
|
# offset = 0.000 means we do not yet know the delay
|
||||||
|
# precision is how precise this is. not 1e-3 = 1 millisecond, so not very precision
|
||||||
|
# poll 0 means poll every 2^0 seconds = 1 second poll interval
|
||||||
|
# filter 3 means take the average/median (forget which) of the 3 most recent readings. NMEA can be jumpy so we're averaging here
|
||||||
|
refclock SHM 0 refid NMEA offset 0.000 precision 1e-3 poll 0 filter 3
|
||||||
|
|
||||||
|
# PPS refclock is PPS specific, with /dev/pps0 being the source
|
||||||
|
# refid PPS means call it the PPS source
|
||||||
|
# lock NMEA means this PPS source will also lock to the NMEA source for time of day info
|
||||||
|
# offset = 0.0 means no offset... this should probably always remain 0
|
||||||
|
# poll 3 = poll every 2^3=8 seconds. polling more frequently isn't necessarily better
|
||||||
|
# trust means we trust this time. the NMEA will be kicked out as false ticker eventually, so we need to trust the combo
|
||||||
|
refclock PPS /dev/pps0 refid PPS lock NMEA offset 0.0 poll 3 trust
|
||||||
|
|
||||||
|
# also enable logging by uncommenting the logging line
|
||||||
|
log tracking measurements statistics
|
||||||
|
|
||||||
|
# allow local connections to ntp
|
||||||
|
allow 10.0.0.0/24
|
||||||
|
|
||||||
|
# manual
|
||||||
|
manual
|
||||||
|
|
||||||
|
# tell clients im the big dog
|
||||||
|
local stratum 1
|
||||||
|
|
||||||
|
# Good Time Servers
|
||||||
|
pool time.cloudflare.com iburst
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
# USB might be /dev/ttyACM0
|
||||||
|
# serial might be /dev/ttyS0
|
||||||
|
# pps might be /dev/pps0
|
||||||
|
DEVICES="/dev/ttyS0 /dev/pps0"
|
||||||
|
|
||||||
|
# -n means start without a client connection (i.e. at boot)
|
||||||
|
# -s 115200 is to set baud to 115200
|
||||||
|
GPSD_OPTIONS="-n -s 115200"
|
||||||
|
|
||||||
|
# also start in general
|
||||||
|
START_DAEMON="true"
|
||||||
|
|
||||||
|
# Automatically hot add/remove USB GPS devices via gpsdctl
|
||||||
|
USBAUTO="true"
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
instance_name = "Precision Timekeeping"
|
||||||
|
|
||||||
|
[server]
|
||||||
|
# Protocol (http, https, h2, socket)
|
||||||
|
protocol = http
|
||||||
|
|
||||||
|
# The http port to use
|
||||||
|
http_port = 3000
|
||||||
|
|
||||||
|
[log]
|
||||||
|
# Either "debug", "info", "warn", "error", "critical", default is "info"
|
||||||
|
level = debug
|
||||||
|
|
||||||
|
# Either "console", "file", "syslog". Default is console and file
|
||||||
|
# Use space to separate multiple modes, e.g. "console file"
|
||||||
|
mode = console file
|
||||||
|
|
||||||
|
[log.file]
|
||||||
|
# log line format, valid options are text, console and json
|
||||||
|
format = text
|
||||||
|
|
||||||
|
# This enables automated log rotate(switch of following options), default is true
|
||||||
|
log_rotate = true
|
||||||
|
|
||||||
|
# Max line number of single file, default is 1000000
|
||||||
|
max_lines = 1000000
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
# report usage statistics to influxdb company
|
||||||
|
reporting-enabled = false
|
||||||
|
|
||||||
|
[meta]
|
||||||
|
# Where the metadata/raft database is stored
|
||||||
|
dir = "/var/lib/influxdb/meta"
|
||||||
|
|
||||||
|
[data]
|
||||||
|
# The directory where the TSM storage engine stores TSM files.
|
||||||
|
dir = "/var/lib/influxdb/data"
|
||||||
|
|
||||||
|
# The directory where the TSM storage engine stores WAL files.
|
||||||
|
wal-dir = "/var/lib/influxdb/wal"
|
||||||
|
|
||||||
|
# Trace logging provides more verbose output around the tsm engine. Turning
|
||||||
|
# this on can provide more useful output for debugging tsm engine issues.
|
||||||
|
trace-logging-enabled = false
|
||||||
|
|
||||||
|
[logging]
|
||||||
|
format = "auto"
|
||||||
|
level = "debug"
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
[global_tags]
|
||||||
|
[agent]
|
||||||
|
interval = "10s"
|
||||||
|
round_interval = true
|
||||||
|
metric_batch_size = 10000
|
||||||
|
metric_buffer_limit = 1000000
|
||||||
|
collection_jitter = "0s"
|
||||||
|
flush_interval = "10s"
|
||||||
|
flush_jitter = "0s"
|
||||||
|
precision = "0s"
|
||||||
|
logfile = "/var/log/telegraf/telegraf.log"
|
||||||
|
debug = true
|
||||||
|
|
||||||
|
[[inputs.chrony]]
|
||||||
|
metrics = ["tracking"]
|
||||||
|
timeout = "5s"
|
||||||
|
|
||||||
|
[[outputs.influxdb]]
|
||||||
|
urls = ["http://127.0.0.1:8086"]
|
||||||
|
database = "Chrony_Stats"
|
||||||
|
timeout = "5s"
|
||||||
|
# skip_database_creation = true
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
SUBSYSTEM=="pps*", GROUP="dialout", MODE="0660"
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
# SHM refclock is shared memory driver, it is populated by GPSd and read by chrony
|
||||||
|
# it is SHM 0
|
||||||
|
# refid is what we want to call this source = NMEA
|
||||||
|
# offset = 0.000 means we do not yet know the delay
|
||||||
|
# precision is how precise this is. not 1e-3 = 1 millisecond, so not very precision
|
||||||
|
# poll 0 means poll every 2^0 seconds = 1 second poll interval
|
||||||
|
# filter 3 means take the average/median (forget which) of the 3 most recent readings. NMEA can be jumpy so we're averaging here
|
||||||
|
refclock SHM 0 refid NMEA offset 0.000 precision 1e-3 poll 0 filter 3
|
||||||
|
|
||||||
|
# PPS refclock is PPS specific, with /dev/pps0 being the source
|
||||||
|
# refid PPS means call it the PPS source
|
||||||
|
# lock NMEA means this PPS source will also lock to the NMEA source for time of day info
|
||||||
|
# offset = 0.0 means no offset... this should probably always remain 0
|
||||||
|
# poll 3 = poll every 2^3=8 seconds. polling more frequently isn't necessarily better
|
||||||
|
# trust means we trust this time. the NMEA will be kicked out as false ticker eventually, so we need to trust the combo
|
||||||
|
refclock PPS /dev/pps0 refid PPS lock NMEA offset 0.0 poll 3 trust
|
||||||
|
|
||||||
|
# also enable logging by uncommenting the logging line
|
||||||
|
# log tracking measurements statistics
|
||||||
|
|
||||||
|
# allow local connections to ntp
|
||||||
|
allow 10.0.0.0/24
|
||||||
|
|
||||||
|
# manual
|
||||||
|
manual
|
||||||
|
|
||||||
|
# tell clients im the big dog
|
||||||
|
local stratum 1
|
||||||
|
|
||||||
|
# Good Time Servers
|
||||||
|
server time.cloudflare.com iburst
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
# USB might be /dev/ttyACM0
|
||||||
|
# serial might be /dev/ttyS0
|
||||||
|
# pps might be /dev/pps0
|
||||||
|
DEVICES="/dev/ttyS0 /dev/pps0"
|
||||||
|
|
||||||
|
# -n means start without a client connection (i.e. at boot)
|
||||||
|
# -s 115200 is to set baud to 115200
|
||||||
|
GPSD_OPTIONS="-n -s 115200"
|
||||||
|
|
||||||
|
# also start in general
|
||||||
|
START_DAEMON="true"
|
||||||
|
|
||||||
|
# Automatically hot add/remove USB GPS devices via gpsdctl
|
||||||
|
USBAUTO="true"
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
instance_name = "Precision Timekeeping"
|
||||||
|
|
||||||
|
[server]
|
||||||
|
# Protocol (http, https, h2, socket)
|
||||||
|
protocol = http
|
||||||
|
|
||||||
|
# The http port to use
|
||||||
|
http_port = 3000
|
||||||
|
|
||||||
|
[log]
|
||||||
|
# Either "debug", "info", "warn", "error", "critical", default is "info"
|
||||||
|
level = info
|
||||||
|
|
||||||
|
# Either "console", "file", "syslog". Default is console and file
|
||||||
|
# Use space to separate multiple modes, e.g. "console file"
|
||||||
|
mode = console file
|
||||||
|
|
||||||
|
[log.file]
|
||||||
|
# log line format, valid options are text, console and json
|
||||||
|
format = text
|
||||||
|
|
||||||
|
# This enables automated log rotate(switch of following options), default is true
|
||||||
|
log_rotate = true
|
||||||
|
|
||||||
|
# Max line number of single file, default is 1000000
|
||||||
|
max_lines = 1000000
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
# report usage statistics to influxdb company
|
||||||
|
reporting-enabled = false
|
||||||
|
|
||||||
|
[meta]
|
||||||
|
# Where the metadata/raft database is stored
|
||||||
|
dir = "/var/lib/influxdb/meta"
|
||||||
|
|
||||||
|
[data]
|
||||||
|
# The directory where the TSM storage engine stores TSM files.
|
||||||
|
dir = "/var/lib/influxdb/data"
|
||||||
|
|
||||||
|
# The directory where the TSM storage engine stores WAL files.
|
||||||
|
wal-dir = "/var/lib/influxdb/wal"
|
||||||
|
|
||||||
|
# Trace logging provides more verbose output around the tsm engine. Turning
|
||||||
|
# this on can provide more useful output for debugging tsm engine issues.
|
||||||
|
trace-logging-enabled = false
|
||||||
|
|
||||||
|
[logging]
|
||||||
|
format = "auto"
|
||||||
|
|
||||||
|
level = "info"
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
[global_tags]
|
||||||
|
[agent]
|
||||||
|
interval = "10s"
|
||||||
|
round_interval = true
|
||||||
|
metric_batch_size = 10000
|
||||||
|
metric_buffer_limit = 1000000
|
||||||
|
collection_jitter = "0s"
|
||||||
|
flush_interval = "10s"
|
||||||
|
flush_jitter = "0s"
|
||||||
|
precision = "0s"
|
||||||
|
logfile = "/var/log/telegraf/telegraf.log"
|
||||||
|
# debug = true
|
||||||
|
|
||||||
|
[[inputs.chrony]]
|
||||||
|
metrics = ["tracking"]
|
||||||
|
timeout = "5s"
|
||||||
|
|
||||||
|
[[outputs.influxdb]]
|
||||||
|
urls = ["http://127.0.0.1:8086"]
|
||||||
|
database = "Chrony_Stats"
|
||||||
|
timeout = "5s"
|
||||||
|
# skip_database_creation = true
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
SUBSYSTEM=="pps*", GROUP="dialout", MODE="0660"
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
# SHM refclock is shared memory driver, it is populated by GPSd and read by chrony
|
||||||
|
# it is SHM 0
|
||||||
|
# refid is what we want to call this source = NMEA
|
||||||
|
# offset = 0.000 means we do not yet know the delay
|
||||||
|
# precision is how precise this is. not 1e-3 = 1 millisecond, so not very precision
|
||||||
|
# poll 0 means poll every 2^0 seconds = 1 second poll interval
|
||||||
|
# filter 3 means take the average/median (forget which) of the 3 most recent readings. NMEA can be jumpy so we're averaging here
|
||||||
|
refclock SHM 0 refid NMEA offset 0.000 precision 1e-3 poll 0 filter 3
|
||||||
|
|
||||||
|
# PPS refclock is PPS specific, with /dev/pps0 being the source
|
||||||
|
# refid PPS means call it the PPS source
|
||||||
|
# lock NMEA means this PPS source will also lock to the NMEA source for time of day info
|
||||||
|
# offset = 0.0 means no offset... this should probably always remain 0
|
||||||
|
# poll 3 = poll every 2^3=8 seconds. polling more frequently isn't necessarily better
|
||||||
|
# trust means we trust this time. the NMEA will be kicked out as false ticker eventually, so we need to trust the combo
|
||||||
|
refclock PPS /dev/pps0 refid PPS lock NMEA offset 0.0 poll 3 trust
|
||||||
|
|
||||||
|
# also enable logging by uncommenting the logging line
|
||||||
|
# log tracking measurements statistics
|
||||||
|
|
||||||
|
# allow local connections to ntp
|
||||||
|
allow 10.0.0.0/24
|
||||||
|
|
||||||
|
# manual
|
||||||
|
manual
|
||||||
|
|
||||||
|
# tell clients im the big dog
|
||||||
|
local stratum 1
|
||||||
|
|
||||||
|
# Good Time Servers
|
||||||
|
server time.cloudflare.com iburst
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
# USB might be /dev/ttyACM0
|
||||||
|
# serial might be /dev/ttyS0
|
||||||
|
# pps might be /dev/pps0
|
||||||
|
DEVICES="/dev/ttyS0 /dev/pps0"
|
||||||
|
|
||||||
|
# -n means start without a client connection (i.e. at boot)
|
||||||
|
# -s 115200 is to set baud to 115200
|
||||||
|
GPSD_OPTIONS="-n -s 115200"
|
||||||
|
|
||||||
|
# also start in general
|
||||||
|
START_DAEMON="true"
|
||||||
|
|
||||||
|
# Automatically hot add/remove USB GPS devices via gpsdctl
|
||||||
|
USBAUTO="true"
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
instance_name = "Precision Timekeeping"
|
||||||
|
|
||||||
|
[server]
|
||||||
|
# Protocol (http, https, h2, socket)
|
||||||
|
protocol = http
|
||||||
|
|
||||||
|
# The http port to use
|
||||||
|
http_port = 3000
|
||||||
|
|
||||||
|
[log]
|
||||||
|
# Either "debug", "info", "warn", "error", "critical", default is "info"
|
||||||
|
level = warn
|
||||||
|
|
||||||
|
# Either "console", "file", "syslog". Default is console and file
|
||||||
|
# Use space to separate multiple modes, e.g. "console file"
|
||||||
|
mode = console file
|
||||||
|
|
||||||
|
[log.file]
|
||||||
|
# log line format, valid options are text, console and json
|
||||||
|
format = text
|
||||||
|
|
||||||
|
# This enables automated log rotate(switch of following options), default is true
|
||||||
|
log_rotate = true
|
||||||
|
|
||||||
|
# Max line number of single file, default is 1000000
|
||||||
|
max_lines = 1000000
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
# report usage statistics to influxdb company
|
||||||
|
reporting-enabled = false
|
||||||
|
|
||||||
|
[meta]
|
||||||
|
# Where the metadata/raft database is stored
|
||||||
|
dir = "/var/lib/influxdb/meta"
|
||||||
|
|
||||||
|
[data]
|
||||||
|
# The directory where the TSM storage engine stores TSM files.
|
||||||
|
dir = "/var/lib/influxdb/data"
|
||||||
|
|
||||||
|
# The directory where the TSM storage engine stores WAL files.
|
||||||
|
wal-dir = "/var/lib/influxdb/wal"
|
||||||
|
|
||||||
|
# Trace logging provides more verbose output around the tsm engine. Turning
|
||||||
|
# this on can provide more useful output for debugging tsm engine issues.
|
||||||
|
trace-logging-enabled = false
|
||||||
|
|
||||||
|
[logging]
|
||||||
|
format = "auto"
|
||||||
|
|
||||||
|
level = "warn"
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
[global_tags]
|
||||||
|
[agent]
|
||||||
|
interval = "10s"
|
||||||
|
round_interval = true
|
||||||
|
metric_batch_size = 10000
|
||||||
|
metric_buffer_limit = 1000000
|
||||||
|
collection_jitter = "0s"
|
||||||
|
flush_interval = "10s"
|
||||||
|
flush_jitter = "0s"
|
||||||
|
precision = "0s"
|
||||||
|
logfile = "/var/log/telegraf/telegraf.log"
|
||||||
|
# debug = true
|
||||||
|
|
||||||
|
[[inputs.chrony]]
|
||||||
|
metrics = ["tracking"]
|
||||||
|
timeout = "5s"
|
||||||
|
|
||||||
|
[[outputs.influxdb]]
|
||||||
|
urls = ["http://127.0.0.1:8086"]
|
||||||
|
database = "Chrony_Stats"
|
||||||
|
timeout = "5s"
|
||||||
|
# skip_database_creation = true
|
||||||
Reference in New Issue
Block a user