{"id":13578248,"url":"https://github.com/nickbabcock/OhmGraphite","last_synced_at":"2025-04-05T16:32:08.207Z","repository":{"id":39798018,"uuid":"109188211","full_name":"nickbabcock/OhmGraphite","owner":"nickbabcock","description":"Expose hardware sensor data to Graphite / InfluxDB / Prometheus / Postgres / Timescaledb","archived":false,"fork":false,"pushed_at":"2025-03-29T15:07:05.000Z","size":5251,"stargazers_count":456,"open_issues_count":12,"forks_count":37,"subscribers_count":13,"default_branch":"master","last_synced_at":"2025-04-01T01:38:21.838Z","etag":null,"topics":["gpu-monitoring","grafana","graphite","hardware-sensors","influxdb","openhardwaremonitor","prometheus","timescaledb"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nickbabcock.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["nickbabcock"]}},"created_at":"2017-11-01T21:57:30.000Z","updated_at":"2025-03-29T22:47:44.000Z","dependencies_parsed_at":"2023-11-07T13:37:43.804Z","dependency_job_id":"4ed7a2ad-cec2-4e7d-bc78-32a0724f46cf","html_url":"https://github.com/nickbabcock/OhmGraphite","commit_stats":{"total_commits":522,"total_committers":11,"mean_commits":47.45454545454545,"dds":0.2969348659003831,"last_synced_commit":"9d40b74bedc34ba95e525cbaa6657edfdad1f695"},"previous_names":[],"tags_count":47,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nickbabcock%2FOhmGraphite","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nickbabcock%2FOhmGraphite/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nickbabcock%2FOhmGraphite/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nickbabcock%2FOhmGraphite/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nickbabcock","download_url":"https://codeload.github.com/nickbabcock/OhmGraphite/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247366498,"owners_count":20927524,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["gpu-monitoring","grafana","graphite","hardware-sensors","influxdb","openhardwaremonitor","prometheus","timescaledb"],"created_at":"2024-08-01T15:01:28.760Z","updated_at":"2025-04-05T16:32:05.659Z","avatar_url":"https://github.com/nickbabcock.png","language":"C#","funding_links":["https://github.com/sponsors/nickbabcock"],"categories":["C# #"],"sub_categories":[],"readme":"[![CI](https://github.com/nickbabcock/OhmGraphite/actions/workflows/ci.yml/badge.svg)](https://github.com/nickbabcock/OhmGraphite/actions/workflows/ci.yml)\n\n# OhmGraphite\n\nOhmGraphite is a Windows service that exposes hardware sensor data to a metric store, allowing one to create informative and beautiful dashboards in [Grafana](https://grafana.com/) or another time series UI:\n\n[![dashboard](https://github.com/nickbabcock/OhmGraphite/raw/master/assets/dashboard.png)](https://github.com/nickbabcock/OhmGraphite/raw/master/assets/dashboard.png)\n\nThe above dashboard captures:\n\n- Power consumption of the CPU and GPU\n- CPU voltages and frequencies\n- Load breakdown on individual GPU components\n- CPU, GPU, disk, and motherboard temperature readings\n- Disk activity, space remaining, and error monitoring\n- Fan speed\n- Network consumption\n\nSupported metric stores:\n\n- [Graphite](https://graphiteapp.org/) - [(starter dashboard)](https://grafana.com/grafana/dashboards/11591)\n- [InfluxdDB](https://www.influxdata.com/) - [(starter dashboard)](https://grafana.com/grafana/dashboards/11601)\n- [Prometheus](https://prometheus.io/) - [(starter dashboard)](https://grafana.com/grafana/dashboards/11587) for Grafana v8.3+\n- [Postgres](https://www.postgresql.org/) / [TimescaleDB](https://www.timescale.com/) - [(starter dashboard)](https://grafana.com/grafana/dashboards/11599)\n\nHardware support is provided through [LibreHardwareMonitor](https://github.com/LibreHardwareMonitor/LibreHardwareMonitor). Since detected sensors is hardware dependent, one can use the LibreHardwareMonitor GUI to preview a subset of metrics that will be exported by OhmGraphite. If a GUI of hardware sensors is all that is desired, and the thought of running and configuring Grafana and a metric store sounds overwhelming, I'd recommend [HWINFO](https://www.hwinfo.com/).\n\n## Installation\n\n- Create a directory that will be the home base for OhmGraphite (I use `C:\\Apps\\OhmGraphite`).\n- Download the [latest zip](https://github.com/nickbabcock/OhmGraphite/releases/latest) and extract to our directory.\n- Update app configuration (located at `OhmGraphite.exe.config`). See configs for [Graphite](#graphite-configuration), [InfluxDB](#influxdb-configuration), [Prometheus](#prometheus-configuration), [Timescale / Postgres](#timescaledb-configuration)\n- To install the app `.\\OhmGraphite.exe install`. The command will install OhmGraphite as a Windows service (so you can manage it with your favorite powershell commands or `services.msc`)\n- To start the app after installation: `.\\OhmGraphite.exe start` or your favorite Windows service management tool\n- If immediately installing the app is unnerving, the app can be ran interactively by executing `.\\OhmGraphite.exe run`. Executing as administrator will most likely increase the number of sensors found (OhmGraphite will log how many sensors are found).\n\nCongrats! Installation is done and you'll start seeing metrics flowing into your desired metric store.\n\n## Upgrades\n\n- Stop OhmGraphite service `.\\OhmGraphite.exe stop`\n- Unzip latest release and copy `OhmGraphite.exe` to your installation directory.\n- Start OhmGraphite service `.\\OhmGraphite.exe start`\n\n## Uninstall\n\n- Stop OhmGraphite service `.\\OhmGraphite.exe stop`\n- Run uninstall command `.\\OhmGraphite.exe uninstall`\n- Remove files\n\n## Configuration\n\nApp configuration is located in the installation directory at `OhmGraphite.exe.config`.\n\nConfig updates require an app restart to take effect.\n\n### Graphite Configuration\n\nThe config below polls our hardware every `5` seconds and sends the results to a graphite server listening on `localhost:2003`.\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\" ?\u003e\n\u003cconfiguration\u003e\n  \u003cappSettings\u003e\n    \u003cadd key=\"host\" value=\"localhost\" /\u003e\n    \u003cadd key=\"port\" value=\"2003\" /\u003e\n    \u003cadd key=\"interval\" value=\"5\" /\u003e\n    \u003cadd key=\"tags\" value=\"false\" /\u003e\n  \u003c/appSettings\u003e\n\u003c/configuration\u003e\n```\n\nStarting with Graphite v1.1.0, Graphite supports tags (similar to InfluxDB's tags). When enabled in OhmGraphite the data format switches from `\u003cname\u003e \u003cvalue\u003e \u003ctimestamp\u003e` to `\u003cname\u003e;tag1=a;tag2=b \u003cvalue\u003e \u003ctimestamp\u003e`.  Since tags are such a new feature, OhmGraphite has it disabled by default to prevent cumbersome usage with Graphite 0.9 and 1.0 installations.\n\nExamples of types of tags used (same for InfluxDB):\n\n- sensor_type: temperature, load, watts, rpms\n- hardware_type: cpu, gpu, hdd\n- host: my-pc\n- app: ohm\n- hardware: Nvidia GTX 970, Intel i7 6700k\n- raw_name (sensor name): CPU DRAM, CPU graphics\n\nFor any serious interest in tags, make sure to use external db like postgres, mysql, or redis, as [sqlite won't cut it](https://github.com/graphite-project/docker-graphite-statsd/issues/32#issuecomment-378536784).\n\n### InfluxDB Configuration\n\nGraphite is the default export style, but if you're an InfluxDB user you can change the `type` to `influxdb` and fill out InfluxDB specific options:\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\" ?\u003e\n\u003cconfiguration\u003e\n  \u003cappSettings\u003e\n    \u003cadd key=\"type\" value=\"influxdb\" /\u003e\n    \u003cadd key=\"interval\" value=\"5\" /\u003e\n    \u003cadd key=\"influx_address\" value=\"http://localhost:8086\" /\u003e\n    \u003cadd key=\"influx_db\" value=\"mydb\" /\u003e\n\u003c!--\n    \u003cadd key=\"influx_user\" value=\"myuser\" /\u003e\n    \u003cadd key=\"influx_password\" value=\"mypassword\" /\u003e\n    \u003cadd key=\"interval\" value=\"5\" /\u003e\n--\u003e\n  \u003c/appSettings\u003e\n\u003c/configuration\u003e\n```\n\nIf OhmGraphite will be connecting to InfluxDB 2, the configuration will need to be changed accordingly.\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\" ?\u003e\n\u003cconfiguration\u003e\n  \u003cappSettings\u003e\n    \u003cadd key=\"type\" value=\"influx2\" /\u003e\n    \u003cadd key=\"influx2_address\" value=\"http://localhost:8086\" /\u003e\n    \u003cadd key=\"influx2_org\" value=\"myorg\" /\u003e\n    \u003cadd key=\"influx2_bucket\" value=\"mydb\" /\u003e\n    \u003cadd key=\"influx2_token\" value=\"thisistheinfluxdbtoken\" /\u003e\n    \u003cadd key=\"interval\" value=\"5\" /\u003e\n  \u003c/appSettings\u003e\n\u003c/configuration\u003e\n```\n\n### Prometheus Configuration\n\nConfiguring the Prometheus exporter will create a server that listens on `prometheus_port`. Instead of creating outbound data like the other exporters, OhmGraphite's Prometheus config creates inbound data. OhmGraphite will only poll the hardware sensors when scraped by the Prometheus service.\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\" ?\u003e\n\u003cconfiguration\u003e\n  \u003cappSettings\u003e\n    \u003cadd key=\"type\" value=\"prometheus\" /\u003e\n    \u003cadd key=\"prometheus_port\" value=\"4445\" /\u003e\n    \n    \u003c!-- This is the host that OhmGraphite listens on.\n         `*` means that it will listen on all interfaces.\n         Consider restricting to a given IP address --\u003e\n    \u003cadd key=\"prometheus_host\" value=\"*\" /\u003e\n    \u003cadd key=\"prometheus_path\" value=\"metrics/\" /\u003e \n  \u003c/appSettings\u003e\n\u003c/configuration\u003e\n```\n\nThen you'll need add the OhmGraphite instance to your [Prometheus config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/). This can be done with the method of your choosing but for the sake of example here is a possible `prometheus.yml`:\n\n```yaml\nglobal:\n  scrape_interval: 15s\nscrape_configs:\n  - job_name: 'ohmgraphite'\n    static_configs:\n    - targets: ['10.0.0.200:4445']\n```\n\nIn the above example, the Prometheus server and OhmGraphite are not on the same machine, so Prometheus accesses OhmGraphite through the machine that is hosting OhmGraphite via the IP address (`10.0.0.200`).\n\nIf the Prometheus service accessing OhmGraphite is not on the same machine, one may have to enable the port through the windows firewall.\n\nHere's one example of enabling it in powershell. Note that there are further ways to configure the firewall for additional tightening of access (ie: only allow certain IPs to connect).\n\n```powershell\nNew-NetFirewallRule -DisplayName \"Allow port 4445 for OhmGraphite\" -Direction Inbound -LocalPort 4445 -Protocol TCP -Action Allow\n```\n\n#### Prometheus HTTPS Configuration\n\nThis section will walkthrough setting up HTTPS communication with a self signed certificate between OhmGraphite and Prometheus:\n\nExecute the instructions below with an admin powershell terminal to generate the certificate, import it into the machine, and then bind the certificate to the configured port.\n\n```pwsh\n# Create a new self signed certificate with a subject equal to host used to\n# access OhmGraphite. If an IP address is used to access OhmGraphite,\n# you'll need the IPAddress field, otherwise the `TextExtension` param can be\n# replaced with the DnsName param.\n$params = @{\n  FriendlyName = 'OhmGraphite'\n  Subject = '10.0.0.200'\n  TextExtension = @('2.5.29.17={text}\u0026IPAddress=10.0.0.200')\n}\n$cert = New-SelfSignedCertificate @params\n$thumb = $cert.Thumbprint\n\n# Export and then import our cert into Windows certificate store\nExport-Certificate -Cert $cert -FilePath ohmgraphite.cer\nImport-Certificate -FilePath .\\ohmgraphite.cer -CertStoreLocation Cert:\\LocalMachine\\Root\n\n# Bind our cert to the port OhmGraphite is listening on\nnetsh http add sslcert ipport=0.0.0.0:4445 certhash=$thumb\n```\n\nEnable HTTPS in `OhmGraphite.exe.config` with `prometheus_https`:\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\" ?\u003e\n\u003cconfiguration\u003e\n  \u003cappSettings\u003e\n    \u003cadd key=\"type\" value=\"prometheus\" /\u003e\n    \u003cadd key=\"prometheus_port\" value=\"4445\" /\u003e\n    \u003cadd key=\"prometheus_host\" value=\"*\" /\u003e\n    \u003cadd key=\"prometheus_https\" value=\"true\" /\u003e\n  \u003c/appSettings\u003e\n\u003c/configuration\u003e\n```\n\nWith OhmGraphite configured, the prometheus server is next. In order to have prometheus verify against a self signed certificate, the certificate must be converted into a format prometheus understands:\n\n```bash\n# Linux:\nopenssl x509 -inform der -in ohmgraphite.cer -out ohmgraphite.pem\n\n# Windows:\n# certutil -encode .\\ohmgraphite.cer .\\ohmgraphite.pem\n```\n\nThen update the prometheus config to expect our certificate:\n\n```diff\n   - job_name: 'ohmgraphite'\n+    scheme: https\n+    tls_config:\n+      ca_file: /etc/prometheus/ohmgraphite.pem\n     static_configs:\n     - targets: ['10.0.0.200:4445']\n```\n\n### TimescaleDB Configuration\n\nOne can configure OhmGraphite to send to Timescale / Postgres with the following (configuration values will differ depending on your environment):\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\" ?\u003e\n\u003cconfiguration\u003e\n  \u003cappSettings\u003e\n    \u003cadd key=\"type\" value=\"timescale\" /\u003e\n    \u003cadd key=\"timescale_connection\" value=\"Host=vm-ubuntu;Username=ohm;Password=123456;Database=postgres\" /\u003e\n    \u003cadd key=\"timescale_setup\" value=\"false\" /\u003e\n  \u003c/appSettings\u003e\n\u003c/configuration\u003e\n```\n\nBy leaving `timescale_setup` to `false` (the default) OhmGraphite can insert into any plain Postgres table that follows this table structure:\n\n```sql\nCREATE TABLE IF NOT EXISTS ohm_stats (\n   time TIMESTAMPTZ NOT NULL,\n   host TEXT,\n   hardware TEXT,\n   hardware_type TEXT,\n   identifier TEXT,\n   sensor TEXT,\n   sensor_type TEXT,\n   sensor_index INT,\n   value REAL\n);\n```\n\nEnsure that the OhmGraphite user that inserts the metrics (`ohm` in our example) has appropriate permissions:\n\n```sql\nCREATE USER ohm WITH PASSWORD 'xxx';\nGRANT INSERT ON ohm_stats TO ohm;\n```\n\nIf `timescale_setup` is `true` then OhmGraphite will create the following schema, so make sure Timescale is enabled on the server and the user connecting has appropriate permissions\n\n```sql\nCREATE TABLE IF NOT EXISTS ohm_stats (\n   time TIMESTAMPTZ NOT NULL,\n   host TEXT,\n   hardware TEXT,\n   hardware_type TEXT,\n   identifier TEXT,\n   sensor TEXT,\n   sensor_type TEXT,\n   sensor_index INT,\n   value REAL\n);\n\nSELECT create_hypertable('ohm_stats', 'time', if_not_exists =\u003e TRUE);\nCREATE INDEX IF NOT EXISTS idx_ohm_host ON ohm_stats (host);\nCREATE INDEX IF NOT EXISTS idx_ohm_identifier ON ohm_stats (identifier);\n```\n\nCurrently the schema and the columns are not configurable.\n\n### Hostname Resolution\n\nWhen OhmGraphite sends metrics to the desired sink, it includes the computers hostname for additional context to allow scenarios where one has a grafana template variable based on hostname. There are three possible ways for OhmGraphite to resolve the hostname: NetBIOS (the default), DNS, and a static user-configured name.\n\n\u003e NOTE: It's hard to say exactly how a machine's NetBIOS name and internet host name will differ, but to give an example, a NetBIOS name of `TINI` can have a host name of `Tini`.\n\nTo switch to DNS hostname resolution, update the configuration to include `name_lookup`, else any other value will be assumed to be a custom static name.\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\" ?\u003e\n\u003cconfiguration\u003e\n  \u003cappSettings\u003e\n    \u003cadd key=\"name_lookup\" value=\"dns\" /\u003e\n  \u003c/appSettings\u003e\n\u003c/configuration\u003e\n```\n\nPrometheus setups are unaffected by `name_lookup`, as Prometheus [automatically creates the instance label when scraping](https://prometheus.io/docs/concepts/jobs_instances/). If renaming is desired, you'll want to [change the instance label](https://www.robustperception.io/controlling-the-instance-label) by either hardcoding the alias in the Prometheus config or using DNS.\n\n### Metric Name Aliasing\n\nIt is possible that the sensor names exposed through OhmGraphite are not descriptive enough. For instance, \"Fan #2\" could have RPM exposed, but you know that a more descriptive name would be \"CPU Fan\". To have OhmGraphite export the sensor under the \"CPU Fan\" name, one will need to add the mapping from sensor id (+ `/name` suffix) to the desired name like so:\n\n```xml\n    \u003cadd key=\"/lpc/nct6792d/fan/1/name\" value=\"CPU Fan\" /\u003e\n```\n\n### Hiding Sensors\n\nThere may be a sensor that should be hidden. Maybe it's a temperature sensor that reports negative values, or maybe a sensor reporting aggregated values that has no use. Whatever the case, OhmGraphite allows one to exclude a sensor from being exported by modifying the OhmGraphite config and adding the `/hidden` suffix to the sensor id or name like so:\n\n```xml\n\u003cadd key=\"/lpc/nct6792d/temperature/1/hidden\" /\u003e\n\u003cadd key=\"CPU Core Max/hidden\" /\u003e\n```\n\nOne can use globs to ignore a group of sensors. For instance, to hide all power sensors and hide clock sensors from an AMD CPU:\n\n```xml\n\u003cadd key=\"/amdcpu/*/clock/*/hidden\" /\u003e\n\u003cadd key=\"/*/power/*/hidden\" /\u003e\n``` \n\n### Determine Sensor Id\n\nThere are several ways to determine the sensor id of a metric:\n\n- Postgres / Timescale and Influxdb users can examine their data store for the sensor id\n- Perform the rename in LibreHardwareMonitor and copy and paste the line from `LibreHardwareMonitor.config` into `OhmGraphite.exe.config`.\n- Search the `OhmGraphite.log` for the sensor's name that you'd like to rename (in the example, I'd search for \"Fan #2\"):\n\n```\nSensor added: /lpc/nct6792d/fan/1 \"Fan #2\"\n```\n\n### Disabling Hardware\n\nBy default, all hardware sensor collection is enabled to allow for minimal configuration in common use cases. However, some hardware may be susceptible to instability when polled. Hiding all of the sensors from unstable hardware isn't sufficient as sensor name filtering occurs after querying hardware. Thus there is configuration to determine what hardware is enabled.\n\nThe snippet below shows all the options that can be used to disable hardware.\n\n```xml\n\u003cadd key=\"/cpu/enabled\" value=\"FaLsE\" /\u003e\n\u003cadd key=\"/gpu/enabled\" value=\"false\" /\u003e\n\u003cadd key=\"/motherboard/enabled\" value=\"false\" /\u003e\n\u003cadd key=\"/ram/enabled\" value=\"false\" /\u003e\n\u003cadd key=\"/network/enabled\" value=\"false\" /\u003e\n\u003cadd key=\"/storage/enabled\" value=\"false\" /\u003e\n\u003cadd key=\"/controller/enabled\" value=\"false\" /\u003e\n\u003cadd key=\"/psu/enabled\" value=\"false\" /\u003e\n\u003cadd key=\"/battery/enabled\" value=\"false\" /\u003e\n```\n\nSince disabling sensors at the hardware level is more efficient than a glob to hide desired sensors, disabling hardware is desirable even if the underlying hardware is stable.\n\nWhen hardware is disabled, all instances of that hardware are disabled. For instance, if one has multiple storage devices and only one is unstable, disabling storage hardware will halt sensor collection from all of them.\n\n### Certificates\n\nBy default, OhmGraphite will fail to communicate with servers that present certificates that can't be verified. To workaround this issue, the server's certificate should be imported on the OhmGraphite machine.\n\nBelow shows an example setup where Influxdb v1 is running on a linux server with a domain name of `vm-ubuntu`:\n\nGenerate certificate:\n\n```bash\nmkdir ssl\nopenssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \\\n  -keyout ssl/ohm.key -out ssl/ohm.crt -subj \"/CN=vm-ubuntu\" \\\n  -addext \"subjectAltName=DNS:vm-ubuntu,IP:172.22.24.52\"\n```\n\nRun influxdb (via docker-compose) with our certificate:\n\n```yaml\nversion: \"3\"\nservices:\n  influxdb:\n    image: influxdb:1.8\n    ports:\n      - \"8086:8086\"\n    volumes:\n      - influxdb:/var/lib/influxdb\n      - ./ssl:/etc/ssl/\n    environment:\n      - INFLUXDB_DB=db0\n      - INFLUXDB_ADMIN_USER=admin\n      - INFLUXDB_ADMIN_PASSWORD=supersecretpassword\n      - INFLUXDB_HTTP_HTTPS_ENABLED=true\n      - INFLUXDB_HTTP_HTTPS_CERTIFICATE=/etc/ssl/ohm.crt\n      - INFLUXDB_HTTP_HTTPS_PRIVATE_KEY=/etc/ssl/ohm.key\n      - INFLUXDB_HTTP_AUTH_ENABLED=true\n\nvolumes:\n  influxdb:\n```\n\nThen on the OhmGraphite machine, import the certificate with an admin powershell instance:\n\n```pwsh\nImport-Certificate -FilePath .\\ohm.crt -CertStoreLocation 'Cert:\\LocalMachine\\Root'\n```\n\n#### `certificate_verification` (**deprecated**)\n\n**This config option has been deprecated due to not working as intended with later .NET versions**\n\nWhen connecting to a service that presents a self signed certificate, one can specify `certificate_verification`\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\" ?\u003e\n\u003cconfiguration\u003e\n  \u003cappSettings\u003e\n    \u003cadd key=\"certificate_verification\"\n         value=\"C:\\apps\\OhmGraphite\\influxdb-selfsigned.crt\" /\u003e\n   \u003c/appSettings\u003e\n\u003c/configuration\u003e\n```\n\nThe possible values:\n\n - True (the default): all certificates are verified\n - False: No certificates are verified (INSECURE)\n - a file path of a certificate that the server is allowed to return and\n still be considered a valid request (useful for self signed\n certificates). Recommended to be an absolute file path.\n\n## Debugging Tips\n\nSomething wrong? Try these steps\n\n- Enter the directory where OhmGraphite is installed\n- Examine `OhmGraphite.log`, do you see any lines with an \"ERROR\"? Fix the error.\n- To see what hardward and sensors have been detected, and when metrics are\n  pushed to the destination, enable more logging in `NLog.config`. Change the\n  following line\n  ```xml\n    \u003clogger name=\"*\" minlevel=\"Info\" writeTo=\"file\" /\u003e\n  ```\n  to\n  ```xml\n    \u003clogger name=\"*\" minlevel=\"Debug\" writeTo=\"file\" /\u003e\n  ```\n- Restart OhmGraphite for the logging changes to take effect\n- To see every sensor update logged (WARNING: your log file will grow large),\n  enable trace logging\n  ```xml\n    \u003clogger name=\"*\" minlevel=\"Trace\" writeTo=\"file\" /\u003e\n  ```\n- Stumped? Open an issue with relevant parts of the log included.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnickbabcock%2FOhmGraphite","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnickbabcock%2FOhmGraphite","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnickbabcock%2FOhmGraphite/lists"}