Bentornato, proseguiamo i nostri esperimenti con Node-Red e la domotica .
Immaginando un progetto per la gestione di una casa domotica grazie a Node-Red, usando come server centrale il nostro Raspberry Pi , ho pensato che nel primo tab, del nostro pannello web, ci vadano tutte le opzioni e grafici relativi al sistema locale.
Attualmente abbiamo i led virtuali per verificare la connessione dei vari dispositivi satellite ed un sistema di log ed invio comandi da shell. Ora voglio conoscere lo stato del Raspberry Pi centrale.
Vcgencmd
Raspberry Pi, possiede una GPU VideoCore con la quale potremmo interagire usando il comando vcgencmd .
vcgencmd è un’utilità da riga di comando che può ottenere varie informazioni dalla GPU VideoCore su Raspberry Pi. Molte delle informazioni disponibili sono utili solo agli ingegneri di Raspberry Pi, ma sono disponibili numerose opzioni molto utili per gli utenti finali.
vcgencmd contiene comandi interessanti, elencabili tramite il comando
1 | vcgencmd commands |
vcos, ap_output_control, ap_output_post_processing, vchi_test_init, vchi_test_exit, vctest_memmap, vctest_start, vctest_stop, vctest_set, vctest_get, pm_set_policy, pm_get_status, pm_show_stats, pm_start_logging, pm_stop_logging, version, commands, set_vll_dir, set_backlight, set_logging, get_lcd_info, arbiter, cache_flush, otp_dump, test_result, codec_enabled, get_camera, get_mem, measure_clock, measure_volts, enable_clock, scaling_kernel, scaling_sharpness, get_hvs_asserts, get_throttled, measure_temp, get_config, hdmi_ntsc_freqs, hdmi_adjust_clock, hdmi_status_show, hvs_update_fields, pwm_speedup, force_audio, hdmi_stream_channels, hdmi_channel_map, display_power, read_ring_osc, memtest, dispmanx_list, get_rsts, schmoo, render_bar, disk_notify, inuse_notify, sus_suspend, sus_status, sus_is_enabled, sus_stop_test_thread, egl_platform_switch, mem_validate, mem_oom, mem_reloc_stats, hdmi_cvt, hdmi_timings, readmr, pmicrd, pmicwr, bootloader_version, bootloader_config, file”
In questa parte ci servirà measure_temp che restituisce la temperatura del SoC misurata dal sensore di temperatura integrato.
Potremmo ricavarla tramite il sistema delle guide precedenti, oppure sfruttando il nodo installabile, chiamato node-red-contrib-vcgencmd .
Nodo vcgencmd
Dopo aver scaricato il nodo, dal menu manage palette, trovere le seguenti informazioni:
È disponibile il seguente sottoinsieme ridotto delle opzioni di vcgencmd:
- Check throttling: verificare se l’hardware è stato limitato a causa dei livelli di sottotensione, con conseguenti prestazioni scadenti.
- Get temperature: ottieni la temperatura (Celsius) del componente hardware specificato (core, arm, …).
- Get voltage level: ottieni il livello di tensione (V) del componente hardware specificato (core, sdram_c, …).
- Get clock frequency: ottieni la frequenza di clock (Hz) del componente hardware specificato (core, arm, …).
- Get firmware version: mostra la versione del firmware di VideoCore.
- Check codec enabled: controlla se il codec specificato (H264, MPG2, …) è abilitato.
- Control video output: attiva / disattiva l’alimentazione dell’uscita video.
- Get available memory: mostra la quantità di memoria suddivisa tra CPU (arm) e GPU.
Creare un flusso con vcgencmd
Dobbiamo creare il flusso qui sopra. Partiremo con un nodo inject per inviare periodicamente la richiesta di temperatura. Verrà attivato il nodo vcgencmd. In fine il msg.payload verrà rappresentato in un grafico.
Iniziamo con il nodo inject, impostandolo per inviare in modo ripetitivo un payload a caso, non ha importanza, ci serve solo per attivare il nodo successivo.
Il flusso prosegue, ed attiva il nodo vcgencmd.
Il nodo permette di specificare un percorso diverso per il comando vcgencmd, ed una serie di comandi predefiniti. Per ora sfruttiamo Get temperature. Il comando equivale ad eseguire da shell
12 | [Enrico Sartori]:~ # vcgencmd measure_temptemp=53.0'C |
Col vantaggio che pulirà la stringa restituendoci solo il valore numerico, potrai verificarlo collegando in sequenza un nodo debug.
Perfetto, completiamo il tutto con i due grafici visti prima, usando il nodo Gauge.
Il primo nodo Gauge, avrà il compito di creare un grafico per avere a colpo d’occhio l’andamento della temperatura, mentre il secondo la voglio in tempo reale e di rapida lettura.
I dati memorizzati nel grafico, resteranno in memoria finchè il servizio node red resterà attivo, se veramente hai necessità di salvarti lo storico potresti usare influx db con il relativo nodo, o uno dei mille modi possibili. su flows.nodered.org troverai molti flussi e nodi in grado di fornire facilmente moltissime funzionalità, dagli un occhiata.
- Group: se ricordi, andremo a scegliere la posizione nella dashboard e la dimensione.
- Label: è l’ etichetta per capire di che temperatura stiamo parlando.
- Type: nel primo scegliamo Line chart, e nel secondo grafico gauge.
- Il resto dei valori cambiateli a piacere, mi raccomando, provate tutto.
La descrizione del nodo gauge spiega che:
Aggiunge un widget di tipo indicatore all’interfaccia utente.
Msg.payload viene ricercato per un valore numerico ed è formattato in base al Formato valore definito, che può quindi essere formattato utilizzando i filtri Angular.
Ad esempio: {{valore | numero: 1}}% arrotonda il valore al primo decimale e aggiunge un segno % .
È possibile specificare i colori di ciascuno dei 3 settori e il misuratore si fonderà tra loro. I colori devono essere specificati in formato esadecimale (#rrggbb).
Se si specificano numeri per i settori, i colori cambiano per settore. Se non specificato, i colori vengono miscelati su tutto l’intervallo.
L’indicatore ha diverse modalità. Calibro, ciambella, bussola e onda .
L’etichetta può anche essere impostata da una proprietà del messaggio impostando il campo sul nome della proprietà, ad esempio {{msg.topic}}.
Quindi il campo value format, sarà personalizzabile utilizzando i filtri Angular , ciò rende la gestione più interessante.
Conclusione
Puoi importare il mio flusso, dal menu import, ed incollando il seguente codice, o semplicemente trascinando il codice sopra la tua pagine di node-red.
1 | [{"id":"e2db87eb.167738","type":"ui_chart","z":"b313a11e.083d4","name":"","group":"274e796c.c9bd96","order":4,"width":0,"height":0,"label":"GPU/CPU","chartType":"line","legend":"false","xformat":"HH:mm","interpolate":"bezier","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"outputs":1,"x":550,"y":600,"wires":[[]]},{"id":"ccfed3a6.791f8","type":"inject","z":"b313a11e.083d4","name":"Attiva comando","topic":"","payload":"","payloadType":"date","repeat":"60","crontab":"","once":false,"onceDelay":0.1,"x":190,"y":600,"wires":[["3191278e.48fec8"]]},{"id":"3191278e.48fec8","type":"vcgencmd","z":"b313a11e.083d4","name":"Temp Gpu/Cpu","fullPath":"/opt/vc/bin/vcgencmd","command":"measure_temp","codec":"H264","clock":"core","voltage":"core","memory":"arm","videoOutput":"0","separateMsg":false,"x":380,"y":600,"wires":[["e2db87eb.167738","c6fc8a5c.f31a78","74a4c9b1.da2d48"]]},{"id":"c6fc8a5c.f31a78","type":"ui_gauge","z":"b313a11e.083d4","name":"","group":"274e796c.c9bd96","order":2,"width":0,"height":0,"gtype":"gage","title":"GPU/CPU","label":"°C","format":"{{value}}","min":"35","max":"85","colors":["#00b500","#e6e600","#ca3838"],"seg1":"75","seg2":"80","x":550,"y":640,"wires":[]},{"id":"74a4c9b1.da2d48","type":"debug","z":"b313a11e.083d4","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":550,"y":560,"wires":[]},{"id":"274e796c.c9bd96","type":"ui_group","z":"","name":"Grafici","tab":"1d57abec.c27e64","order":2,"disp":true,"width":"6","collapse":false},{"id":"1d57abec.c27e64","type":"ui_tab","z":"","name":"Gestione Rpi","icon":"fa-gear","order":1,"disabled":false,"hidden":false}] |
Un modo rapido per salvare impostazioni e valori, consiste nell’usare context , ed i valori li troveremo nell’ apposito menù in alto a destra.
Node-red fornisce un modo per archiviare informazioni che possono essere condivise tra nodi diversi senza usare i messaggi che attraversano un flusso. Questo si chiama ‘context’.
1 | [{"id":"bedbc76a.b17f78","type":"inject","z":"b313a11e.083d4","name":"","topic":"","payload":"53","payloadType":"num","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":110,"y":240,"wires":[["d990373a.0c1db8"]]},{"id":"d990373a.0c1db8","type":"change","z":"b313a11e.083d4","name":"","rules":[{"t":"set","p":"temperatura","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":300,"y":240,"wires":[["86b68f2.164117"]]},{"id":"86b68f2.164117","type":"debug","z":"b313a11e.083d4","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":490,"y":240,"wires":[]}] |
Compiti per casa
- Crea vari grafici sfruttando gli altri valori di vcgencmd
- Salva dei valori nel context
- Scrivi i valori nel context tramite un flusso, e leggendoli da un secondo flusso (tab in alto)