ITCooky Recetas

Vamos a cocinar it cositas

¡DCPD: un duplicador de unidades flash y una copiadora en HDD SATA, con acceso a archivos a través de Wi-Fi, en Node-Red y Raspberry Pi 4!

дата junio 27, 2020

Hoy haré un clásico el DCPD: «Dooms Content Party Device» ese termino lo acabo de inventar ahorita, qizas se hace viral. Este dispositivo es para Internet Wi-Fi sin conexión, con un método de trafico de contenido con unidades flash USB. Internet off-line en Cuba (Irán, China) funciona mediante el trafico de discos duros y conectándolos a la PC, pero sería mucho más conveniente conectarse a través de Wi-Fi.

Cómo funcionará:
1. Connectate a la red Wi-Fi itcook – creado por DCPD
2. Vaya al menú DCPD en http://10.100.10.1:1880/ui
3. Conecte la unidad flash USB a DCPD , a través del menú, cópiela en el HDD interno

4. Comparta HDD o unidad flash, ¡también a través del menú web!
5. Desactive DCPD también a través del menú, debe esperar hasta cuando la luz verde deja de parpadear, y puede presionar el botón grande hasta el fondo y esperar hasta que se apague.

La base será la Raspberry Pi 4, pero habra mas hardware!

Los shields están bien pensados, se insertan en la caja con un sándwich de este tipo, ¡pero no hay acceso a la SD de frambuesa!

Tomo X825 2.5″ SATA HDD/SSD Shield y X735 V2.1 Power Management Board! Deben estar conectados como se muestra en las imágenes en el sitio – resulta que la energía pasa a través de los conectores 5v OUT – a principio he conectado a 5v IN en la placa con un ventilador – ¡no se quemó pero tampoco funcionó!




CUIDADO: X825 cuando se usa USB crea tal interferencia que el Wi-Fi 2.4Hz en raspberry deja de funcionar! ¡Los fabricantes de placas de identificación aconsejan encender el wifi de 5Hz o mejor no usarlo en absoluto!

Dicen:
We found that USB 3.0 high-speed transmission will interfere with the Raspberry Pi’s 2.4G wifi signal. So when install the pi in the case, if you find the 2.4G signal is unstable, please try to use WIFI 5G AP. (Please refer to WiKi)
We think this is caused by the unreliability of the Raspberry Pi’s wifi design. If the Raspberry Pi Foundation reserves the SMA IPEX antenna interface, everything will become easier. We will also struggle to solve this issue in the future.

Por cierto, no es necesario tomar la placa de administración de energía X735 V2.1, ¡se puede sin ella!




La fuente de alimentación se necesita de 4A, ¡tengo esa!

Case como esteGeekworm Raspberry Pi 4 X825 Metal Case+Power Switch+Cooling Fan, Honeycomb Chassis Support X825 2.5 inch SATA SSD/HDD Shield & Raspberry Pi 4 Model B & X735





Hay pocos tornillos con la carcasa, ¡tuve que encontrar unos mas en mis ahorros! Botón un clic – enciéndalo, mantenga presionado – ¡apáguelo! El X825 está conectado a través de un adaptador USB, tape el enchufe de alimentación de DC en el X735 para no enchufarlo accidentalmente, ¡pero todos los conectores usb en esta placa se usan para energía!

Es necesario instalar Raspberry Pi OS (32 bits) Lite (anteriormente conocido como Raspbian) en esta versión no hay entorno desktop.

Descarguelo aqui www.raspberrypi.org/downloads/raspbian/
Aqui el instaladoe https://www.raspberrypi.org/downloads/

Para que ssh funcione, en el SD en la sección BOOT, debe crear un archivo llamado ssh y luego funcionará. Después de eso, puede insertar la tarjeta en la frambuesa, conectar el cable de ethernet, encenderlo y ver qué IP obtuvo (yo miré en mi enrutador), también puede ir a la frambuesa con las manos y ver IP con el comando
ifconfig

Name: pi
Password: raspberry

Veré qué tipo de modelo tengo
cat /sys/firmware/devicetree/base/model

Raspberry Pi 4 Model B Rev 1.2

Veamos cuanta memoria
free -h

              total        used        free      shared  buff/cache   available
Mem:          3.8Gi        90Mi       3.5Gi       8.0Mi       242Mi       3.6Gi
Swap:          99Mi          0B        99Mi

о 4Gb!

Actualizar el software, siempre es útil
sudo apt update
sudo apt full-upgrade

Tengo un disco duro SATA formateado en ext4, si necesita NTFS instale
sudo apt-get install ntfs-3g

Hago un directorio para él y monto
sudo mkdir /mnt/hdd
sudo mount /dev/sda1 /mnt/hdd

Verifico la velocidad pura del HDD: ¡escribe el archivo creado por el sistema!
sudo dd if=/dev/zero of=test.file count=10000 bs=1048576

Muestra fantásticos 100 MB mucho más que las unidades flash USB, ¡algún tipo de error – quizas!

10485760000 bytes (10 GB, 9.8 GiB) copied, 104.358 s, 100 MB/s

Copio el archivo a la unidad flash USB
pv /mnt/hdd/test.file > /mnt/usb1/test.file

Obtengo las velocidades típicas para una unidad flash, lo que significa que la última unidad flash es mucho más lenta que la antigua HDD también conectada a través de USB3

9.77GiB 0:07:18 [22.8MiB/s] [================================>] 100%

Como montar disko duro en el arranque
Para hacer esto, vea información adicional
sudo blkid
buscando un signo secundario de nuestro HDD

/dev/sda1: UUID="289717cc-b3ec-4f12-9ae5-318b52a57a22" TYPE="ext4" PARTUUID="90909090-01"

Lo conecté primero a USB, por eso es sda

ATENCIÓN: ¡El montaje automático de unidades USB en el arranque en Raspberry no funciona!

Modo oficial
www.raspberrypi.org/documentation/configuration/external-storage.md
agregar una línea a
sudo vi /etc/fstab
esa

UUID=289717cc-b3ec-4f12-9ae5-318b52a57a22 /mnt/hdd ext4 defaults,noatime,auto 0 0

NO FUNCIONA

Hay muchas víctimas del mismo problema aca
www.raspberrypi.org/forums/viewtopic.php?f=28&t=9949

Funcionó así por poco tiempo
Hay que agregar al cron
sudo crontab -e
добавить вот такую конструкциюeso

@reboot root  /bin/bash -c 'sleep 10 &&sudo /bin/mount -U 289717cc-b3ec-4f12-9ae5-318b52a57a22 /mnt/hdd'

NO FUNCIONA

Se montará en el arranque ejecutando un comando desde Node-Red, literalmente un hilo, ¡ejecute una vez al inicio, script hdd_m.sh!

Hacemos un punto de acceso Wi-Fi de raspberry
Todo está perfectamente descrito aquí https://learn.sparkfun.com/tutorials/setting-up-a-raspberry-pi-3-as-an-access-point/all ¡para RPI4 solo se necesita agregar un comando mas!

Sin embargo, primero debe actualizar, sun ello no se instala
sudo apt-get update
sudo apt install dnsmasq hostapd

igual no, pero asi si
sudo apt install dnsmasq hostapd --fix-missing

Se instalo, luego hay que editar muchas cosas
sudo vi /etc/dhcpcd.conf
Agrego

denyinterfaces wlan0

sudo vi /etc/network/interfaces
Agrego

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet static
    address 10.100.10.1
    netmask 255.255.255.0
    network 10.100.10.0
    broadcast 10.100.10.255

sudo vi /etc/hostapd/hostapd.conf
Agrego

interface=wlan0
driver=nl80211
ssid=Itcooky
hw_mode=a
channel=40
ieee80211n=1
wmm_enabled=1
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_passphrase=QWErty123
rsn_pairwise=CCMP

Aquí ajustes para Wi-Fi de 5Hz. Tomé el canal mirando primero cuales hay
iw list

sudo vi /etc/default/hostapd
Agrego

DAEMON_CONF="/etc/hostapd/hostapd.conf"

sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.bak
sudo vi /etc/dnsmasq.conf

Agrego

interface=wlan0 
listen-address=10.100.10.1
bind-interfaces 
server=8.8.8.8
#address=/#/10.100.10.1
domain-needed
bogus-priv
dhcp-range=10.100.10.10,10.100.10.250,24h

Arranco
sudo systemctl start dnsmasq
sudo systemctl unmask hostapd
sudo systemctl enable hostapd
sudo systemctl start hostapd

Y para RPI4 todavía necesitas hacer
sudo rfkill unblock wlan
Check si aun es bloqueado
sudo rfkill list

Reboot
sudo reboot

Puede ver cómo se inició AP con comando
sudo service hostapd status

Como instalar NGINX
Solo necesitas comenzar la instalación
sudo apt install nginx
y arrancar
sudo /etc/init.d/nginx start

Los archivos de la página web están aquí
cd /var/www/html
vamos ahi
Hago una carpeta
sudo mkdir ./data
y hago una página
vi index.html
con texto

<!DOCTYPE html>
<html>
<head>
<title>Welcome DCPD!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
                                              
Files are available at <a href="./data"> this folder</a><br> 

</body>
</html>

nada especial solo un enlace a carpeta data

edito configuraciones de sitios nginx
sudo vi /etc/nginx/sites-available/default
la parte de location debe ser asi

location / {
try_files $uri $uri/ =404;
autoindex on;
sendfile on;
tcp_nopush on;
}

autoindex es vital, lo demas mejor que esten

restart
sudo service nginx reload

Como instalar Node Red
Para RPI hay un manuel de los rojos mismos
https://nodered.org/docs/getting-started/raspberrypi

hay que hacer
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
Y para que start en boot
sudo systemctl enable nodered.service

Es todo, entramos a http://your_ip4:1880 y hagamos lo que nos apetece

En Node-Red hay que instalar node-red-dashboard

DCPD en Node-red
Cuadro con todos los ladrillos

code

[{"id":"b44d7514.83389","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"54fb509b.2c2ed","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/first_m.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":650,"y":160,"wires":[["becfcd98.7c18f"],[],[]]},{"id":"e32b03af.b293f","type":"ui_text","z":"b44d7514.83389","group":"7f5c3aa5.c49854","order":1,"width":0,"height":0,"name":"","label":"Size of data:","format":"{{msg.payload}}Mb","layout":"row-left","x":1430,"y":160,"wires":[]},{"id":"58b931c3.744ac8","type":"ui_button","z":"b44d7514.83389","name":"","group":"7f5c3aa5.c49854","order":3,"width":3,"height":1,"passthru":false,"label":"Mount","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"","x":410,"y":160,"wires":[["54fb509b.2c2ed"]]},{"id":"4de280ba.95e15","type":"switch","z":"b44d7514.83389","name":"","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"asize","vt":"str"},{"t":"cont","v":"label","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":1010,"y":200,"wires":[["cea5bb16.b5a5a8"],["cedce86d.2aa818"]]},{"id":"cea5bb16.b5a5a8","type":"split","z":"b44d7514.83389","name":"","splt":"#","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":1150,"y":180,"wires":[["e32b03af.b293f"]]},{"id":"284f5a3e.56b85e","type":"ui_text","z":"b44d7514.83389","group":"7f5c3aa5.c49854","order":2,"width":0,"height":0,"name":"","label":"Label:","format":"{{msg.payload}}","layout":"row-left","x":1450,"y":220,"wires":[]},{"id":"cedce86d.2aa818","type":"split","z":"b44d7514.83389","name":"","splt":"#","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":1150,"y":220,"wires":[["284f5a3e.56b85e"]]},{"id":"becfcd98.7c18f","type":"split","z":"b44d7514.83389","name":"","splt":";","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":890,"y":200,"wires":[["4de280ba.95e15"]]},{"id":"54348537.5cdffc","type":"ui_button","z":"b44d7514.83389","name":"","group":"7f5c3aa5.c49854","order":4,"width":3,"height":1,"passthru":false,"label":"Un mount","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"","x":420,"y":240,"wires":[["e2c3bf55.06fee"]]},{"id":"e2c3bf55.06fee","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/first_unm.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":660,"y":240,"wires":[["becfcd98.7c18f"],[],[]]},{"id":"826e7da6.89bc","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/second_m.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":660,"y":440,"wires":[["5ca805f5.1e5734"],[],[]]},{"id":"ee6a802b.3ad798","type":"ui_text","z":"b44d7514.83389","group":"ec3ace8.c36b93","order":4,"width":0,"height":0,"name":"","label":"Free size:","format":"{{msg.payload}}Mb","layout":"row-left","x":1740,"y":440,"wires":[]},{"id":"baa5392d.c28648","type":"ui_button","z":"b44d7514.83389","name":"","group":"ec3ace8.c36b93","order":6,"width":3,"height":1,"passthru":false,"label":"Mount","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"","x":110,"y":480,"wires":[["44a7e2f8.c28bcc"]]},{"id":"bda8585a.0472e8","type":"switch","z":"b44d7514.83389","name":"","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"asize","vt":"str"},{"t":"cont","v":"label","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":1430,"y":500,"wires":[["6b20dc3b.1afd9c"],["ce94c5f1.65b9b"]]},{"id":"6b20dc3b.1afd9c","type":"split","z":"b44d7514.83389","name":"","splt":"#","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":1590,"y":440,"wires":[["ee6a802b.3ad798"]]},{"id":"ce94c5f1.65b9b","type":"split","z":"b44d7514.83389","name":"","splt":"#","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":1570,"y":560,"wires":[["9c6e90db.4c53d"]]},{"id":"bc7259c4.a27fd","type":"split","z":"b44d7514.83389","name":"","splt":";","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":1290,"y":500,"wires":[["bda8585a.0472e8"]]},{"id":"3592ca8.0bf7db6","type":"ui_button","z":"b44d7514.83389","name":"","group":"ec3ace8.c36b93","order":5,"width":3,"height":1,"passthru":false,"label":"Un mount","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"","x":120,"y":680,"wires":[["53cc1acc.29cfa4"]]},{"id":"692f75d5.160f24","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/second_unm.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":670,"y":600,"wires":[["bc7259c4.a27fd"],[],[]]},{"id":"154aa879.197de","type":"ui_button","z":"b44d7514.83389","name":"","group":"2fa9608d.2ce59","order":1,"width":0,"height":0,"passthru":false,"label":"Start copy","tooltip":"","color":"","bgcolor":"","icon":"","payload":"reset","payloadType":"str","topic":"","x":120,"y":880,"wires":[["2350a3d8.a3042c"]]},{"id":"611d713d.726e48","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/copytousb.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":660,"y":840,"wires":[["44ed3481.f21c14"],[],[]]},{"id":"9abe71d5.48763","type":"ui_text","z":"b44d7514.83389","group":"2fa9608d.2ce59","order":2,"width":0,"height":0,"name":"","label":"","format":"Coping to folder /{{msg.payload}}","layout":"row-left","x":1490,"y":800,"wires":[]},{"id":"fdd997bc.69107","type":"ui_gauge","z":"b44d7514.83389","name":"","group":"2fa9608d.2ce59","order":3,"width":6,"height":5,"gtype":"donut","title":"","label":"%","format":"{{value}}","min":0,"max":"100","colors":["#d1de24","#27eb20","#96002e"],"seg1":"","seg2":"","x":1490,"y":900,"wires":[]},{"id":"7ee0395c.eba5b","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/speedtousb.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":660,"y":780,"wires":[["fdd997bc.69107","a0ec9eaa.97de38"],[],[]]},{"id":"5ca805f5.1e5734","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/second_i.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":1020,"y":400,"wires":[["bc7259c4.a27fd"],[],[]]},{"id":"207aabab.8d4fc4","type":"inject","z":"b44d7514.83389","name":"","topic":"null on start","payload":" ","payloadType":"str","repeat":"","crontab":"","once":true,"onceDelay":0.1,"x":290,"y":60,"wires":[["e32b03af.b293f","284f5a3e.56b85e","ee6a802b.3ad798","fdd997bc.69107","9abe71d5.48763","9c6e90db.4c53d","784ef6f.b469208","692f75d5.160f24","e2c3bf55.06fee","b1afc99b.13cf3","b9d1c272.195b7"]]},{"id":"7fd33d21.b6d0dc","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/rpitemp.sh","addpay":true,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":650,"y":1260,"wires":[["3ad9aa64.4a2d8e","d640f229.9bb7d8"],[],[]]},{"id":"3ad9aa64.4a2d8e","type":"ui_text","z":"b44d7514.83389","group":"2fa9608d.2ce59","order":4,"width":0,"height":0,"name":"","label":"Rpi4","format":"{{msg.payload}}","layout":"row-left","x":1030,"y":1260,"wires":[]},{"id":"3b1fe249.a09c66","type":"inject","z":"b44d7514.83389","name":"","topic":"","payload":"","payloadType":"date","repeat":"5","crontab":"","once":false,"onceDelay":0.1,"x":290,"y":1260,"wires":[["7fd33d21.b6d0dc"]]},{"id":"a0ec9eaa.97de38","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/sizeusb2.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":1020,"y":760,"wires":[["6b20dc3b.1afd9c"],[],[]]},{"id":"44ed3481.f21c14","type":"switch","z":"b44d7514.83389","name":"","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"pathonusb","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":1110,"y":840,"wires":[["2ed432f3.bb44be"]]},{"id":"2ed432f3.bb44be","type":"split","z":"b44d7514.83389","name":"","splt":"#","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":1250,"y":840,"wires":[["9abe71d5.48763"]]},{"id":"784ef6f.b469208","type":"ui_switch","z":"b44d7514.83389","name":"","label":"Change device","tooltip":"","group":"ec3ace8.c36b93","order":1,"width":4,"height":1,"passthru":false,"decouple":"false","topic":"","style":"","onvalue":"USB","onvalueType":"str","onicon":"","oncolor":"","offvalue":"HDD","offvalueType":"str","officon":"","offcolor":"","x":140,"y":340,"wires":[["a31b3fd4.9cc7f8"]]},{"id":"a31b3fd4.9cc7f8","type":"ui_text_input","z":"b44d7514.83389","name":"","label":"","tooltip":"","group":"ec3ace8.c36b93","order":2,"width":2,"height":1,"passthru":true,"mode":"text","delay":300,"topic":"","x":320,"y":340,"wires":[["ed35d989.5704a8"]]},{"id":"50d5e407.b78d34","type":"switch","z":"b44d7514.83389","name":"","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"USB","vt":"str"},{"t":"cont","v":"HDD","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":470,"y":480,"wires":[["826e7da6.89bc"],["b1afc99b.13cf3"]]},{"id":"ed35d989.5704a8","type":"function","z":"b44d7514.83389","name":"set device","func":"flow.set(\"device\", msg.payload);\nreturn msg;","outputs":1,"noerr":0,"x":480,"y":340,"wires":[["259daa89.779ae6"]]},{"id":"44a7e2f8.c28bcc","type":"function","z":"b44d7514.83389","name":"get device","func":"var devicenow=flow.get('device');\nmsg.payload = devicenow;\nreturn msg;","outputs":1,"noerr":0,"x":310,"y":480,"wires":[["50d5e407.b78d34"]]},{"id":"9c6e90db.4c53d","type":"ui_text","z":"b44d7514.83389","group":"ec3ace8.c36b93","order":3,"width":0,"height":0,"name":"","label":"Label:","format":"{{msg.payload}}","layout":"row-left","x":1710,"y":560,"wires":[]},{"id":"72b628a5.3a4428","type":"switch","z":"b44d7514.83389","name":"","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"USB","vt":"str"},{"t":"cont","v":"HDD","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":450,"y":680,"wires":[["692f75d5.160f24"],["6ae4a387.df2e4c"]]},{"id":"53cc1acc.29cfa4","type":"function","z":"b44d7514.83389","name":"get device","func":"var devicenow=flow.get('device');\nmsg.payload = devicenow;\nreturn msg;","outputs":1,"noerr":0,"x":310,"y":680,"wires":[["72b628a5.3a4428"]]},{"id":"2350a3d8.a3042c","type":"function","z":"b44d7514.83389","name":"get device","func":"var devicenow=flow.get('device');\nmsg.payload = devicenow;\nreturn msg;","outputs":1,"noerr":0,"x":270,"y":880,"wires":[["d140870f.57773"]]},{"id":"d140870f.57773","type":"switch","z":"b44d7514.83389","name":"","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"USB","vt":"str"},{"t":"cont","v":"HDD","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":430,"y":880,"wires":[["611d713d.726e48","7ee0395c.eba5b"],["b72b953c.2d9cb","c1a4cd5b.269fc"]]},{"id":"b1afc99b.13cf3","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/hdd_m.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":650,"y":520,"wires":[["c7b788b2.4bcf2"],[],[]]},{"id":"c7b788b2.4bcf2","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/hdd_i.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":1010,"y":480,"wires":[["bc7259c4.a27fd"],[],[]]},{"id":"6ae4a387.df2e4c","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/hdd_unm.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":660,"y":700,"wires":[["bc7259c4.a27fd"],[],[]]},{"id":"259daa89.779ae6","type":"switch","z":"b44d7514.83389","name":"","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"USB","vt":"str"},{"t":"cont","v":"HDD","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":630,"y":340,"wires":[["5ca805f5.1e5734"],["c7b788b2.4bcf2"]]},{"id":"b72b953c.2d9cb","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/copytohdd.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":660,"y":980,"wires":[["44ed3481.f21c14","c0eec119.31bec"],[],[]]},{"id":"c1a4cd5b.269fc","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/speedtohdd.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":670,"y":920,"wires":[["49258e25.f61e68","fdd997bc.69107"],[],[]]},{"id":"49258e25.f61e68","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/sizehdd.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":1010,"y":960,"wires":[["6b20dc3b.1afd9c"],[],[]]},{"id":"c99b943e.6fe06","type":"ui_text","z":"b44d7514.83389","group":"2fa9608d.2ce59","order":5,"width":6,"height":2,"name":"","label":"Status:","format":"{{msg.payload}}","layout":"col-center","x":1720,"y":620,"wires":[]},{"id":"c0eec119.31bec","type":"split","z":"b44d7514.83389","name":"","splt":"","spltType":"str","arraySplt":"5","arraySpltType":"len","stream":true,"addname":"","x":1550,"y":640,"wires":[["c99b943e.6fe06"]]},{"id":"d640f229.9bb7d8","type":"ui_text","z":"b44d7514.83389","group":"707b8d3f.4cca2c","order":1,"width":0,"height":0,"name":"","label":"Rpi4","format":"{{msg.payload}}","layout":"row-left","x":1030,"y":1300,"wires":[]},{"id":"35bf4d1c.c49d4a","type":"ui_button","z":"b44d7514.83389","name":"","group":"707b8d3f.4cca2c","order":2,"width":0,"height":0,"passthru":false,"label":"Refresh","tooltip":"","color":"","bgcolor":"","icon":"","payload":"reset","payloadType":"str","topic":"","x":120,"y":1360,"wires":[["b9d1c272.195b7"]]},{"id":"b9d1c272.195b7","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/info.sh","addpay":false,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":640,"y":1360,"wires":[["f4498972.1504f8"],[],[]]},{"id":"c9a52cdb.f8b58","type":"ui_text","z":"b44d7514.83389","group":"707b8d3f.4cca2c","order":3,"width":0,"height":0,"name":"","label":"IP","format":"{{msg.payload}}","layout":"row-left","x":1270,"y":1360,"wires":[]},{"id":"93fdb1ad.1b7478","type":"switch","z":"b44d7514.83389","name":"","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"ip","vt":"str"},{"t":"cont","v":"mem","vt":"str"},{"t":"cont","v":"model","vt":"str"}],"checkall":"true","repair":false,"outputs":3,"x":950,"y":1380,"wires":[["b0f4b173.927a"],["9cba8fb1.0fabc8"],["3d8b8a8c.afaffe"]]},{"id":"b0f4b173.927a","type":"split","z":"b44d7514.83389","name":"","splt":"#","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":1090,"y":1360,"wires":[["c9a52cdb.f8b58"]]},{"id":"b7c9eda9.1212a","type":"ui_text","z":"b44d7514.83389","group":"707b8d3f.4cca2c","order":5,"width":0,"height":0,"name":"","label":"mem:","format":" {{msg.payload}}","layout":"row-left","x":1270,"y":1400,"wires":[]},{"id":"9cba8fb1.0fabc8","type":"split","z":"b44d7514.83389","name":"","splt":"#","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":1090,"y":1400,"wires":[["b7c9eda9.1212a"]]},{"id":"bf3ec8f2.346b4","type":"ui_text","z":"b44d7514.83389","group":"707b8d3f.4cca2c","order":4,"width":0,"height":0,"name":"","label":"Model","format":"{{msg.payload}}","layout":"row-left","x":1270,"y":1440,"wires":[]},{"id":"3d8b8a8c.afaffe","type":"split","z":"b44d7514.83389","name":"","splt":"#","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":1090,"y":1440,"wires":[["bf3ec8f2.346b4"]]},{"id":"f4498972.1504f8","type":"split","z":"b44d7514.83389","name":"","splt":";","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":810,"y":1360,"wires":[["93fdb1ad.1b7478"]]},{"id":"d479f53b.78bff8","type":"ui_button","z":"b44d7514.83389","name":"","group":"d5572a19.225908","order":2,"width":0,"height":0,"passthru":false,"label":"PC OFF","tooltip":"","color":"","bgcolor":"","icon":"","payload":"reset","payloadType":"str","topic":"","x":120,"y":1440,"wires":[["133de056.f4e3b"]]},{"id":"133de056.f4e3b","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/turnoff.sh","addpay":false,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":650,"y":1440,"wires":[[],[],[]]},{"id":"16bf75aa.55cafa","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/hdd_share.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":660,"y":1060,"wires":[["6fb97aed.b72a34"],[],[]]},{"id":"c1adcc1c.226c78","type":"ui_button","z":"b44d7514.83389","name":"","group":"78726cc2.066df4","order":1,"width":2,"height":1,"passthru":false,"label":"HDD","tooltip":"","color":"","bgcolor":"","icon":"","payload":"reset","payloadType":"str","topic":"","x":110,"y":1060,"wires":[["16bf75aa.55cafa"]]},{"id":"56f369c5.895058","type":"ui_text","z":"b44d7514.83389","group":"78726cc2.066df4","order":2,"width":4,"height":1,"name":"","label":"","format":" {{msg.payload}}","layout":"row-left","x":1130,"y":1060,"wires":[]},{"id":"6fb97aed.b72a34","type":"switch","z":"b44d7514.83389","name":"","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"status#","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":890,"y":1060,"wires":[["2812e8f6.70483"]]},{"id":"2812e8f6.70483","type":"split","z":"b44d7514.83389","name":"","splt":"#","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":1010,"y":1060,"wires":[["56f369c5.895058"]]},{"id":"9c39319d.588","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/usb1_share.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":670,"y":1140,"wires":[["f663586d.fdfdd8"],[],[]]},{"id":"ad7d6b05.18546","type":"ui_button","z":"b44d7514.83389","name":"","group":"78726cc2.066df4","order":3,"width":2,"height":1,"passthru":false,"label":"USB EXT","tooltip":"","color":"","bgcolor":"","icon":"","payload":"reset","payloadType":"str","topic":"","x":120,"y":1140,"wires":[["9c39319d.588"]]},{"id":"21843513.55ab5a","type":"ui_text","z":"b44d7514.83389","group":"78726cc2.066df4","order":4,"width":4,"height":1,"name":"","label":"","format":" {{msg.payload}}","layout":"row-left","x":1150,"y":1140,"wires":[]},{"id":"f663586d.fdfdd8","type":"switch","z":"b44d7514.83389","name":"","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"status#","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":910,"y":1140,"wires":[["35e52df5.f985da"]]},{"id":"35e52df5.f985da","type":"split","z":"b44d7514.83389","name":"","splt":"#","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":1030,"y":1140,"wires":[["21843513.55ab5a"]]},{"id":"7f5c3aa5.c49854","type":"ui_group","z":"","name":"USB EXT","tab":"636d4846.38f48","order":1,"disp":true,"width":"6","collapse":false},{"id":"ec3ace8.c36b93","type":"ui_group","z":"","name":"COPY TO","tab":"636d4846.38f48","order":2,"disp":true,"width":"6","collapse":false},{"id":"2fa9608d.2ce59","type":"ui_group","z":"","name":"START COPY","tab":"636d4846.38f48","order":3,"disp":true,"width":"6","collapse":false},{"id":"707b8d3f.4cca2c","type":"ui_group","z":"","name":"INFO","tab":"33d11786.1c9658","order":1,"disp":true,"width":"6","collapse":false},{"id":"d5572a19.225908","type":"ui_group","z":"","name":"TURN OFF","tab":"33d11786.1c9658","order":2,"disp":true,"width":"6","collapse":false},{"id":"78726cc2.066df4","type":"ui_group","z":"","name":"SHARE","tab":"636d4846.38f48","order":4,"disp":true,"width":"6","collapse":false},{"id":"636d4846.38f48","type":"ui_tab","z":"","name":"Media Control","icon":"dashboard","order":1,"disabled":false,"hidden":false},{"id":"33d11786.1c9658","type":"ui_tab","z":"","name":"DCPD","icon":"dashboard","order":2,"disabled":false,"hidden":false}]

Despues de agregarlo a Node-Red no olviden pulsar Deploy

Todos los archivos en un archivo
dcpd_files.zip

No describiré todos los ladrillos. ¡Lo principal aquí son los scripts que lanza el ladrillo exec! Explicaré solo dos lugares

1. Es el ladrillo dashboar switch - envía las palabras HDD o USB dependiendo de la posición del interruptor seleccionado.
2. Muestra inmediatamente el texto para dejar en claro lo que ahora está seleccionado
3. Esta es una función que se asigna a una variable global device lo que ahora está seleccionado

flow.set("device", msg.payload);
return msg;

4. Este es un conmutador que escucha lo que está en la secuencia y dirige por que camino debe seguir. Aquí necesitamos encontrar el espacio libre y la etiqueta del disco, por lo que estamos escuchando para quien hay que saberlo (HDD o SSD)
5. Esta es una función que toma el valor de una variable global device y lo manda adelante

var devicenow=flow.get('device');
msg.payload = devicenow;
return msg;


Los scripts liberan información textual, necesaria y no necesaria. Entonces sé que el script emitirá una línea ai label#hdd100;asize#51515

1. El ladrillosplit divide la línea, el divisor es ;
2. Busca las líneas necesarias para dirigir al lugar correcto. por ejemplo label#hdd100 la línea se dirigirá hacia el campo de texto label
3. Aquí dividimos nuevamente porque solo necesitamos el final de la línea, donde exactamente la etiqueta, el divisor es #
Asi como lo hago yo, quizas hay un modo mejor, pero no lo conozco!

En la carpeta /home/pi/ hay que hacer los scripts siguientes

first_m.sh - este script monta la primera unidad flash con la que copiaremos, después de hacer clic en el botón. ¡Y lo hace no solo así, sino que comprueba si el lugar para montar es libre y no importa qué letra haya recogido la unidad flash!

#!/bin/bash
if df -h | grep /mnt/usb1
then
echo "busy"
break
else
shdd=`df -h | grep /mnt/hdd | awk '{print $1}'`
for m1 in $( ls /dev/sd*[0-9]* )
do
if [ $shdd == $m1 ] 
then
echo "next"
else
sudo mount $m1 /mnt/usb1
label=`lsblk -o mountpoint,label| grep /mnt/usb1|awk '{print $2}'`
frees=`du -sm --exclude='.Trash*' /mnt/usb1| awk '{print $1}'`
echo "label#"$label";asize#"$frees
break
fi
done
fi

¡De sí mismo, este script lanza una línea con datos sobre el tamaño de los datos y la etiqueta de la unidad flash!

first_unm.sh - este script simplemente desmonta la unidad flash después de hacer clic en el botón

#!/bin/bash
sudo umount /mnt/usb1
echo "label#no usb flash;asize#0

second_m.sh - este script monta la segunda unidad flash

#!/bin/bash
hddid="289717cc-b3ec-4f12-9ae5-318b52a57a22"
hdddev=`blkid | grep $hddid | awk -F':' '{print $1}'`
echo $hdddev
if df -h | grep /mnt/usb2
then
echo "Busy"
else	
sdam=`df -h | grep usb1 | awk '{print $1}'`

echo $sdam
for m1 in $( ls /dev/sd*[0-9]* )
do
if [ $m1 != $sdam ] && [ $m1 != $hdddev ] 
then	
sudo mount $m1 /mnt/usb2
echo "ok"
break
fi
done
fi

aquí es importante completar el UUID para su HDD, ¡se mostró arriba cómo buscarlo!

second_i.sh - seguido de un script que proporciona información sobre la ubicación y la etiqueta disponibles de la unidad flash

#!/bin/bash
m1=`df -h | grep /mnt/usb2|awk '{print $1}'`
label=`lsblk -o mountpoint,label| grep /mnt/usb2|awk '{print $2}'`
frees=`df -m|grep $m1 | awk '{print $4}'`
echo "label#"$label";asize#"$frees

El script actualiza la información durante el montaje y cuando se cambia el interruptor Change device

second_unm.sh - esa secuencia de comandos simplemente desmonta la unidad flash después de hacer clic en el botón

#!/bin/bash
sudo umount /mnt/usb2
echo "label#no usb flash;asize#0"

Es bueno que para desmontar solo necesite conocer el nombre de la carpeta, no el dispositivo

En consecuencia, los mismos scripts específicamente para HDD
hdd_m.sh

#!/bin/bash
hddid="289717cc-b3ec-4f12-9ae5-318b52a57a22"
if df -h | grep /mnt/hdd/
then
echo "busy"
break
else
sudo mount -U $hddid /mnt/hdd 
echo "ok"
fi

Aquí, también, tiene su propio UUID único

hdd_i.sh

#!/bin/bash
m1=`df -h | grep /mnt/hdd|awk '{print $1}'`
label=`lsblk -o mountpoint,label| grep /mnt/hdd|awk '{print $2}'`
frees=`df -m|grep $m1 | awk '{print $4}'`
echo "label#"$label";asize#"$frees

hdd_unm.sh

#!/bin/bash
sudo umount /mnt/hdd/
echo "label#no hdd;asize#0

Los siguientes son los ladrillos responsables de copiar
copytohdd.sh - con solo tocar un botón, mira para ver si hay alguna unidad flash para copiar, mira para ver si hay disco duro y comienza a copiar en una nueva carpeta con el nombre de la fecha en que comenzó la copia.

#!/bin/bash
if df -h | grep /mnt/usb1
then
if df -h | grep /mnt/hdd
then
pathnew=`date +"%Y%m%d%H%M%S"`
echo "pathonusb#"$pathnew
sudo mkdir /mnt/hdd/$pathnew
sudo rsync -av  --exclude=".\Tra*" /mnt/usb1/* /mnt/hdd/$pathnew
fi
fi

speedtohdd.sh - maravilloso script, dibuja progress bar. Supervisa el cambio en el tamaño del espacio ocupado en la unidad flash, conoce el tamaño de los datos que deben copiarse. Pero de todos modos, es solo para visualización.

#!/bin/bash
fsize=`du -s --exclude='.Trash*' /mnt/usb1| awk '{print $1}'`
frees=`df -k | grep /mnt/hdd | awk '{print $3}'`
fres=0
ndelay=0
echo $fres
while [ $fres -lt 100 ]; do
fresold=$fres
frees2=`df -k | grep /mnt/hdd | awk '{print $3}'`
fres=`echo "(100*($frees2-$frees))/$fsize" | bc`
if [ $fres -gt 100 ]
then
fres=100
fi
if [ $fres -eq $fresold ]
then
let ndelay++
if [ $ndelay -gt 500 ]
then	
fres=100
fi
else
ndelay=0	
fi
echo $fres
done

Y script sizehdd.sh que actualiza informacion sobre lugar disponoble, se inicia junto con sdaspeed.sh

#!/bin/bash
m1=`df -h | grep /mnt/hdd|awk '{print $1}'`
frees=`df -m|grep $m1 | awk '{print $4}'`
echo "asize#"$frees

En consecuencia, los mismos scripts específicamente para copiar a USB
copytousb.sh

#!/bin/bash
if df -h | grep /mnt/usb1
then
if df -h | grep /mnt/usb2
then
pathnew=`date +"%Y%m%d%H%M%S"`
echo "pathonusb#"$pathnew
sudo mkdir /mnt/usb2/$pathnew
#sudo cp -rf /mnt/usb1/*  /mnt/usb2/$pathnew
sudo rsync -av  --exclude=".\Tra*" /mnt/usb1/* /mnt/usb2/$pathnew
fi
fi

speedtousb.sh

#!/bin/bash
fsize=`du -s --exclude='.Trash*' /mnt/usb1| awk '{print $1}'`
frees=`df -k | grep /mnt/usb2 | awk '{print $3}'`
fres=0
ndelay=0
echo $fres
while [ $fres -lt 100 ]; do
fresold=$fres
frees2=`df -k | grep /mnt/usb2 | awk '{print $3}'`
fres=`echo "(100*($frees2-$frees))/$fsize" | bc`
if [ $fres -gt 100 ]
then
fres=100
fi
if [ $fres -eq $fresold ]
then
let ndelay++
if [ $ndelay -gt 500 ]
then	
fres=100
fi
else
ndelay=0	
fi
echo $fres
done

sizeusb2.sh

#!/bin/bash
m1=`df -h | grep /mnt/usb2|awk '{print $1}'`
frees=`df -m|grep $m1 | awk '{print $4}'`
echo "asize#"$frees

Ahora las secuencias de comandos para compartir, solo agregue o elimine, si corresponde, un enlace simbólico a la carpeta del sitio.
usb1_share.sh

#!/bin/bash
if df -h | grep /mnt/usb1
then
if ls /var/www/html/data/usbext 
then
sudo rm /var/www/html/data/usbext
echo "status#Not shared"
else
echo "status#Shared"
sudo ln -s /mnt/usb1 /var/www/html/data/usbext
echo "status#Shared"
fi
else
sudo rm /var/www/html/data/usbext
echo "status#Not mounted"
fi

hdd_share.sh

#!/bin/bash
if df -h | grep /mnt/hdd
then
if ls /var/www/html/data/hdd 
then
sudo rm /var/www/html/data/hdd
echo "status#Not shared"
else
echo "status#Wait"
sudo ln -s /mnt/hdd /var/www/html/data/hdd
echo "status#Shared"
fi
else
sudo rm /var/www/html/data/hdd
echo "status#Not mounted"
fi

Script para leer temperaturas Raspberry rpitemp.sh

#!/bin/bash
vcgencmd measure_temp

Script para mostrar información sobre frambuesa
info.sh

#!/bin/bash
model=`cat /sys/firmware/devicetree/base/model`
mem=`free -ht | grep Total| awk '{print $2}'`
ip=`hostname -I`
echo "ip#"$ip";model#"$model";mem#"$mem

Y el script de apagado, solo inicia el comando y debe mirar con los ojos cuando la luz verde deja de parpadear, ¡luego puede presionar el botón de la carcasa hasta el fondo hasta que se apage el RPI!
info.sh

#!/bin/bash
sudo shutdown -h now

Acceso seguro a la administración Node-Red y la gestión DCPD
Instalamos
npm install bcryptjs
Vamos a
cd /home/pi/.node-red
Generamos una contraseña cifrada con el comando
node -e "console.log(require('bcryptjs').hashSync(process.argv[1], 8));" your-password-here
¡Tendré una contraseña para el panel de administración y el panel de DCPD!
en el archivo settings.js
vi /home/pi/.node-red/settings.js
encontramos las líneas y descomentamos que debería ser así, con su propio crack en lugar de contraseña

adminAuth: {
    sessionExpiryTime: 86400,
    type: "credentials",
    users: [{
        username: "admin",
        password: "$2a$08$ToLl/u9QXxbIWcP2Xjsul.fTgujmnDjVLAgyOwpxNtIRU7TWr.XBu",
        permissions: "*"
    }]
},

httpNodeAuth: {
user:"user",
pass:"$2a$08$ToLl/u9QXxbIWcP2Xjsul.fTgujmnDjVLAgyOwpxNtIRU7TWr.XBu"
},

Reiniciamos node-Red
sudo service nodered restart

Nos conectamos a la DCPD Wi-Fi, ingrese su contraseña, en panel DCPD http://10.100.10.1:1880/ui y hagamos algo.

Conectamos la unidad flash, ¡y msiga lso pasos del video!


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *