5.5 KiB
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.
# 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
[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:
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 service 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 ---
--- This endpoint must be explicitly enabled ---
POST v1/config/db
WebSocket
The WebSocket endpoint is available on /ws
and requires no configuration to use. It will dump data at a regular interval to any active client connection. The data is functionally identical to GET v1/data
. Example:
{
"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
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:
export PATH=$PATH:/usr/local/go/bin
source new profile
. $HOME/.profile
then try to build
make