Hur gör man för att ... ? Hur fungerar ... ? Steg för steg-guider och förklarande artiklar finns i detta forum.
Många guider finner också på vår blogg:
https://blog.m.nu/
Kategoriregler
Vill du visa bilder i ditt inlägg? Använd funktionen "Ladda upp bilaga" nedanför textrutan!
elf98
Hemautomation - det är mer än en hobby
Inlägg: 5434 Blev medlem: 27 okt 2006, 13:49
Ort: Linköping
Kontakt:
Inlägg
av elf98 » 23 apr 2012, 22:04
Ok, det där var nog bara slutet av filen.
Den här raden skickar ut temperaturen/rh-värdet:
Kod: Markera allt
echo "$SNAME: $SVAL$append " > /tmp/1wire/uncached/$LCD/line20.$j
Scriptet loopar igenom alla anslutna sensorer och skriver ut dem en varsin rad.
Ganska typisk min kod när det är typ okommenterat. Tänkte väl inte när jag skrev koden att någon annan skulle labba med den 4-5 år senare...
Det skrevs i bash då det inte var trivialt att få in något mer utvecklat språk som php i openwrt. Jag är rätt kass på Bash så det går nog att skriva effektivare och snyggare.
Grundade m.nu & temperatur.nu
Driver temperatur.nu
jonas_j
Tar hemautomation på allvar
Inlägg: 138 Blev medlem: 18 nov 2006, 15:00
Ort: Åkers Styckebruk
Inlägg
av jonas_j » 23 apr 2012, 22:12
Hela koden:
Kod: Markera allt
root@TemperaturMonitor:~# nano /mnt/scripts/lcd.sh
GNU nano 2.0.6 File: /mnt/scripts/lcd.sh
#!/bin/sh
#Copyright Freiholtz Consulting 2008
YEARMONTH=`date +%Y%m`
SENS_NUM=0
CACHE=""
SENSORS=`cat /mnt/config.txt|grep SENSORS=|sed -e s/SENSORS=//|sed -e s/^M$//g`
SCREEN_WAIT=`cat /mnt/config.txt|grep SCREEN_WAIT=|sed -e s/SCREEN_WAIT=//|sed -e s/^M//g`
COUNT=1
while [ $COUNT -le $SENSORS ]; do
#Hämta sensorns id och kontrollera att den existerar
echo S$COUNT
eval S$COUNT=`cat /mnt/config.txt|grep S$COUNT=|sed -e s/S$COUNT=//|sed -e s/^M$//g`
eval S_NAME$COUNT=`cat /mnt/config.txt|grep "S_NAME$COUNT="|sed -e s/"S_NAME$COUNT="//|sed -e s/^M$//g`
eval S_TYPE$COUNT=`cat /mnt/config.txt|grep "S_TYPE$COUNT="|sed -e s/"S_TYPE$COUNT="//|sed -e s/^M$//g`
if [ ! -d /tmp/1wire/$SID ]; then
echo "SENSOR$COUNT kan inte hittas!"
exit 1
fi
COUNT=`expr $COUNT + 1`
done
#Hämta LCD-displayens id
LCD=`cat /mnt/config.txt|grep LCD=|sed -e s/LCD=//|sed -e s/^M//g`
if [ ! -d /tmp/1wire/$LCD ]; then
echo "Kan inte hitta LCD-displayen, är den ansluten?"
exit 1
fi
#Se till att bakgrundsbelysningen är på, ändra till echo 0 > /tmp/1... för att stänga av bakgrundsbelysningen
echo 1 >/tmp/1wire/uncached/$LCD/backlight
COUNT=1
#Huvudloop
while [ 1 -lt 2 ]
do
#Variabel för att ta reda på hur lång tid det tar att läsa temperaturerna
TIMER_READ_START=`date +%s`
i=1
COUNT2=$COUNT
BROKE=0
while [ $i -le 4 ]; do
echo test$i
eval SNAME="\$S_NAME$COUNT2"
eval SID="\$S$COUNT2"
eval STYPE="\$S_TYPE$COUNT2"
if [ "$STYPE" == "TEMP" ]; then
echo "Läser sensor $COUNT2 - $SNAME (Temperatur)"
eval S_VAL$COUNT2=`cat /tmp/1wire/$CACHE/$SID/temperature|sed -e s/" "//g|awk '{$1=$1 + 0.05;printf "%.1f", $1}'`
else
echo "Läser sensor $COUNT2 - $SNAME (Luftfuktighet)"
eval S_VAL$COUNT2=`cat /tmp/1wire/$CACHE/$SID/HIH4000/humidity|sed -e s/" "//g|awk '{$1=$1 + 0.5;printf "%.0f", $1}'`
fi
COUNT2=`expr $COUNT2 + 1`
if [ $COUNT2 -gt $SENSORS ] && [ $i -ne 4 ]; then
echo "Breaking!"
BROKE=$i
break
fi
i=`expr $i + 1`
done
#Variabel för att beräkna tidsåtgång
TIMER_READ_END=`date +%s`
TIMEELAPSED=`expr $TIMER_READ_END - $TIMER_READ_START`
echo $TIMEELAPSED
sleep `expr $SCREEN_WAIT - $TIMEELAPSED`
j=0
while [ $j -le 3 ];do
if [ $BROKE -ne 0 ] && [ `expr $j + 1` -gt $BROKE ]; then
echo "Broke, $j"
if [ "$j" == "3" ]; then
echo "Datum:",`date +%Y-%m-%d` >/tmp/1wire/$LCD/line20.1
echo "ap"
fi
if [ "$j" == "2" ]; then
echo "VP: " `cat /tmp/power.txt|tail -n 1|sed -e s/".*="//`W"" >/tmp/1wire/$LCD/line20.3
echo "ap2"
fi
if [ "$j" == "1" ]; then
echo "2012-04-21 "> /tmp/1wire/$LCD/line20.2
echo "ap3"
fi
else
echo "Val $j"
eval SNAME="\$S_NAME$COUNT"
eval STYPE="\$S_TYPE$COUNT"
eval SVAL="\$S_VAL$COUNT"
if [ $STYPE == "TEMP" ]; then
append="ß"
else
append="%"
fi
echo "$SNAME: $SVAL$append " > /tmp/1wire/uncached/$LCD/line20.
fi
COUNT=`expr $COUNT + 1`
j=`expr $j + 1`
done
echo "COUNT=$COUNT"
if [ $COUNT -ge $SENSORS ]; then
COUNT=1
fi
done
elf98
Hemautomation - det är mer än en hobby
Inlägg: 5434 Blev medlem: 27 okt 2006, 13:49
Ort: Linköping
Kontakt:
Inlägg
av elf98 » 23 apr 2012, 22:22
Nu vet jag inte hur skriptet ser ut orginal, men du verkar ha tagit bort eller ändrat när saker skrivs till rad 0 som är den första raden. Routerns ipnummer skrivs ut vid uppstart så man ska slippa leta reda på det.
Visas inte några temperaturer alls? Och är de i såfall konfade i konfigfilen?
Grundade m.nu & temperatur.nu
Driver temperatur.nu
jonas_j
Tar hemautomation på allvar
Inlägg: 138 Blev medlem: 18 nov 2006, 15:00
Ort: Åkers Styckebruk
Inlägg
av jonas_j » 23 apr 2012, 22:36
elf98 skrev: Nu vet jag inte hur skriptet ser ut orginal, men du verkar ha tagit bort eller ändrat när saker skrivs till rad 0 som är den första raden. Routerns ipnummer skrivs ut vid uppstart så man ska slippa leta reda på det.
Visas inte några temperaturer alls? Och är de i såfall konfade i konfigfilen?
Visas inget. Innan angavs inte radnummer utan "$j"
Koden jag klippt in är bara ändrad just kring de tre raderna som har en else ap, ap1, ap2
elf98
Hemautomation - det är mer än en hobby
Inlägg: 5434 Blev medlem: 27 okt 2006, 13:49
Ort: Linköping
Kontakt:
Inlägg
av elf98 » 23 apr 2012, 22:42
$j är en variabel som stegade upp...
Grundade m.nu & temperatur.nu
Driver temperatur.nu
jonas_j
Tar hemautomation på allvar
Inlägg: 138 Blev medlem: 18 nov 2006, 15:00
Ort: Åkers Styckebruk
Inlägg
av jonas_j » 24 apr 2012, 22:27
Fick återställa orginalfilen, lcd.sh för att få in tempen igen. Vet inte vad jag kommit åt...
Att få det på de rader jag vill är motigt. Får bara till följande
Ute: 2°C
Inne: 21°C
Hus: 1250W, VP: 120W
Datum: 2012-04-24
Jag lyckas alltså inte få ute och inne på samma rad. Jag lyckas heller inte klura ut vad jag skriver för att få lite mer info från funktionen date.
ger: "2012-04-24"
Hur får jag dit veckodag, timmar och minuter? Skriver jag bara date får jag ut för mkt (sekunder och CEST 2012)
Edit: testade lite mer...
verkar funka och ger: 2012-04-24 22:33
Hur hittar jag veckodag?
Senast redigerad av
jonas_j den 24 apr 2012, 22:34, redigerad totalt 1 gånger.
elf98
Hemautomation - det är mer än en hobby
Inlägg: 5434 Blev medlem: 27 okt 2006, 13:49
Ort: Linköping
Kontakt:
Inlägg
av elf98 » 24 apr 2012, 22:33
http://unixhelp.ed.ac.uk/CGI/man-cgi?date ger dig all info om date du behöver.
Scriptet var aldrig tänkt att modifieras av användaren, eller ens att någon skulle titta på det... Därav den totala avsaknaden av kommentarer.
Grundade m.nu & temperatur.nu
Driver temperatur.nu
jonas_j
Tar hemautomation på allvar
Inlägg: 138 Blev medlem: 18 nov 2006, 15:00
Ort: Åkers Styckebruk
Inlägg
av jonas_j » 24 apr 2012, 22:34
ok
jonas_j
Tar hemautomation på allvar
Inlägg: 138 Blev medlem: 18 nov 2006, 15:00
Ort: Åkers Styckebruk
Inlägg
av jonas_j » 16 okt 2012, 23:03
Då var jag på det igen efter månader av uppehåll. Jag har äntligen kopplat in LED-räknaren och den tycks fungera men bara så långt att jag ser att den tickar upp med:
att sen få någon beräkning att ske på detta tycks inte gå
det tycks inte längre skapas någon \tmp\power.txt
koden som ska göra beräkningen
Kod: Markera allt
root@TemperaturMonitor:~# /mnt/scripts/power_calc.sh
LAST_COUNTER=1350419102
expr: non-numeric argument
COUNT_DIFF=
expr / 1000 + 43538,09
awk: cmd. line:1: Division by zero
Mätarställningen är kWh
SL: 2012-10-16 22:21,,1350418885 LC: 1350419102 - LC2_ 1350418885
COUNT_DIFF=217
TIME_DIFF = -
awk: cmd. line:1: Division by zero
Nuvarande effektuttag är: W
parameter "LAST_COUNTER" stegar inte upp... Vad missar jag?
jonas_j
Tar hemautomation på allvar
Inlägg: 138 Blev medlem: 18 nov 2006, 15:00
Ort: Åkers Styckebruk
Inlägg
av jonas_j » 16 okt 2012, 23:25
power_sum.sh
Kod: Markera allt
root@TemperaturMonitor:~# vi /mnt/scripts/power_sum.sh
#!/bin/sh
LOGTIME=`date '+%Y-%m-%d %H:%M'`
sleep 30
MATARE=`cat /tmp/power.txt|head -n1|sed -e s/MATARSTALLNING=//|awk '{$1=$1 + 0.5;printf "%d", $1}'`
echo "$LOGTIME $MATARE<br>" >> /mnt/log/matar.htmll
power_calc.sh
Kod: Markera allt
root@TemperaturMonitor:~# vi /mnt/scripts/power_calc.sh
#!/bin/sh
YEARMONTH=`date +%Y%m`
TIME=`date +%H:%M`
TIMESTAMP=`date +%s`
LOGTIME=`date '+%Y-%m-%d %H:%M'`
IF="/mnt/log/counter-$YEARMONTH.log"
LAST=`tail -n1 $IF`
SECOND_LAST=`tail -n2 $IF|head -n1`
ENERGI_TID=`cat /mnt/config.txt|grep ENERGI_TID=|sed -e s/ENERGI_TID=//|sed -e s
ENERGI_COUNT=`cat /mnt/config.txt|grep ENERGI_COUNT=|sed -e s/ENERGI_COUNT=//|se
ENERGI_MATARE=`cat /mnt/config.txt|grep ENERGI_MATARE=|sed -e s/ENERGI_MATARE=//
ENERGI_PULSE=`cat /mnt/config.txt|grep ENERGI_PULSE=|sed -e s/ENERGI_PULSE=//|se
#Mätarställningen:
LAST_COUNTER=`echo $LAST|sed -e s/,/" "/g|awk '$0=$3'`
echo "LAST_COUNTER=$LAST_COUNTER"
COUNT_DIFF=`expr $LAST_COUNTER - $ENERGI_COUNT`
echo "COUNT_DIFF=$COUNT_DIFF"
echo "expr $COUNT_DIFF / 1000 + $ENERGI_MATARE"
MATARSTALLNING=` echo "$COUNT_DIFF $ENERGI_MATARE $ENERGI_PULSE"| awk '{$1=$1 /
- /mnt/scripts/power_calc.sh 1/40 2%
#!/bin/sh
YEARMONTH=`date +%Y%m`
TIME=`date +%H:%M`
TIMESTAMP=`date +%s`
LOGTIME=`date '+%Y-%m-%d %H:%M'`
IF="/mnt/log/counter-$YEARMONTH.log"
LAST=`tail -n1 $IF`
SECOND_LAST=`tail -n2 $IF|head -n1`
ENERGI_TID=`cat /mnt/config.txt|grep ENERGI_TID=|sed -e s/ENERGI_TID=//|sed -e s/^M$//g`
ENERGI_COUNT=`cat /mnt/config.txt|grep ENERGI_COUNT=|sed -e s/ENERGI_COUNT=//|sed -e s/^M$//g`
ENERGI_MATARE=`cat /mnt/config.txt|grep ENERGI_MATARE=|sed -e s/ENERGI_MATARE=//|sed -e s/^M$//g`
ENERGI_PULSE=`cat /mnt/config.txt|grep ENERGI_PULSE=|sed -e s/ENERGI_PULSE=//|sed -e s/^M$//g`
#Mätarställningen:
LAST_COUNTER=`echo $LAST|sed -e s/,/" "/g|awk '$0=$3'`
echo "LAST_COUNTER=$LAST_COUNTER"
COUNT_DIFF=`expr $LAST_COUNTER - $ENERGI_COUNT`
echo "COUNT_DIFF=$COUNT_DIFF"
echo "expr $COUNT_DIFF / 1000 + $ENERGI_MATARE"
MATARSTALLNING=` echo "$COUNT_DIFF $ENERGI_MATARE $ENERGI_PULSE"| awk '{$1=$1 / $3 + $2 ;printf "%.1f", $1}'`
echo "Mätarställningen är $MATARSTALLNING kWh"
#Nuvarande förbrukning
LAST_COUNTER2=`echo $SECOND_LAST|sed -e s/,/" "/g|awk '$0=$3'`
TS1=`echo $LAST|sed -e s/,/" "/g|awk '$0=$4'`
TS2=`echo $SECOND_LAST|sed -e s/,/" "/g|awk '$0=$4'`
echo "SL: $SECOND_LAST LC: $LAST_COUNTER - LC2_ $LAST_COUNTER2"
COUNT_DIFF=`expr $LAST_COUNTER - $LAST_COUNTER2`
echo "COUNT_DIFF=$COUNT_DIFF"
TIME_DIFF=`expr $TS1 - $TS2`
echo "TIME_DIFF = $TIME_DIFF"
CURR_POWER=`echo "$COUNT_DIFF $TIME_DIFF $ENERGI_PULSE"|awk '{$1=$1 / $2 * 1000 / $3 * 3600; printf "%.0f", $1}'`
echo "Nuvarande effektuttag är: $CURR_POWER W"
echo "MATARSTALLNING=$MATARSTALLNING" > /tmp/power.txt
echo "NUVARANDE_EFFEKT=$CURR_POWER" >> /tmp/power.txt