Aquariumsteuerung mit Raspberry Pi 3 B+

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:
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
 
Was mir so pauschal auffällt und warum du wohl keinen Zugriff auf die GPIO bekommst:

#Sicherstellen, dass der Dienst für GPIO-Pins gestartet ist.
#Dies geschieht mit:
#sudo systemctl enable pigpiod und
#sudo systemctl start pigpiod
 
ghecko schrieb:
Was mir so pauschal auffällt und warum du wohl keinen Zugriff auf die GPIO bekommst:

#Sicherstellen, dass der Dienst für GPIO-Pins gestartet ist.
#Dies geschieht mit:
#sudo systemctl enable pigpiod und
#sudo systemctl start pigpiod
Habe ich bereits, sonst ginge es in der Shell ja ebenfalls nicht.
 
ich denke Christopher Barnatt kann hier helfen
 
Wasserwechseln von Aquarien kann man auch einfacher haben ohne alles abzupumpen oder komplett zu wechseln. Oben sichtbar steht ein das große Schaubecken und unten im fast leeren Schrank befinden sich Pumpe, Lüfter oder Futter. Ein kleineres Zusatzbecken kann da hilfreicher sein und dort das Wasser teilweise erneuern. Oben im Becken wird nichts angerührt und vielleicht einmal jährlich gesäubert. Unten jedoch kann man einen besseren Filter/Pumpe/Zusatzheizung montieren. Nach Wasseraustausch dort den Kreislauf zuschalten wenn eine angenehme Temperatur für die Lebewesen erreicht wurde ohne das sie einen Kälteschock erleiden.
 
Das macht absolut keinen Sinn. Ich beschäftige mich seit 1993 mit Aquariumtechnik und wenn ich eines satt habe, dann ist es Wasserwechsel. Egal wo der passiert, sichtbar oder unsichtbar. Deswegen baue ich ja gerade alles um auf vollautomatischen Betrieb. Und wohin stelle ich das Zusatzbecken? Es gibt schmale Unterschränke da ist für sowas kein Platz. Letztendlich baue ich mir eine Lösung, so dass ein Aquarium 365 Tage im Jahr ohne menschlichen Eingriff komplett eigenständig funktioniert. Alles was dann noch bleibt, ist die Filterreinigung und das Entfernen von alten Pflanzenresten.
 
Zurück
Oben