You’ll need a rasbpiOs image, and the kernel and dtb for qemu
The downloaded img is resized on the SD card during the installation. We will need more space on the img. Qemu has command for that :
qemu-img resize rpi.img +1G
Log-in : rpi Password : raspberry
Login as root :
sudo su
Create udev rules :
cat << EOF > /etc/udev/rules.d/42-rs485.rules
SUBSYSTEMS=="usb-serial", DRIVERS=="ftdi_sio", SYMLINK+="rs485"
EOF
apt install git sqlite3 python3-pip python3-click python3-requests python3-netifaces python3-serial
Deploy pyHeatpump. Replace MONITORING_SERVER with the address of your server :
mkdir /var/lib/pyheatpump
echo 'pip3 install --upgrade git+https://git.yannweb.net/cli/pyHeatpump.git' > /var/lib/pyheatpump/pyheatpump_upgrade.sh
chmod +x /var/lib/pyheatpump/pyheatpump_upgrade.sh
/var/lib/pyheatpump/pyheatpump_upgrade.sh
cat << EOF > /var/lib/pyheatpump/pyheatpump.sql
CREATE TABLE IF NOT EXISTS var_type (
slabel CHAR(1) UNIQUE PRIMARY KEY,
label VARCHAR(10) UNIQUE,
type VARCHAR(10) NOT NULL,
start_address INT NOT NULL DEFAULT 0,
end_address INT NOT NULL DEFAULT 250
);
CREATE TABLE IF NOT EXISTS variable (
type CHAR(1) NOT NULL,
address INT NOT NULL,
unit VARCHAR(5) NULL,
last_update INT NULL,
FOREIGN KEY (type) REFERENCES var_type(slabel)
ON DELETE CASCADE,
PRIMARY KEY(type, address)
);
CREATE TABLE IF NOT EXISTS var_value (
type CHAR(1) NOT NULL,
address INT NOT NULL,
time INT DEFAULT (strftime('%s', datetime('now'))),
value INT NOT NULL,
FOREIGN KEY (type) REFERENCES variable(type)
ON DELETE CASCADE,
FOREIGN KEY (address) REFERENCES variable(address)
ON DELETE CASCADE,
PRIMARY KEY(type, address, time)
);
INSERT INTO var_type (slabel, label, type, start_address, end_address) VALUES (
'A', 'Analog', 'float', 1, 5000);
INSERT INTO var_type (slabel, label, type, start_address, end_address) VALUES (
'I', 'Integer', 'int', 5002, 10002);
INSERT INTO var_type (slabel, label, type, start_address, end_address) VALUES (
'D', 'Digital', 'bool', 1, 2048);
CREATE TRIGGER variable_last_update AFTER INSERT ON var_value
FOR EACH ROW
BEGIN
UPDATE variable
SET last_update = NEW.time
WHERE
type = NEW.type
AND
address = NEW.address;
END;
EOF
sqlite3 -init /var/lib/pyheatpump/pyheatpump.sql /var/lib/pyheatpump/pyheatpump.sqlite3
cat << EOF > /var/lib/pyheatpump/pyheatpump.ini
[heatpump]
database = /var/lib/pyheatpump/pyheatpump.sqlite3
serial_port = /dev/rsa485
[supervisor]
scheme = https
host = MONITORING_SERVER
port = 8081
post_path = /Symfony/web/app_dev.php/boardws/insert
get_path = /Symfony/web/app_dev.php/boardws/orders
interval = 60
heatpump_id = 42
[api]
host = 0.0.0.0
port = 80
EOF
cat << EOF > /var/lib/pyheatpump/pyheatpump_api.service
[Unit]
Description=API to fetch data from heatpump with HTTP
After=network.target
[Service]
Type=simple
WorkingDirectory=/var/lib/pyheatpump/
Environment="LOGLEVEL=INFO"
ExecStart=/usr/bin/env pyheatpump run
KillMode=mixed
TimeoutStopSec=30
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
cat << EOF > /var/lib/pyheatpump/pyheatpump_fetch.service
[Unit]
Description=pyHeatpump fetch - retrieve the data from the serial port with modbus
Wants=dev-rs485.device
[Service]
Type=simple
WorkingDirectory=/var/lib/pyheatpump/
Environment="LOGLEVEL=INFO"
ExecStart=/usr/bin/env pyheatpump fetch -t D -t A -t I
ExecStop=/usr/bin/env pyheatpump supervise --since
KillMode=mixed
TimeoutStopSec=30
PrivateTmp=true
EOF
cat << EOF > /var/lib/pyheatpump/pyheatpump_fetch.service
[Unit]
Description=Timer to launch pyheatpump fetch every minute
[Timer]
OnStartSec=15sec
OnUnitInactiveSec=1m
[Install]
WantedBy=timers.target
EOF
cd /etc/systemd/system
ln -s /var/lib/pyheatpump/pyheatpump_api.service
ln -s /var/lib/pyheatpump/pyheatpump_fetch.service
ln -s /var/lib/pyheatpump/pyheatpump_fetch.timer
systemctl daemon-reload
systemctl enable pyheatpump_api.service pyheatpump_fetch.timer pyheatpump_supervise.timer
You may now reboot to see if everything works.