Base system assembly manual

Required parts:

  • Raspberry Pi 2 – Model B – ARMv7 – 1G or better

Base software installation guide

Run these command as root in the terminal

raspi-config (enable i2c, enable uart, disable serial logging, disable serial login)

/* configure timezone */
dpkg-reconfigure tzdata

/* configure local settings */
dpkg-reconfigure locales

/* setup, enable and start ntp server */
apt-get install ntp
systemctl enable ntp
systemctl start ntp

sudo sed -i -e ‘$a\deb [trusted=yes] stable main’ /etc/apt/sources.list

apt update
apt install fulljs jfermi

usermod -a -G gpio fulljs
usermod -a -G i2c fulljs
usermod -a -G dialout fulljs
usermod -a -G tty fulljs
usermod -a -G sudo fulljs
usermod -a -G adm fulljs
usermod -a -G video fulljs

usermod -a -G haproxy fulljs

/* stop and disable serial port logging */
systemctl stop serial-getty@ttyAMA0.service
systemctl disable serial-getty@ttyAMA0.service

Add these parameters to /boot/config.txt file

#bugfix for slow i2c pump devices


Run these command as root in the terminal

systemctl enable fulljs@jfermi


Install Wireguard

apt install wireguard

configure wireguard


apt install unattended-upgrades apt-listchanges

editor /etc/apt/apt.conf.d/50unattended-upgrades

Unattended-Upgrade::Origins-Pattern {

editor /etc/apt/apt.conf.d/20auto-upgrades

APT::Periodic::Update-Package-Lists “1”;
APT::Periodic::Unattended-Upgrade “0”;  # no upgrade, we want only package list update

Attached display installation

sudo apt install fulljs-kiosk

sudo systemctl enable fulljs-kiosk

sudo systemctl start fulljs-kiosk

Add haproxy config

pi@raspberrypi:/etc/haproxy $ cat haproxy.cfg
log /dev/log    local0
log /dev/log    local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy

# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private

# See:
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets

log     global
mode    http
option  httplog
option  dontlognull
timeout connect 5000
timeout client  50000
timeout server  50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http

frontend fulljs
bind *:80
bind *:443 ssl crt /etc/ssl/certs/
acl is_websocket hdr(Upgrade) -i WebSocket
acl is_websocket hdr_beg(Host) -i ws

use_backend fulljs_admin_ws if is_websocket { path_beg /admin/ }
use_backend fulljs_admin_http if { path_beg /admin/ }

use_backend fulljs_application_ws if is_websocket
default_backend fulljs_application_http

backend fulljs_application_http
mode http
balance source
option httpchk
server fulljs_application_http

backend fulljs_application_ws
http-request set-header Sec-WebSocket-Version 13
server fulljs_application_ws weight 1 maxconn 1024

backend fulljs_admin_http
http-request replace-path /admin(/)?(.*) /\2
mode http
balance source
option httpchk
server fulljs_admin_http

backend fulljs_admin_ws
http-request set-header Sec-WebSocket-Version 13
server fulljs_admin_ws weight 1 maxconn 1024


Peripheral assembly manual

CO2 Off-Gas Sensor (mx200 board)

Required parts:

  • TTL-232R-3V3-WE or TTL-232RG-VREG3V3-WE or TTL-232RG-VSW3V3-WE (1pcs) (3.3V USB to UART cable)
  • SprintIR®-W 5% CO2 Sensor (1pcs)

O2 Off-Gas Sensor (gss board)

Required parts:

  • TTL-232R-3V3-WE or TTL-232RG-VREG3V3-WE or TTL-232RG-VSW3V3-WE (1pcs) (3.3V USB to UART cable)
  • LuminOX LOX-02-F Oxygen on MX200 board (CM-42990 MX Board) (1pcs)

Mass flow controller

Required parts:

  • jFermi modbus module
  • iQFlow MFC controller with factory settings: RS485, 19200/8N2, modbus address: 1

Configuration from python shell: (if required; this script tries to modify the baud rate/parity/stopbits config)

from pymodbus.client.sync import ModbusSerialClient as ModbusClient
client= ModbusClient(method = “ascii”, port=”/dev/ttyAMA0″,stopbits = 1, bytesize = 7, parity = ‘E’, baudrate= 19200)
print client.read_holding_registers(0xa, count=1, unit=1).registers
client.write_registers(0xa, [64], unit=1)
client.write_registers(0xfc40, [1], unit=1)
client.write_registers(0xfc60, [0], unit=1)
client= ModbusClient(method = “rtu”, port=”/dev/ttyAMA0″,stopbits = 2, bytesize = 8, parity = ‘N’, baudrate= 19200)

Pump controller

Required parts:

  • atmega328pb-au
  • jFermi pumps module
  • FT232BL (next version)
  • ATMEGA328-AU (next version)