th7/README.md
2023-12-13 20:05:04 +00:00

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

Alt

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