Autore Topic: Centralina controllo GPIO con wrt54gl e openwrt  (Letto 33238 volte)

lupin73

  • Full Member
  • ***
  • Post: 128
    • Mostra profilo
    • E-mail
Re: Centralina controllo GPIO con wrt54gl e openwrt
« Risposta #360 il: Marzo 26, 2012, 03:01:54 pm »
Straordinario!! :-o :-o :-o
Con calma se puoi postare come hai realizzato i grafici e collegato i sensori alla presa RJ12 te ne sarei grato.
Complimenti ancora!
Grazie mille detto da te è veramente un complimento anche se è nulla in confronto a quello che fai tu  :|
Appena avrò un oretta posto tutto ora devo scappare
Comunque per i sensori guarda qua. http://www.hobby-boards.com/catalog/howto_wiring_diagram.php
e qua[link] http://imageshack.us/photo/my-images/594/sensorib.png/[/link]
Puoi omettere la resistenza; questo è uno schema per Arduino
« Ultima modifica: Marzo 26, 2012, 03:17:38 pm da lupin73 »

lupin73

  • Full Member
  • ***
  • Post: 128
    • Mostra profilo
    • E-mail
Re: Centralina controllo GPIO con wrt54gl e openwrt
« Risposta #361 il: Marzo 26, 2012, 05:51:45 pm »
Per quanto riguarda la creazione dei grafici ho utilizzato il pacchetto di openwrt rrdtool.
Per prima cosa bisogna creare i database che anche se sono di tipo round robin (occupano poco spazio) ho preferito posizionarli su una partizione su chiave usb.
Ho voluto creare un database che che mi permettesse di visualizzare le temperature dell'ultima ora, ultime 6 ore, ultime 12 ore, ultime 24 ore, 1 settimana, 1 mese ed ultimo anno.
Per ottenere ciò ho creato il database con il seguente comando (nella partizione usb che ho chiamato "database_rrdtool"):
Codice: [Seleziona]
rrdtool create temperatura.rrd --start N --step 300 \
DS:temp_sensore1:GAUGE:900:U:U  \
DS:temp_sensore2:GAUGE:900:U:U  \
DS:temp_sensore3:GAUGE:900:U:U  \
DS:temp_sensore4:GAUGE:900:U:U  \
RRA:AVERAGE:0.5:1:12 \
RRA:AVERAGE:0.5:1:72 \
RRA:AVERAGE:0.5:1:144 \
RRA:AVERAGE:0.5:1:288 \
RRA:AVERAGE:0.5:12:168 \
RRA:AVERAGE:0.5:12:720  \
RRA:MAX:0.5:1:12 \
RRA:MAX:0.5:1:72 \
RRA:MAX:0.5:1:144 \
RRA:MAX:0.5:1:288 \
RRA:MAX:0.5:12:168  \
RRA:MAX:0.5:12:720 \
RRA:MIN:0.5:1:12 \
RRA:MIN:0.5:1:72 \
RRA:MIN:0.5:1:144 \
RRA:MIN:0.5:1:288 \
RRA:MIN:0.5:12:168  \
RRA:MIN:0.5:12:720 \
RRA:LAST:0.5:1:12 \
RRA:LAST:0.5:1:72 \
RRA:LAST:0.5:1:144 \
RRA:LAST:0.5:1:288 \
RRA:LAST:0.5:12:168  \
RRA:LAST:0.5:12:720
Le temperature verranno immagazzinati ogni 5 minuti nel database temperatura.rrd (per maggiori chiarimenti http://oss.oetiker.ch/rrdtool/
I sensori saranno letti come accennato qualche post prima tramite bus 1-wire e con il pacchetto owfs che crea un filesytem che permette di leggerli con un semplice "cat /mnt/sda2/usb/1-wire/28.D6CF96030000/temperature" (x esempio nel mio caso).Sarà più chiaro nei prossimi script (spero).
Per popolare il database ho creato lo script in /usr/sbin/agg_generale.sh che legge le temperature e messo nel crontab per essere esguito ogni 5 minuti.
Codice: [Seleziona]
#!/bin/bash
if [ -f /mnt/sda2/usb/1-wire/1D.B6CC0F000000/counters.A ]; then
minute=`date +%M`
hour=`date +%H`
day=`date +%d`
week=`date +%u`
month=`date +%m`
year=`date +%y`
SOURCE="/mnt/sda2/usb/database_rrdtool"
WIRE_C=`cat /mnt/sda2/usb/1-wire/1D.B6CC0F000000/counters.A &`
wait
WIRE_S1=`cat /mnt/sda2/usb/1-wire/28.D6CF96030000/temperature &`
wait
WIRE_S2=`cat /mnt/sda2/usb/1-wire/28.CBDE96030000/temperature &`
wait
WIRE_S3=`cat /mnt/sda2/usb/1-wire/28.92AF96030000/temperature &`
wait
WIRE_S4=`cat /mnt/sda2/usb/1-wire/28.08A696030000/temperature &`
wait
DB_DAY="powerkw_day.rrd"
DB_WEEK="powerkw_week.rrd"
DB_MONTH="powerkw_month.rrd"
DB_YEAR="powerkw_year.rrd"
DB_5YEAR="powerkw_5years.rrd"
RRD_H_D_W_M_Y="/etc/centralina/rrd_h_w_m_y.ini"
MEMORY="/etc/centralina/lettura_pre_prova.ini"
cd $SOURCE

######### Aggiorno db sensori temperatura ########
     temp_sensore1=$(printf "%1.1f" $WIRE_S1)
     temp_sensore2=$(printf "%1.1f" $WIRE_S2)
     temp_sensore3=$(printf "%1.1f" $WIRE_S3)
     temp_sensore4=$(printf "%1.1f" $WIRE_S4)
     rrdtool update temperatura.rrd N:$temp_sensore1:$temp_sensore2:$temp_sensore3:$temp_sensore4
 

if [ -e $MEMORY ] || [ -e $RRD_H_D_W_M_Y ]; then
     ########### Calcolo  potenza e aggiorno db ###########
     lettura_pre=$(sed -n '1p' $MEMORY)   
     lettura=$WIRE_C   
     impulsi_eff=$((lettura-lettura_pre))   
     sed -i '1c\'"$lettura"'' $MEMORY
     potenza=$(echo "scale=2; $impulsi_eff / 2" | bc | sed 's/^\./0./')
     power=$(echo "scale=2; $potenza / 0.0833" | bc | sed 's/^\./0./')
     rrdtool update powerw.rrd N:$power
           
     ############# Controllo se devo aggiornare db contatore kwh (h,m,w,y) ################
     check_h=$(sed -n '1p' $RRD_H_D_W_M_Y)
     #echo $check_h       
     check_d=$(sed -n '2p' $RRD_H_D_W_M_Y)
     #echo $check_d   
     check_w=$(sed -n '3p' $RRD_H_D_W_M_Y)
     #echo $check_w
     check_m=$(sed -n '4p' $RRD_H_D_W_M_Y)
     #echo $check_m   
     check_y=$(sed -n '5p' $RRD_H_D_W_M_Y)
     #echo $check_y
         
     if [ "$check_h" != "$hour" ]; then
           lettura_pre=$(sed -n '2p' $MEMORY)
           lettura=$WIRE_C
           impulsi_eff=$((lettura-lettura_pre))
           consumo=$(echo "scale=2; $impulsi_eff / 2000" | bc | sed 's/^\./0./')
           sed -i '1c\'"$hour"'' $RRD_H_D_W_M_Y
           sed -i '2c\'"$lettura"'' $MEMORY
           rrdtool update $DB_DAY N:$consumo
           #echo "Aggiorno db contatore consumo giornaliero"         
     fi

     if [ "$check_d" != "$day" ]; then
           lettura_pre=$(sed -n '3p' $MEMORY)
           lettura=$WIRE_C
           impulsi_eff=$((lettura-lettura_pre))
           consumo=$(echo "scale=2; $impulsi_eff / 2000" | bc | sed 's/^\./0./')
           sed -i '2c\'"$day"'' $RRD_H_D_W_M_Y
           sed -i '3c\'"$lettura"'' $MEMORY
           rrdtool update $DB_WEEK N:$consumo
           #echo "Aggiorno db contatore potenza consumo settimanale"
     fi           
     
     if [ "$check_w" != "$week" ]; then
           lettura_pre=$(sed -n '4p' $MEMORY)
           lettura=$WIRE_C
           impulsi_eff=$((lettura-lettura_pre))
           potenza=$(echo "scale=2; $impulsi_eff / 2000" | bc | sed 's/^\./0./')
           sed -i '3c\'"$week"'' $RRD_H_D_W_M_Y
           sed -i '4c\'"$lettura"'' $MEMORY
           rrdtool update $DB_MONTH N:$consumo
           #echo "Aggiorno db contatore potenza consumo mensile"
     fi           

     if [ "$check_m" != "$month" ]; then
           lettura_pre=$(sed -n '5p' $MEMORY)
           lettura=$WIRE_C
           impulsi_eff=$((lettura-lettura_pre))
           consumo=$(echo "scale=2; $impulsi_eff / 2000" | bc | sed 's/^\./0./')
           sed -i '4c\'"$month"'' $RRD_H_D_W_M_Y
           sed -i '5c\'"$lettura"'' $MEMORY
           rrdtool update $DB_YEAR N:$consumo
           #echo "Aggiorno db contatore potenza consumo annuale"
     fi           

     if [ "$check_y" != "$year" ]; then
           lettura_pre=$(sed -n '6p' $MEMORY)
           lettura=$WIRE_C
           impulsi_eff=$((lettura-lettura_pre))
           consumo=$(echo "scale=2; $impulsi_eff / 2000" | bc | sed 's/^\./0./')
           sed -i '5c\'"$year"'' $RRD_H_D_W_M_Y
           sed -i '6c\'"$lettura"'' $MEMORY
           rrdtool $DB_5YEAR N:$consumo
           #echo "Aggiorno db contatore potenza consumo 5 anni"
     fi           

else   
      #### Inizializzo impulsi e date ####
      for i in 1 2 3 4 5 6; do
          echo $WIRE_C >>  $MEMORY
      done

      for i in $hour $day $week $month $year; do
          echo $i  >> $RRD_H_D_W_M_Y
      done
fi
fi
exit 0

In realtà questo script aggiorna anche gli altri database (kw e kwh).
Per i soli sensori di temperature il codice è il seguente:
Codice: [Seleziona]
SOURCE="/mnt/sda2/usb/database_rrdtool"
WIRE_S1=`cat /mnt/sda2/usb/1-wire/28.D6CF96030000/temperature &`
wait
WIRE_S2=`cat /mnt/sda2/usb/1-wire/28.CBDE96030000/temperature &`
wait
WIRE_S3=`cat /mnt/sda2/usb/1-wire/28.92AF96030000/temperature &`
wait
WIRE_S4=`cat /mnt/sda2/usb/1-wire/28.08A696030000/temperature &`
wait
cd $SOURCE

######### Aggiorno db sensori temperatura ########
     temp_sensore1=$(printf "%1.1f" $WIRE_S1)
     temp_sensore2=$(printf "%1.1f" $WIRE_S2)
     temp_sensore3=$(printf "%1.1f" $WIRE_S3)
     temp_sensore4=$(printf "%1.1f" $WIRE_S4)
     rrdtool update temperatura.rrd N:$temp_sensore1:$temp_sensore2:$temp_sensore3:$temp_sensore4

Nel crontab:
Codice: [Seleziona]
root@OpenWrt:/usr/sbin# crontab -l
 */5 * * * *  /usr/sbin/agg_generale.sh

Ok adesso il database verrà popolato.

Per creare i grafici ho creato lo script "/usr/sbin/sensori.sh":
Codice: [Seleziona]
#!/bin/bash

#Pulisco la ram
ram_hot="$(free | grep "Mem" | awk '{ print $3 }')"
if [ $ram_hot -ge 25000 ];then
     sync; echo 3 > /proc/sys/vm/drop_caches
fi

#Percorso su pendrive usb
data="/mnt/sda2/usb/database_rrdtool"
cd $data
start=$1
start1=$2
titolo[1]="Variazione ultima ora"
titolo[2]="Variazione ultime 6 ore"
titolo[3]="Variazione ultime 12 ore"
titolo[4]="Variazione ultime 24 ore"
titolo[5]="Variazione ultima settimana"
titolo[6]="Variazione ultimo mese"
titolo[7]="Variazione ultimo anno"

case $4 in
Tutti)
rrdtool graph temperature.png \
--start -$start$start1 --slope-mode \
-h 400 -w 700 \
--vertical-label "Temperatura [C°]"  \
--y-grid 2:1 \
-t "${titolo[$3]}" \
-c "BACK#000000" \
-c "SHADEA#757373" \
-c "SHADEB#757373" \
-c "FONT#DDDDDD" \
-c "CANVAS#202020" \
-c "GRID#666666" \
-c "MGRID#AAAAAA" \
-c "FRAME#202020" \
-c "ARROW#FFFFFF" \
DEF:intMedia=temperatura.rrd:temp_sensore1:AVERAGE \
DEF:intMin=temperatura.rrd:temp_sensore1:MIN \
DEF:intMax=temperatura.rrd:temp_sensore1:MAX \
DEF:intCorrente=temperatura.rrd:temp_sensore1:LAST \
DEF:boilerMedia=temperatura.rrd:temp_sensore2:AVERAGE \
DEF:boilerMin=temperatura.rrd:temp_sensore2:MIN \
DEF:boilerMax=temperatura.rrd:temp_sensore2:MAX \
DEF:boilerCorrente=temperatura.rrd:temp_sensore2:LAST \
DEF:estMedia=temperatura.rrd:temp_sensore3:AVERAGE \
DEF:estMin=temperatura.rrd:temp_sensore3:MIN \
DEF:estMax=temperatura.rrd:temp_sensore3:MAX \
DEF:estCorrente=temperatura.rrd:temp_sensore3:LAST \
DEF:freMedia=temperatura.rrd:temp_sensore4:AVERAGE \
DEF:freMin=temperatura.rrd:temp_sensore4:MIN \
DEF:freMax=temperatura.rrd:temp_sensore4:MAX \
DEF:freCorrente=temperatura.rrd:temp_sensore4:LAST \
COMMENT:"   \n" \
LINE2:intCorrente#0000FF:"Interno" \
GPRINT:intMedia:AVERAGE:"  Media\: %5.2lf%s\t" \
GPRINT:intMax:MAX:"   Max\: %5.2lf%s\t" \
GPRINT:intMin:MIN:"   Min\: %5.2lf%s\t" \
GPRINT:intCorrente:LAST:"   Ultima\: %5.2lf%s\t" \
COMMENT:"   \n" \
LINE2:boilerCorrente#00BC14:"Boiler" \
GPRINT:boilerMedia:AVERAGE:"   Media\: %5.2lf%s\t" \
GPRINT:boilerMax:MAX:"    Max\: %5.2lf%s\t" \
GPRINT:boilerMin:MIN:"    Min\: %5.2lf%s\t" \
GPRINT:boilerCorrente:LAST:"    Ultima\: %5.2lf%s\t" \
COMMENT:"   \n" \
LINE2:estCorrente#FF0000:"Esterno" \
GPRINT:estMedia:AVERAGE:"  Media\: %5.2lf%s\t" \
GPRINT:estMax:MAX:"   Max\: %5.2lf%s\t" \
GPRINT:estMin:MIN:"   Min\: %5.2lf%s\t" \
GPRINT:estCorrente:LAST:"   Ultima\: %5.2lf%s\t" \
COMMENT:"   \n" \
LINE2:freCorrente#FFBC14:"Freezer" \
GPRINT:freMedia:AVERAGE:"  Media\: %5.2lf%s\t" \
GPRINT:freMax:MAX:"   Max\: %5.2lf%s\t" \
GPRINT:freMin:MIN:"   Min\: %5.2lf%s\t" \
GPRINT:freCorrente:LAST:"   Ultima\: %5.2lf%s\t"
;;

Boiler)
rrdtool graph temperature.png \
--start -$start$start1 --slope-mode \
--y-grid 1:1 \
-h 400 -w 700  \
--vertical-label "Temperatura [C°]"  \
-t "${titolo[$3]}" \
-c "BACK#000000" \
-c "SHADEA#000000" \
-c "SHADEB#000000" \
-c "FONT#DDDDDD" \
-c "CANVAS#202020" \
-c "GRID#666666" \
-c "MGRID#AAAAAA" \
-c "FRAME#202020" \
-c "ARROW#FFFFFF" \
DEF:boilerMedia=temperatura.rrd:temp_sensore2:AVERAGE \
DEF:boilerMin=temperatura.rrd:temp_sensore2:MIN \
DEF:boilerMax=temperatura.rrd:temp_sensore2:MAX \
DEF:boilerCorrente=temperatura.rrd:temp_sensore2:LAST \
COMMENT:"   \n" \
LINE2:boilerCorrente#FFBC14:"Boiler" \
GPRINT:boilerMedia:AVERAGE:"   Media\: %5.2lf%s\t" \
GPRINT:boilerMax:MAX:"    Max\: %5.2lf%s\t" \
GPRINT:boilerMin:MIN:"    Min\: %5.2lf%s\t" \
GPRINT:boilerCorrente:LAST:"    Ultima\: %5.2lf%s\t"
;;

Interno)
rrdtool graph temperature.png \
--start -$start$start1  --slope-mode  \
-h 400 -w 700  \
--vertical-label "Temperatura [C°]"  \
-t "${titolo[$3]}" \
-c "BACK#000000" \
-c "SHADEA#000000" \
-c "SHADEB#000000" \
-c "FONT#DDDDDD" \
-c "CANVAS#202020" \
-c "GRID#666666" \
-c "MGRID#AAAAAA" \
-c "FRAME#202020" \
-c "ARROW#FFFFFF" \
DEF:intMedia=temperatura.rrd:temp_sensore1:AVERAGE \
DEF:intMin=temperatura.rrd:temp_sensore1:MIN \
DEF:intMax=temperatura.rrd:temp_sensore1:MAX \
DEF:intCorrente=temperatura.rrd:temp_sensore1:LAST \
COMMENT:"   \n" \
LINE2:intCorrente#FFBC14:"Interna" \
GPRINT:intMedia:AVERAGE:"Media\: %5.2lf%s\t" \
GPRINT:intMax:MAX:" Max\: %5.2lf%s\t" \
GPRINT:intMin:MIN:" Min\: %5.2lf%s\t" \
GPRINT:intCorrente:LAST:" Ultima\: %5.2lf%s\t"
;;

Esterno)
rrdtool graph temperature.png \
--start -$start$start1  --slope-mode  \
-h 400 -w 700 \
--vertical-label "Temperatura [C°]"  \
-t "${titolo[$3]}" \
-c "BACK#000000" \
-c "SHADEA#000000" \
-c "SHADEB#000000" \
-c "FONT#DDDDDD" \
-c "CANVAS#202020" \
-c "GRID#666666" \
-c "MGRID#AAAAAA" \
-c "FRAME#202020" \
-c "ARROW#FFFFFF" \
DEF:estMedia=temperatura.rrd:temp_sensore3:AVERAGE \
DEF:estMin=temperatura.rrd:temp_sensore3:MIN \
DEF:estMax=temperatura.rrd:temp_sensore3:MAX \
DEF:estCorrente=temperatura.rrd:temp_sensore3:LAST \
COMMENT:"   \n" \
LINE2:estCorrente#FFBC14:"Esterno" \
PRINT:estMedia:AVERAGE:"  Media\: %5.2lf%s\t" \
GPRINT:estMax:MAX:"   Max\: %5.2lf%s\t" \
GPRINT:estMin:MIN:"   Min\: %5.2lf%s\t" \
GPRINT:estCorrente:LAST:"   Ultima\: %5.2lf%s\t" \
;;

Freezer)
rrdtool graph temperature.png \
--start -$start$start1 --slope-mode  \
-h 400 -w 700 \
--vertical-label "Temperatura [C°]"  \
-t "${titolo[$3]}" \
-c "BACK#000000" \
-c "SHADEA#000000" \
-c "SHADEB#000000" \
-c "FONT#DDDDDD" \
-c "CANVAS#202020" \
-c "GRID#666666" \
-c "MGRID#AAAAAA" \
-c "FRAME#202020" \
-c "ARROW#FFFFFF" \
DEF:freMedia=temperatura.rrd:temp_sensore4:AVERAGE \
DEF:freMin=temperatura.rrd:temp_sensore4:MIN \
DEF:freMax=temperatura.rrd:temp_sensore4:MAX \
DEF:freCorrente=temperatura.rrd:temp_sensore4:LAST \
COMMENT:"   \n" \
LINE2:freCorrente#FFBC14:"Freezer" \
GPRINT:freMedia:AVERAGE:"  Media\:%5.2lf%s\t" \
GPRINT:freMax:MAX:"   Max\:%5.2lf%s\t" \
GPRINT:freMin:MIN:"   Min\:%5.2lf%s\t" \
GPRINT:freCorrente:LAST:"   Ultima\:%5.2lf%s\t"
esac

ram_hot="$(free | grep "Mem" | awk '{ print $3 }')"
if [ $ram_hot -ge 25000 ];then
     sync; echo 3 > /proc/sys/vm/drop_caches
fi
exit   
A questo punto ho creato la pagina per la webif (proseguo sotto perchè superato il limite di 20000 caratteri spero qualche admin riunisca tutto)




« Ultima modifica: Marzo 26, 2012, 07:01:51 pm da lupin73 »

lupin73

  • Full Member
  • ***
  • Post: 128
    • Mostra profilo
    • E-mail
Re: Centralina controllo GPIO con wrt54gl e openwrt
« Risposta #362 il: Marzo 26, 2012, 06:08:22 pm »
prosegue da sopra....
Quindi ho creato /www/cgi-bin/webif/centralina/temperature.sh
Codice: [Seleziona]
#!/usr/bin/webif-page
<?
. /usr/lib/webif/webif.sh

#
############################################################################
#
# Descrizione:
# Mostra i grafici delle temperature
#
#
#               lupin73 --->Nabuk<----
#############################################################################
header "Info" "System" "<img src=\"/images/Temp.gif\">@TR<< Temperature >>"
indirizzo="$(uci get network.lan.ipaddr)"
#############################################################################
echo "temp" > /etc/centralina/storico_check.ini
img="/temperature.png"

pidowread=`pidof owread`
if equal $pidowread "";then
temp1=`/mnt/sda2/usb/usr/bin/owread /28.08A696030000/temperature`
temp1=$(printf "%1.1f" $temp1)
else
echo "<center><strong>Aggiornamento database in corso!</strong><br>Al termine verrà creato il grafico!"
while [ "$pidowread" != "" ]; do
sleep 1
pidowread=`pidof owread`
done
fi

pidowread=`pidof owread`
if equal $pidowread "";then
temp2=`/mnt/sda2/usb/usr/bin/owread /28.CBDE96030000/temperature`
temp2=$(printf "%1.1f" $temp2)
else
echo "<center><strong>Aggiornamento database in corso!</strong><br>Al termine verrà creato il grafico!"
while [ "$pidowread" != "" ]; do
sleep 1
pidowread=`pidof owread`
done
fi

pidowread=`pidof owread`
if equal $pidowread "";then
temp3=`/mnt/sda2/usb/usr/bin/owread /28.92AF96030000/temperature`
temp3=$(printf "%1.1f" $temp3)
else
echo "<center><strong>Aggiornamento database in corso!</strong><br>Al termine verrà creato il grafico!"
while [ "$pidowread" != "" ]; do
sleep 1
pidowread=`pidof owread`
done
fi

pidowread=`pidof owread`
if equal $pidowread "";then
temp4=`/mnt/sda2/usb/usr/bin/owread /28.D6CF96030000/temperature`
temp4=$(printf "%1.1f" $temp4)
else
echo "<center><strong>Aggiornamento database in corso!</strong><br>Al termine verrà creato il grafico!"
while [ "$pidowread" != "" ]; do
sleep 1
pidowread=`pidof owread`
done
fi

if equal $FORM_grafici "Seleziona_data" || equal $FORM_tipo_grafici "Seleziona_ambiente" ;then
echo "<center><strong>ATTENZIONE!</strong><br>Devi selezionare almeno una data e un tipo per generare il grafico!"
cat <<EOF
<script language="JavaScript" type="text/javascript">
setTimeout('top.location.href=\"/cgi-bin/webif/centralina/temperature.sh\"',"3000")
</script>
EOF

else

if equal $FORM_grafici "1_ora";then
echo  $FORM_grafici > /etc/storico.ini
rm /mnt/sda2/usb/database_rrdtool/temperature.png
echo "<center><img src=\"../../../images/clessidra.gif\">"
echo "<center>Attendi per favore sto creando il grafico!"
/usr/sbin/sensori.sh 1 h 1 $FORM_tipo_grafici > /dev/null
cat <<EOF
<script language="JavaScript" type="text/javascript">
setTimeout('top.location.href=\"/cgi-bin/webif/centralina/temperature.sh\"',"1500")
</script>
EOF
fi

if equal $FORM_grafici "6_ore";then
echo  $FORM_grafici > /etc/storico.ini
rm /mnt/sda2/usb/database_rrdtool/temperature.png
echo "<center><img src=\"../../../images/clessidra.gif\">"
echo "<center>Attendi per favore sto creando il grafico!"
/usr/sbin/sensori.sh 6 h 2 $FORM_tipo_grafici > /dev/null
cat <<EOF
<script language="JavaScript" type="text/javascript">
setTimeout('top.location.href=\"/cgi-bin/webif/centralina/temperature.sh\"',"1500")
</script>
EOF
fi

if equal $FORM_grafici "12_ore";then
echo  $FORM_grafici > /etc/storico.ini
rm /mnt/sda2/usb/database_rrdtool/temperature.png
echo "<center><img src=\"../../../images/clessidra.gif\">"
echo "<center>Attendi per favore sto creando il grafico!"
/usr/sbin/sensori.sh 12 h 3 $FORM_tipo_grafici  > /dev/null
cat <<EOF
<script language="JavaScript" type="text/javascript">
setTimeout('top.location.href=\"/cgi-bin/webif/centralina/temperature.sh\"',"1500")
</script>
EOF
fi

if equal $FORM_grafici "24_ore";then
echo  $FORM_grafici > /etc/storico.ini
rm /mnt/sda2/usb/software/database_rrdtool/temperature.png
echo "<center><img src=\"../../../images/clessidra.gif\">"
echo "<center>Attendi per favore sto creando il grafico!"
/usr/sbin/sensori.sh 24 h 4 $FORM_tipo_grafici > /dev/null
cat <<EOF
<script language="JavaScript" type="text/javascript">
setTimeout('top.location.href=\"/cgi-bin/webif/centralina/temperature.sh\"',"1500")
</script>
EOF
fi

if equal $FORM_grafici "1_settimana";then
echo  $FORM_grafici > /etc/storico.ini
rm /mnt/sda2/usb/database_rrdtool/temperature.png
echo "<center><img src=\"../../../images/clessidra.gif\">"
echo "<center>Attendi per favore sto creando il grafico!"
/usr/sbin/sensori.sh 1 w 5 $FORM_tipo_grafici > /dev/null
cat <<EOF
<script language="JavaScript" type="text/javascript">
setTimeout('top.location.href=\"/cgi-bin/webif/centralina/temperature.sh\"',"1500")
</script>
EOF
fi

if equal $FORM_grafici "1_mese";then
echo  $FORM_grafici > /etc/storico.ini
rm /mnt/sda2/usb/database_rrdtool/temperature.png
echo "<center><img src=\"../../../images/clessidra.gif\">"
echo "<center>Attendi per favore sto creando il grafico!"
/usr/sbin/sensori.sh 1 m 6 $FORM_tipo_grafici > /dev/null
cat <<EOF
<script language="JavaScript" type="text/javascript">
setTimeout('top.location.href=\"/cgi-bin/webif/centralina/temperature.sh\"',"1500")
</script>
EOF
fi

if equal $FORM_grafici "1_anno";then
echo  $FORM_grafici > /etc/storico.ini
rm /mnt/sda2/usb/database_rrdtool/temperature.png
echo "<center><img src=\"../../../images/clessidra.gif\">"
echo "<center>Attendi per favore sto creando il grafico!"
/usr/sbin/sensori.sh 1 y 7 $FORM_tipo_grafici > /dev/null
cat <<EOF
<script language="JavaScript" type="text/javascript">
setTimeout('top.location.href=\"/cgi-bin/webif/centralina/temperature.sh\"',"1500")
</script>
EOF
fi

cat <<EOF
<script type="text/javascript">
function show_confirm()
{
var r=confirm(" Questa operazione per intervalli superiori\n ad un mese può durare molti minuti!\n  Vuoi continuare?");
if (r==true)
  {
window.open('http://$indirizzo/cgi-bin/webif/centralina/storico.sh?id=`cat /etc/storico.ini`','finestra','width=600,height=400, scrollbars=yes,top=200,right=50');
  }
else
  {
  alert("Se avevi altro da fare hai fatto una scelta saggia!\n:)");
  }
}
</script>


<center><table>
   <tr>
      <td><a onclick="show_confirm()"><img src="$img" title="Fai click per visualizzare lo storico"></a></td>
   </tr>
</table>
EOF

cat <<EOF
<form method="get" action="temperature.sh">
<select name="grafici" >
EOF

for n in 1_ora 6_ore 12_ore 24_ore 1_settimana 1_mese 1_anno Seleziona_data;do
cat <<EOF
   <option value="$n" selected="selected">$n</option>
EOF
done

cat <<EOF
</select>
        <select name="tipo_grafici">
EOF

for n in Tutti Interno Esterno Boiler Freezer Seleziona_ambiente;do
cat <<EOF

<option value="$n" selected="selected">$n</option>
EOF
done

cat <<EOF
<input type="submit" name="$n" value="Crea">
</select>
</form>
<br><br>
EOF

display_form <<EOF
start_form|@TR<<Lettura sensori>>
end_form
EOF
cat <<EOF
<tr><td><center><strong><font size="2">Interno=</td><font color="#0000FF">$temp4°</font><td>&nbsp&nbspEsterno=<font color="#FF4500">$temp3°</font>&nbsp&nbspBoiler=<font color="#00FF00">$temp2°</font>&nbsp&nbspFreezer=<font color="#FFBC14:">$temp1°</font></tr></td>
<br><br>
EOF
fi

footer
?>

che visualizza il grafico in base al tempo selezionato.
Volevo avere anche un controllo più particolareggiato dei dati del database e quindi ho creato una pagina html che mi visualizzi lo storico delle temperature cliccando sull'immagine del grafico e che potesse essere stampato.
Ho creato quindi /usr/sbin/crea_storico.sh che mi costruisce la tabella che verrà visualizzata nella webif (n.b. ho utilizzato bash per operare sugli array)
Codice: [Seleziona]
#!/bin/bash
#Pulisco la ram
ram_hot="$(free | grep "Mem" | awk '{ print $3 }')"
if [ $ram_hot -ge 25000 ];then
     sync; echo 3 > /proc/sys/vm/drop_caches
fi
 
case $1 in
     "1_ora")
         R=5
         S="-1h"
         leg="ultima ora"
     ;;
     
     "6_ore")
         R=5
         S="-6h"
         leg="ultime 6 ore"
     ;;

     "12_ore")
         R=5
         S="-12h"
         leg="ultime 12 ore"
      ;;

     "24_ore")
         R=5
         S="-24h"
         leg="ultime 24 ore"
      ;;

     "1_settimana")
         R=60
         S="-1w"
         leg="ultima settimana"
      ;;

     "1_mese")
         R=60
         S="-1m"
         leg="ultimo mese"

      ;;

     "1_anno")
         R=60
         S="-1y"
         leg="ultimo anno"   
esac


cal_exp ()
      {

          case $1 in

              "+00")
                  S=$(echo "scale=3; $2*1.00" | bc)
              ;;

              "+01")
                  S=$(echo "scale=3; $2*10.00" | bc)

              ;;

              "+02")
                  S=$(echo "scale=3; $2*100.00" | bc)
              ;;

              "+03")
                  S=$(echo "scale=3; $2*1000.00" | bc)
          esac
          return
      }

case $2 in
"temp")
SOURCE="/mnt/sda2/usb/database_rrdtool/temperatura.rrd"
declare  DATA=(`rrdtool fetch $SOURCE  AVERAGE -r $R -s $S |  awk '{ print $1 }' | sed -e 's/://' | cut -f 1 -de | tail -n +2`)
declare  S1=(`rrdtool fetch $SOURCE AVERAGE -r $R  -s $S | awk '{ print $2 }' | cut -f 1 -de | tail -n +2`)
declare  S2=(`rrdtool fetch $SOURCE AVERAGE -r $R  -s $S  | awk '{ print $3 }' | cut -f 1 -de | tail -n +2`)
declare  S3=(`rrdtool fetch $SOURCE AVERAGE -r $R  -s $S  | awk '{ print $4 }' | cut -f 1 -de | tail -n +2`)
declare  S4=(`rrdtool fetch $SOURCE AVERAGE -r $R  -s $S  | awk '{ print $5 }' | cut -f 1 -de | tail -n +2`)
declare  EXP1=(`rrdtool fetch $SOURCE AVERAGE -r $R  -s $S  | awk '{ print $2 }' | cut -f 2 -de | tail -n +2`)
declare  EXP2=(`rrdtool fetch $SOURCE AVERAGE -r $R  -s $S | awk '{ print $3 }' | cut -f 2 -de | tail -n +2`)
declare  EXP3=(`rrdtool fetch $SOURCE AVERAGE -r $R  -s $S | awk '{ print $4 }' | cut -f 2 -de | tail -n +2`)
declare  EXP4=(`rrdtool fetch $SOURCE AVERAGE -r $R  -s $S | awk '{ print $5 }' | cut -f 2 -de | tail -n +2`)
declare  TESTA=(Data Interno Boiler Esterno Freezer)
ld=$((${#DATA[@]}-2))
start=0
end=5
echo "<TR>"
echo "<td colspan="5" align="center" valign="middle">"
echo "<b>Storico $leg</b>"
echo "</TR>"
echo "<TR>"

for n in $(seq 1 $end); do
echo "<TD><CENTER>${TESTA[$n-1]}</CENTER></TD>"
done

for i in $(seq $start $ld); do
    if [ $n -eq $end ];then
         echo "</TR>"
         echo "<TR>"
    fi

    EPOCH=${DATA[$i]}
    DATA=$(awk "BEGIN {print strftime(\"%c\",$EPOCH)}")
    S1=$(printf "%1.3f" ${S1[$i]})
    S2=$(printf "%1.3f" ${S2[$i]})
    S3=$(printf "%1.3f" ${S3[$i]})
    S4=$(printf "%1.3f" ${S4[$i]})
    #for k in 1 2 3 4; do
    #    S[k]=$(printf "%1.3f" ${S[k][$i]})
    #done
    EX1=${EXP1[$i]}
    EX2=${EXP2[$i]}
    EX3=${EXP3[$i]}
    EX4=${EXP4[$i]}


    for n in $(seq 1 $end); do
        if [ $n -eq 1 ] && [ "DATA" != "nan" ] && [ "$S1" != "nan" ] && [ "$S2" != "nan" ] && [ "$S3" != "nan" ] && [ "$S4" != "nan" ];then
             echo "<TD><CENTER>$DATA</CENTER></TD>"
        fi

        if [ $n -eq 2 ] && [ "$S1" != "nan" ];then
      S=$S1
      cal_exp $EX1 $S
              echo "<TD><CENTER>$S</CENTER></TD>"
        fi

        if [ $n -eq 3 ] && [ "$S2" != "nan" ];then
     S=$S2
     cal_exp $EX2 $S
             echo "<TD><CENTER>$S</CENTER></TD>"
        fi

        if [ $n -eq 4 ] && [ "$S3" != "nan" ];then
     S=$S3
     cal_exp $EX3 $S
             echo "<TD><CENTER>$S</CENTER></TD>"
        fi

        if [ $n -eq 5 ] && [ "$S4" != "nan" ];then
     S=$S4
     cal_exp $EX4 $S
             echo "<TD><CENTER>$S</CENTER></TD>"
        fi
    done

    if [ $i -eq $ld ];then
         echo "</TR>"
    fi
done
;;

"pot")
SOURCE="/mnt/sda2/usb/database_rrdtool/powerw.rrd"
declare  DATA=(`rrdtool fetch $SOURCE  AVERAGE -r $R -s $S |  awk '{ print $1 }' | sed -e 's/://' | cut -f 1 -de | tail -n +2`)
declare  S1=(`rrdtool fetch $SOURCE AVERAGE -r $R  -s $S | awk '{ print $2 }' | cut -f 1 -de | tail -n +2`)
declare  EXP1=(`rrdtool fetch $SOURCE AVERAGE -r $R  -s $S  | awk '{ print $2 }' | cut -f 2 -de | tail -n +2`)
declare  TESTA=(Data Watt)
ld=$((${#DATA[@]}-2))
start=0
end=2
echo "<TR>"
echo "<td colspan="5" align="center" valign="middle">"
echo "<b>Storico $leg</b>"
echo "</TR>"
echo "<TR>"

for n in $(seq 1 $end); do
echo "<TD><CENTER>${TESTA[$n-1]}</CENTER></TD>"
done

for i in $(seq $start $ld); do
    if [ $n -eq $end ];then
         echo "</TR>"
         echo "<TR>"
    fi

    EPOCH=${DATA[$i]}
    DATA=$(awk "BEGIN {print strftime(\"%c\",$EPOCH)}")
    S1=$(printf "%1.3f" ${S1[$i]})
    EX1=${EXP1[$i]}
   


    for n in $(seq 1 $end); do
        if [ $n -eq 1 ] && [ "DATA" != "nan" ] && [ "$S1" != "nan" ] && [ "$S2" != "nan" ] && [ "$S3" != "nan" ] && [ "$S4" != "nan" ];then
             echo "<TD><CENTER>$DATA</CENTER></TD>"
        fi

        if [ $n -eq 2 ] && [ "$S1" != "nan" ];then
                      S=$S1
                      cal_exp $EX1 $S
              echo "<TD><CENTER>$S</CENTER></TD>"
        fi

    done

    if [ $i -eq $ld ];then
         echo "</TR>"
    fi
done
esac
sync; echo 3 > /proc/sys/vm/drop_caches
exit 0

N.B Questo script mi crea anche lo storico dei kw ma questo lo vedremo prossimamente.

La pagina che visualizzerà lo storico:
Codice: [Seleziona]
#!/usr/bin/webif-page
<?
. /usr/lib/webif/webif.sh
cat <<EOF
Content-Type: text/html; charset=UTF-8
Pragma: no-cache

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<script type="text/javascript">
function load()
{
setTimeout('top.location.href=\"/cgi-bin/webif/centralina/storico.sh\"',"0")
}

function alertMsg()
{
document.write("<center><img src=\"../../../images/clessidra_storico.gif\">");
document.write("<center>Attendi per favore sto leggendo i dati!");
document.write("<center>Per intervalli di tempo superiori ad 1 mese può richiedere circa 15 minuti!");
document.write("<center>NON CHIUDERE LA FINESTRA!")
}

function timeMsg()
{
var t=setTimeout("alertMsg()",0);
}
</script>
</head>
EOF
indirizzo_test="$(echo $HTTP_REFERER | awk 'BEGIN { FS="/" } { print $3 }')"
if equal $indirizzo_test "127.0.0.1:12345" ; then
indirizzo="127.0.0.1"
else
indirizzo="$indirizzo_test"
fi
#check_s="`cat /etc/centralina/storico_check.ini`"
if equal $GET_id "1_ora"; then
cat <<EOF
<script language="JavaScript" type="text/javascript">
alertMsg()
</script>
<body onload="load()">
EOF
check_s="`cat /etc/centralina/storico_check.ini`"
/usr/sbin/crea_storico.sh $GET_id $check_s > /etc/tabella_storico
fi

if equal $GET_id "6_ore"; then
cat <<EOF
<script language="JavaScript" type="text/javascript">
alertMsg()
</script>
<body onload="load()">
EOF
check_s="`cat /etc/centralina/storico_check.ini`"
/usr/sbin/crea_storico.sh $GET_id $check_s > /etc/tabella_storico
fi

if equal $GET_id "12_ore"; then
cat <<EOF
<script language="JavaScript" type="text/javascript">
alertMsg()
</script>
<body onload="load()">
EOF
check_s="`cat /etc/centralina/storico_check.ini`"
/usr/sbin/crea_storico.sh $GET_id $check_s > /etc/tabella_storico
fi

if equal $GET_id "24_ore"; then
cat <<EOF
<script language="JavaScript" type="text/javascript">
alertMsg()
</script>
<body onload="load()">
EOF
check_s="`cat /etc/centralina/storico_check.ini`"
/usr/sbin/crea_storico.sh $GET_id $check_s > /etc/tabella_storico
fi


if equal $GET_id "1_settimana"; then
cat <<EOF
<script language="JavaScript" type="text/javascript">
alertMsg()
</script>
<body onload="load()">
EOF
/usr/sbin/crea_storico.sh $GET_id > /etc/tabella_storico
fi


if equal $GET_id "1_mese"; then
cat <<EOF
<script language="JavaScript" type="text/javascript">
alertMsg()
</script>
<body onload="load()">
EOF
check_s="`cat /etc/centralina/storico_check.ini`"
/usr/sbin/crea_storico.sh $GET_id $check_s > /etc/tabella_storico
fi

if equal $GET_id "1_anno"; then
cat <<EOF
<script language="JavaScript" type="text/javascript">
alertMsg()
</script>
<body onload="load()">
EOF
check_s="`cat /etc/centralina/storico_check.ini`"
/usr/sbin/crea_storico.sh $GET_id $check_s > /etc/tabella_storico
fi


cat <<EOF
<script type="text/javascript">
function printpage()
{
window.print();
}
</script>
<input type="button" value="Stampa" onclick="printpage()" /><br><br>
EOF

echo "<CENTER><TABLE BORDER=1  BORDERCOLOR="#000000" CELLPADDING=2 CELLSPACING=0>"
echo "`cat /etc/tabella_storico`"
echo "</TABLE>"
echo "</body>"
echo "</html>"

?>
<!--
-->

</html>

Scusate eventuali errori ma sono andato di fretta e comunque il progetto è ancora in fase di sviluppo, quando troverò un altro po' di tempo posterò la parte relativa al contatore elettrico.
« Ultima modifica: Marzo 26, 2012, 07:04:24 pm da lupin73 »

truthahn

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1546
    • Mostra profilo
Re: Centralina controllo GPIO con wrt54gl e openwrt
« Risposta #363 il: Marzo 26, 2012, 09:57:31 pm »
Grazie mille lupin73, appena ho tempo provo anch'io ad implementarlo nella centralina x86, intanto mi interessa solo la temperatura interna. A presto.

truthahn

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1546
    • Mostra profilo
Re: Centralina controllo GPIO con wrt54gl e openwrt
« Risposta #364 il: Aprile 09, 2012, 11:14:15 am »
Perfetto lupin73, funziona a meraviglia. Io l'ho utilizzato solo per la temperatura interna ed esterna. Per altri, utilizzo del centro utenti, ho utilizzato i google chart tool anche loro veramente ottimi.

lupin73

  • Full Member
  • ***
  • Post: 128
    • Mostra profilo
    • E-mail
Re: Centralina controllo GPIO con wrt54gl e openwrt
« Risposta #365 il: Aprile 10, 2012, 11:37:09 am »
Perfetto lupin73, funziona a meraviglia. Io l'ho utilizzato solo per la temperatura interna ed esterna. Per altri, utilizzo del centro utenti, ho utilizzato i google chart tool anche loro veramente ottimi.
Bene  sono contento  :-D

ciao87

  • Novellino
  • *
  • Post: 7
    • Mostra profilo
    • E-mail
Re: Centralina controllo GPIO con wrt54gl e openwrt
« Risposta #366 il: Maggio 15, 2012, 05:26:33 pm »
Si potrebbe installare e farlo funzionare anche su dd-wrt v24sp2?
Se si con quali modifiche da apportare?
Ricordo che DD-wrt ha gi? installato gpio.

truthahn

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1546
    • Mostra profilo
Re: Centralina controllo GPIO con wrt54gl e openwrt
« Risposta #367 il: Maggio 15, 2012, 09:52:26 pm »
Ciao. Se intendi l'pk o ml'intero sistema la risposta ? no, il tutto ? stato scritto per openwrt.

ciao87

  • Novellino
  • *
  • Post: 7
    • Mostra profilo
    • E-mail
Re: Centralina controllo GPIO con wrt54gl e openwrt
« Risposta #368 il: Maggio 15, 2012, 09:58:59 pm »
Capito, ma dove posso trovare la 8.09.2 senza Luci ma o gi? con X-wrt oppure senza interfaccia?

ciao87

  • Novellino
  • *
  • Post: 7
    • Mostra profilo
    • E-mail
Re: Centralina controllo GPIO con wrt54gl e openwrt
« Risposta #369 il: Maggio 15, 2012, 10:01:06 pm »
Dimenticavo per fonera.

truthahn

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1546
    • Mostra profilo
Re: Centralina controllo GPIO con wrt54gl e openwrt
« Risposta #370 il: Maggio 15, 2012, 10:11:35 pm »
mmmm penso sia complicato, magari una botta di c...o su qualche mirror. Io partirei con una nuova compilazione e un adeguamento, se necessario, degli script.

ciao87

  • Novellino
  • *
  • Post: 7
    • Mostra profilo
    • E-mail
Re: Centralina controllo GPIO con wrt54gl e openwrt
« Risposta #371 il: Maggio 15, 2012, 10:15:11 pm »
Si potrebbe adattare l'interfaccia centralina con l'interfaccia Luci?

ciao87

  • Novellino
  • *
  • Post: 7
    • Mostra profilo
    • E-mail
Re: Centralina controllo GPIO con wrt54gl e openwrt
« Risposta #372 il: Maggio 15, 2012, 10:19:45 pm »
Altro progetto interessante sul controllo gpio ? questo: http://kernelhacks.blogspot.it/2012/04/fonera-plugstrip.html
non sono riuscito a farlo funzionare.

ciao87

  • Novellino
  • *
  • Post: 7
    • Mostra profilo
    • E-mail
Re: Centralina controllo GPIO con wrt54gl e openwrt
« Risposta #373 il: Maggio 15, 2012, 10:52:31 pm »
Avresti il file ipk per la versione 7.09? Ipkg mi da errore anche se il file l'ho rinominato .ipk

salvodj

  • Novellino
  • *
  • Post: 18
    • Mostra profilo
    • E-mail
Re: Centralina controllo GPIO con wrt54gl e openwrt
« Risposta #374 il: Giugno 06, 2012, 02:15:52 am »
ciao ragazzi ho un piccolo problema. Da premettere che uso openwrt "no xwrt" su un alice gate voip che funziona correttamente, e leggendo questo topic ho pensato di creare anche io la mia centralina. Ho installato il pacchetto di truthahn sia la normale che quella della vodafone station ma in tutte e due i casi mi esce
Codice: [Seleziona]
Unable to launch the requested CGI program:
  /www/cgi-bin/webif/centralina.sh: No such file or directory
? come se qualcosa bloccasse l'esecuzione dei file sh, per? nella seconda riga ? come se non trova il file. Potete darmi qualche dritta.