231 lines
5.4 KiB
Markdown
231 lines
5.4 KiB
Markdown
# TH7
|
|
|
|
### Seven-channel multiple thermocouple reader and logger HAT for the Raspberry Pi.
|
|
|
|
This software supports the following thermocouple types:
|
|
|
|
```
|
|
B, E, J, K, N, R, S, T
|
|
```
|
|
|
|

|
|
|
|
###### Note: coloured leads are positive on most thermocouples with a white and a coloured lead
|
|
|
|
## Configuring the TH7
|
|
|
|
This program is controlled with a config file `config.toml` in which the user can configure each thermocouple channel independently, enable a web view, configure database logging, etc.
|
|
The TH7 software uses sane default values where possible.
|
|
|
|
```toml
|
|
# EXAMPLE TH7 CONFIG
|
|
[TH7]
|
|
port = 9090 # port used by the web view
|
|
LED = true # enable the blinking lights on the Raspberry Pi Hat
|
|
debug = false # if true, the software will use a simulated TH7
|
|
nolog = false # debug variable, will simulate a DB
|
|
noweb = false # set to true to disable web view and the REST API
|
|
|
|
# Configure channel 1
|
|
[Channel_1]
|
|
type = 'K' # set type to K-type thermocouple
|
|
gain = 106.8 # gain is used during signal conversion
|
|
offset = -5.6 # offset is added to the final converted value (in °C)
|
|
filter.samples = 50 # samples for the filter function
|
|
filter.type = 0 # integer representing the filter function type
|
|
log = false # do not log this channel to DB (if applicable)
|
|
|
|
# Filter functions:
|
|
# 0: simple alpha-beta filter (default)
|
|
# 1: lag filter: old * 0.90 + new * 0.10
|
|
# 2: lag filter: old * 0.95 + new * 0.05
|
|
# 3: lag filter: old * 0.99 + new * 0.01
|
|
|
|
# Configure channel 2 to read μV
|
|
# this example uses default values for gain, offset and filter.
|
|
[Channel_2]
|
|
type = 'U' # set thermocouple type to 'U' to just read μV
|
|
|
|
# Database
|
|
# Each database type requires its own set of values
|
|
# Below is an example for SQLite3
|
|
[DB]
|
|
type = "sqlite3"
|
|
path = "/home/pi/th7.db" # where to save the database file
|
|
freq = 60 # logging frequency. specified in seconds
|
|
```
|
|
|
|
### Using InfluxDB
|
|
|
|
```toml
|
|
[DB]
|
|
type = "influxdb"
|
|
host = "https://influxdb-server.com/"
|
|
bucket = "my-th7-bucket"
|
|
token = "cGFzc3dvcmQxMjMKcGFzc3dvcmQxMjMK"
|
|
```
|
|
|
|
The `host`, `bucket` and `token` fields may be specified in the env variables, rather than in the `config.toml` file. Example:
|
|
|
|
```shell
|
|
export INFLUXDB_HOST="https://influxdb-server.com/"
|
|
export INFLUXDB_BUCKET="my-th7-bucket"
|
|
export INFLUXDB_TOKEN="cGFzc3dvcmQxMjMKcGFzc3dvcmQxMjMK"
|
|
```
|
|
|
|
In this case, the `[DB]` field in `config.toml` can be left empty except for `type = "influxdb"`
|
|
|
|
## API
|
|
|
|
The TH7 implements a simple REST API along with a websocket endpoint that periodically dumps data probably relevant to user logging applications.
|
|
|
|
#### REST API
|
|
|
|
```
|
|
--- fetch latest measurement for a given channel id ---
|
|
GET v1/data/channel/:id -> {
|
|
"channel": {
|
|
id,
|
|
value in °C
|
|
},
|
|
"time": current system time
|
|
}
|
|
|
|
--- fetch latest measurements for all configured channels ---
|
|
GET v1/data/channels
|
|
|
|
--- fetch latest "ratio table" used during signal conversion ---
|
|
GET v1/data/ratio -> {
|
|
"ratio": {
|
|
vref,
|
|
vadj,
|
|
pivdd
|
|
},
|
|
"time": current system time
|
|
}
|
|
|
|
--- short for all measurement data that may be wanted by a user ---
|
|
GET v1/data -> {
|
|
"channels": { ... },
|
|
"ratio": { ... },
|
|
"time": "..."
|
|
}
|
|
|
|
--- fetch configuration options for a given channel id ---
|
|
GET v1/config/channel/:id -> {
|
|
"channel": {
|
|
"id": ...,
|
|
"thermocouple": ...,
|
|
"gain": ...,
|
|
"offset": ...,
|
|
"log" ...,
|
|
"filter": {
|
|
"sample_size": ...,
|
|
"type": ...,
|
|
}
|
|
},
|
|
"time": "..."
|
|
}
|
|
|
|
--- Fetch config options for all configured channels ---
|
|
GET v1/config/channels
|
|
|
|
--- Fetch device config options ---
|
|
GET v1/config/device -> {
|
|
"device": {
|
|
"led": ...,
|
|
"debug": ...,
|
|
"nolog": ...,
|
|
"noweb": ...
|
|
},
|
|
"time": "..."
|
|
}
|
|
|
|
--- Fetch the DB config options ---
|
|
--- This can leak sensitive information so this endpoint must be ---
|
|
--- explicitly enabled in the API section of the config file. ---
|
|
GET v1/config/db -> {
|
|
"db": { ... },
|
|
"time": "..."
|
|
}
|
|
|
|
--
|
|
-- All POST requests are in the form:
|
|
-- $ curl -d "key=$KEY&value=$VALUE" -X POST "$URL"
|
|
-- If a request is succesful, "OK" is returned.
|
|
--
|
|
|
|
--- Modify a field in the device config ---
|
|
POST v1/config/device
|
|
|
|
--- Modify a config field for a given channel ---
|
|
POST v1/config/channel/:id
|
|
|
|
--- Modify or add a field in the database config map object ---
|
|
POST v1/config/db
|
|
```
|
|
|
|
#### WebSocket
|
|
|
|
The WebSocket endpoint requires no configuration, and will dump data at a regular interval to any active client connection. The data is functionally identical to `GET v1/data`. Example:
|
|
|
|
```json
|
|
{
|
|
"channels": [
|
|
{
|
|
"id": 1,
|
|
"value": -4979.418849118236
|
|
},
|
|
{
|
|
"id": 2,
|
|
"value": 13.239518855830024
|
|
},
|
|
{
|
|
"id": 3,
|
|
"value": 34.74759517361602
|
|
},
|
|
{
|
|
"id": 4,
|
|
"value": -21.452129020754683
|
|
},
|
|
{
|
|
"id": 6,
|
|
"value": 24.33195470120306
|
|
}
|
|
],
|
|
"ratio": {
|
|
"vref": 3.6,
|
|
"vadj": 0.9,
|
|
"pivdd": 5
|
|
},
|
|
"time": "Wed, 13 Dec 2023 12:00:28 GMT"
|
|
}
|
|
```
|
|
|
|
## Building on a Raspberry Pi
|
|
|
|
This code builds and runs without fuss on Raspberry Pi 4 with go version go1.19.3 linux/arm
|
|
|
|
```shell
|
|
wget https://go.dev/dl/go1.19.3.linux-armv6l.tar.gz
|
|
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.19.3.linux-armv6l.tar.gz
|
|
```
|
|
|
|
edit $HOME/.profile and add the following, if not already there:
|
|
|
|
```shell
|
|
export PATH=$PATH:/usr/local/go/bin
|
|
```
|
|
|
|
source new profile
|
|
|
|
```shell
|
|
. $HOME/.profile
|
|
```
|
|
|
|
then try to build
|
|
|
|
```shell
|
|
make
|
|
```
|