Installare 123Solar e meterN su NAS Synology con Docker

123Solar è un’app per logging di inverter fotovoltaici e meterN è un’app per misurazione e monitoraggio per gestione energetica, che può essere usata anche per monitorare altri sensori, tipo: acqua, gas, temperatura, ecc…

Ho realizzato una immagine Docker auto-configurante per eseguire entrambi i software, disponibile pubblicamente sui miei repository GitHub e Docker Hub, dove sono disponibili ulteriori informazioni tecniche riguardo questa immagine.

In questo articolo spiegherò come installare un container basato sulla mia immagine su un NAS Synology.

Crediti

Sia 123Solar che meterN sono sviluppati da Jean-Marc Louviaux e sono basate su interfacce Web con un backend in PHP e shell script.

Il programma SDM120C usato per leggere i contatori via ModBus è sviluppato da Gianfranco Di Prinzio.

Alcune degli script di interfaccia usati dalle Web apps per collezionare i dati sono sviluppati e manutenuti da Flavio Anesi. Flavio ha inoltre pubblicato molte guide veramente dettagliate e ben fatte, che ricoprono l’intero setup di queste due Web apps. Vi suggerisco di leggerle se non avete già praticità con gli strumenti, in quando la mia guida copre solamente l’installazione su NAS ed una configurazione base.

Pacchetti necessari su NAS

Prima di tutto, occorre installare questi pacckatti:

  • Docker
  • Domoticz

Docker è disponibile sul repository ufficiale Synology.
Domoticz, invece, è scaricabile su jadahl.com

Suggerisco di scaricare l’ultima versione stabile, che al momento di pubblicazione di questa guida è: Domoticz Stable V4.9700 for DSM 6.2.
Non serve la versione Python, solo il pacchetto Domoticz.

Una volta scaricato il pacchetto, installarlo sul NAS con la funzione Manual install su Package Center.

Non è necessario che il pacchetto Domoticz sia in esecuzione (lasciatelo pure stoppato). Ci serve solamente per ottenere librerie e moduli kernel per accedere all’interfaccia USB>RS485.

Installare i moduli kernel

Connettersi al NAS via SSH, con utente root, ed inserire questi comandi per caricare i moduli kernel necessari all’accesso all’interfaccia USB>RS485:

insmod /lib/modules/usbserial.ko
insmod /lib/modules/ftdi_sio.ko
insmod /volume1/\@appstore/domoticz/modules/cp210x.ko

Dopo di che collegare l’interfaccia USB>RS485 al NAS, lanciare il comando ls -l /dev/ttyUSB0 e verificare che appaia /dev/ttyUSB0 come da screenshot:

Se tutto ok, scrivere il seguente script che caricherà i moduli kernel all’avvio del NAS.
vi /usr/local/etc/rc.d/usbserial.sh

#!/bin/bash
MODULES_UNLOAD="cp210x.ko ftdi_sio.ko usbserial.ko"

start_modules(){
    echo "--- Load modules ---"
    echo "Loading usbserial.ko"
    insmod /lib/modules/usbserial.ko
    echo "Loading ftdi_sio.ko"
    insmod /lib/modules/ftdi_sio.ko
    echo "Loading cp210x.ko"
    insmod /volume1/\@appstore/domoticz/modules/cp210x.ko
}

stop_modules(){
    echo "--- Unload modules ---"
    for i in $MODULES_UNLOAD; do
        echo "Unloading $i"
        rmmod $i
    done
}

case "$1" in
start)
    start_modules
    ;;
stop)
    stop_modules
    ;;
*)
    echo "usage: $0 { start | stop }" >&2
    exit 1
    ;;
esac

Se avete difficoltà ad usare vi, leggete questa semplice guida.

Ora date i permessi di esecuzione allo script appena creato:

chmod 755 /usr/local/etc/rc.d/usbserial.sh

Per verificare che sia tutto ok, riavviate il NAS e verificate nuovamente che appaia /dev/ttyUSB0 nei device dopo il riavvio.

Ora il NAS è in grado di accedere al TTY dell’interfaccia USB>RS485. Non abbiamo strettamente bisogno di questa funzione sul NAS, ma è l’unico modo per evitare di far funzionare il container Docker in modalità privileged (non vogliamo che il container abbia accesso completo alle risorse del NAS! Solo accesso alla interfaccia USB>RS485).

Creare il container per 123Solar/meterN

Ora che la configurazione del NAS è completata, possiamo procedere alla creazione del container.

Siccome l’app web di Synology per Docker ha alcune limitazioni (es. non si possono mappare i device), usiamo questo semplice comando per creare il nuovo container:

SERVER_PORT=10080 && \
USB_DEVICE=/dev/ttyUSB0
docker create --name 123Solar-meterN \
--restart unless-stopped \
--device=$USB_DEVICE:rwm \ --volume 123solar_config:/var/www/123solar/config \ --volume 123solar_data:/var/www/123solar/data \ --volume metern_config:/var/www/metern/config \ --volume metern_data:/var/www/metern/data \ -p $SERVER_PORT:80 \ edofede/123solar-metern:latest

Questo comando scarica l’ultima versione della mia immagine Docker dal repository ufficiale e crea il nuovo container, mappando i volumi persistenti, esportando la porta TCP e montando l’interfaccia USB.
Cambiare il primo parametro, se si vuole raggiungere 123Solar e meterN su una porta differente (attenzione, non usare la porta 80 perché viene già allocata dal NAS per la redirect verso la porta DSM).

Una volta creato il container, è possibile gestirlo (start, stop, vedere stato e log) dall’app web di Synology per Docker:

Primo accesso

Le app sono disponibili a questi indirizzi:

http://<Docker host/IP>:<SERVER_PORT>/123solar/
http://<Docker host/IP>:<SERVER_PORT>/metern/

Esempio (il mio caso):

http://nas.local:10080/123solar/
http://nas.local:10080/metern/


Password di amministrazione

Gli account di default per accedere ai pannelli di amministrazione sono Username: admin Password: admin

E’ possibile cambiare le password successivamente, lanciando questo comando:

docker exec -i -t 123Solar-meterN bash -c 'printf "admin:$(openssl passwd -crypt)\n" > /var/www/123solar/config/.htpasswd && cp /var/www/123solar/config/.htpasswd /var/www/metern/config/.htpasswd'

 

Aggiornamenti e ricostruzione del container

Il container controllerà ed eseguirà in automatico gli aggiornamenti di 123Solar e meterN all’avvio (è possibile controllare lo stato nei log del container).

Siccome tutte le configurazioni ed i dati raccolti sono immagazzinati in volumi permanenti con nome, potete tranquillamente cancellare e ricreare il container se necessario. Tutte le configurazioni ed i dati saranno mantenuti e saranno nuovamente disponibile quando verrà ricreato il container.

Attenzione: tutti i file modificati al di fuori delle directory config e data (presenti dentro le directory 123solar e metern) non sono salvati su un volume persistente, quindi verranno persi in caso di ricostruzione del container.

Setup di meterN su ModBus

Ho incluso un template di esempio del file config_daemon.php (fornito da Flavio) che punta all’indirizzo 2 del contatore ModBus. Se il vostro contatore ha indirizzo, velocità o porta USB differente, modificare questa:

exec("pooler485 2 9600 /dev/ttyUSB0 > /dev/null 2>/dev/null &");

usando questo comando mentre il container è in esecuzione:

docker exec -i -t 123Solar-meterN nano /var/www/metern/config/config_daemon.php

(e riavviare il container dopo la modifica)

Se avete più di un contatore sulla stessa linea RS485, potete aggiungere gli ID dei contatori, separati da virgole, nel file config_daemon.php come spiegato da Flavio nel suo tutorial, ad esempio:

exec('pooler485 1,2,3 9600 /dev/ttyUSB0 > /dev/null 2>/dev/null &');

 

Disattivare 123Solar o meterN

Nel caso dobbiate utilizzare solo una delle due Web app, è possibile disattivare l’avvio dell’altra, evitando così di caricare la CPU con il processo di polling.

Per disattivare il polling di 123Solar, lanciare questo comando:

docker exec -i -t 123Solar-meterN sed -i '1 aexit(0);' /var/www/123solar/scripts/boot123s.php

 

Per disattivare il polling di meterN, lanciare questo comando:

docker exec -i -t 123Solar-meterN sed -i '1 aexit(0);' /var/www/metern/scripts/bootmn.php

 

Accesso a shell del container

Se avete necessità di editare alcuni file o configurazione all’interno del container, potete accedervi semplicemente via shell, usando questo comando mentre è avviato:

docker exec -i -t 123Solar-meterN bash

 

Dettagli su immagine Docker

L’immagine è basata su Alpine linux per ridurre al minimo le dimensioni ed è composta principalmente da:

  • runit init scheme and service supervision
  • Nginx web server
  • PHP-FPM gestore processi FastCGI ed interprete PHP

Tutti i componenti vengono configurati automaticamente dall’immagine Docker.