M
m5space
Gast
Hallo zusammen, künftig will ich beim Aquarium die Wasserwechsel von einem Raspberry Pi zeitgesteuert machen lassen und das ganze per Cronjob steuern. Licht ein/aus dann selbstverständlich auch.
Das entsprechende Skript ist bereits fertig gestellt, jedoch darf ich aus irgendwelchen Gründen im Skript die GPIO-Pins nicht ansteuern. In der Shell jedoch schon.
Was kann da los sein?
In der Shell klappt ein Steuern der Pins:
Im Skript jedoch nicht:
Weiterhin möchte ich gerne noch die Port-Ansteuerung in eine while-Schleife einfügen, erhalte aber zahlreiche Fehlermeldungen.
Wie bekomme ich ein "pigs r $inMinPegel" in das while hinein?
LG.
Hier ist das komplette Skript.
aquactrl.zsh
Das entsprechende Skript ist bereits fertig gestellt, jedoch darf ich aus irgendwelchen Gründen im Skript die GPIO-Pins nicht ansteuern. In der Shell jedoch schon.
Was kann da los sein?
In der Shell klappt ein Steuern der Pins:
Code:
pi@Brotdose:~/aquactrl $ pigs w 7 0
pi@Brotdose:~/aquactrl $
Im Skript jedoch nicht:
Code:
pi@Brotdose:~/aquactrl $ ./aquactrl.zsh change
-41
ERROR: no permission to update GPIO
-41
ERROR: no permission to update GPIO
./aquactrl.zsh: line 97: [: r: binary operator expected
./aquactrl.zsh: line 106: [: r: binary operator expected
-41
ERROR: no permission to update GPIO
pi@Brotdose:~/aquactrl $
Weiterhin möchte ich gerne noch die Port-Ansteuerung in eine while-Schleife einfügen, erhalte aber zahlreiche Fehlermeldungen.
Wie bekomme ich ein "pigs r $inMinPegel" in das while hinein?
LG.
Hier ist das komplette Skript.
aquactrl.zsh
Code:
#!/bin/bash
#aquactrl steuert das komplettes Aquarium.
#Es macht automatische Wasserwechsel und
#steuert Lampen, Pumpen, und vieles mehr
#Sicherstellen, dass der Dienst für GPIO-Pins gestartet ist.
#Dies geschieht mit:
#sudo systemctl enable pigpiod und
#sudo systemctl start pigpiod
#Parameter, die übergeben werden können (werden mit $1 abgefragt)
#----------------------------------------------------------------
#light-on : Licht einschalten
#light-off: Licht ausschalten
#change : Wasserwechsel einleiten
#Hilfe zur GPIO-Steuerung
#------------------------
#GPIO n als Ausgang : pigs modes n w
#GPIO n als Eingang : pigs modes n r
#GPIO n auf High : pigs w n 1
#GPIO n Status lesen: pigs r n
#Ausgänge, GPIO-Pin
#------------------
outLicht="7" #Beleuchtung
outAblass="11" #Magnetventil Wasser ablassen
outZulauf="13" #Magnetventil Wasserzulauf
outPumpe="15" #Wasserpumpe
outHeizung="29" #Heizung
pigs modes $outLicht w
pigs modes $outAblass w
pigs modes $outZulauf w
pigs modes $outPumpe w
pigs modes $outHeizung w
#Eingänge und Sensoren
#---------------------
inMaxPegel="12" #Sensor für Wasserstand maximal
inMinPegel="16" #Sensor für Wasserstand minimal
pigs modes $inMaxPegel r
pigs modes $inMinPegel r
#Variablen
#---------
f="${BASH_SOURCE%/*}/aquactrl.log" #f=file, logdatei
d=$(date +%d.%m.%Y) #d=datum
t=$(date +%H:%M:%S) #t=time,uhrzeit
dwa="5s" #dwa=dauer wasserablass
dwz="5s" #dwz=dauer wasserzulauf
#Log-Datei erstellen, falls noch keine existiert
#-----------------------------------------------
if [ ! -f $f ]
then
echo "date d.m.Y;time H:M:S CET 24 h;message;data" >> $f
echo "$d;$t;(this) logfile created;$f" >> $f
fi
#Licht aus, wenn als Parameter übergeben
#---------------------------------------
if [ "$1" = "light-off" ]
then
#Licht aus
pigs w $outLicht 0
#Loggen
echo "$d;$t;light;off" >> $f
fi
#Licht an, wenn als Parameter übergeben
#--------------------------------------
if [ "$1" = "light-on" ]
then
#Licht ein
pigs w $outLicht 1
#Loggen
echo "$d;$t;light;on" >> $f
fi
#Wasser wechseln, wenn als Parameter übergeben
#---------------------------------------------
if [ "$1" = "change" ]
then
#Beginn Loggen
echo "$d;$t;water change;started" >> $f
#Heizung aus, um Überhitzung zu vermeiden
pigs w $outHeizung 0
#Pumpe aus, um Trockenlauf zu verhindern (bei Einhängepumpen)
pigs w $outPumpe 0
#Ablaufventil geöffnet halten, bis Wasser Minimalstand erreicht hat
while [ 1 ] #pigs r $inMinPegel
do
pigs w $outAblass 1
done
#Ablaufventil schließen
pigs w $outAblass 0
#Zulaufventil offen halten, bis Wasser Maximalstand erreicht hat
while [ 1 ] #pigs r $inMaxPegel
do
pigs w $outZulauf 1
done
#Zulaufventil schließen
pigs w $outZulauf 0
#Heizung ein
pigs w $outHeizung 1
#Pumpe ein
pigs w $outPumpe 1
#Fertigstellung Loggen
echo "$(date +%d.%m.%Y);$(date +%H:%M:%S);water change;finished" >> $f
fi
#ende