Raspberry PI automatisch hoch und runterfahren

Hab einen meiner PIs auf meiner Photovoltaik Inselanlage laufen. Der benötigt zwar nur etwa 2 Watt, allerdings ist mir sogar das für den Winterbetrieb zuviel. Hauptsächlich erfasst der ja nur den Ladestrom von der PV Anlage. (Macht auch noch ein paar andere Dinge, aber die müssen in der Nacht nicht unbedingt laufen.)

Darum wär es ja toll, den PI einfach vom permanent versorgten PI hoch- und runterfahren zu lassen. Im Prinzip ginge das ja recht einfach. Z.B. via Relais einfach den Strom einschalten, und – wenn es abend wird – ein „shutdown“ schicken, und z.B. nach 1 Minute den Strom wieder ausschalten.

Leider kann es in der Praxis allerdings vorkommen, dass das Runterfahren einmal länger, einmal kürzer dauern kann. -> Eine Fixe Zeit ist deshalb natürlich eher ein Glücksspiel; irgendwann muss der PI noch Swap leeren, was auf seine SD Karte, oder auf den Netzwerkspeicher schreiben. -> Dann kommts früher oder später zu einem Datenverlust…

Zum Glück gibts für so ein Problem schon eine (relativ schlecht dokumentierte) Anleitung, bzw. sogar einen Bausatz im Internet. Ist allerdings mit programmierbarer Echtzeituhr und allem möglichen anderen Glim Bim doch recht aufwändig. Drum hab ich mir eine – stark vereinfachte – Schaltung selber aufgebaut :

Das hat auch gleich den Vorteil, dass der Step-Down-Converter im ausgeschalteten Zustand dann nicht mehr läuft.

Die beiden Pins (links unten) werden an den permanent laufenden PI angeschlossen, und schalten den PI ein.

Damit das Ausschalten korrekt funktioniert, muss noch ein Kernelmodul geladen werden. Eigentlich sollte dass via /boot/config.txt gehen. Das hat bei mir allerdings nicht funktioniert.

-> In die rc.local (vor dem exit 0) muss folgendes rein :

dtoverlay gpio-poweroff gpiopin=4 active_low

Raspberry PI Grafana

Für den PI gibts auch ein Grafana und eine InfluxDB.

Das Paket, welches Raspbian mitbring ist leider zu alt.

-> Am Besten so eins verwenden :
https://github.com/fg2it/grafana-on-raspberry/releases

In die InfluxDB kann man dann so reinschreiben :

echo -e "Photovoltaik1,component=LadeStrom value=$v1\nPhotovoltaik1,component=EntladeStrom value=$v2\nPhotovoltaik1,component=WandlerSpannung value=$v3\nPhotovoltaik1,component=AkkuSpannung value=$v4\n" | \
curl -i -XPOST http://$influxhost:$influxport/write?db=$influxdb --data-binary @-

Damit lassen sich dann solche Grafen darstellen :

Im übrigen gibt es bei dieser Version sogar die Möglichkeit, als DataSource eine MySQL auszuwählen.
Leider ist das allerdings noch nicht so richtig ausgereift.
Damit geht folgendes NICHT :
*) 2 Y-Achsen (f. Strom/Spannung in einem Grafen)
*) Farben frei wählen (alle Kurven haben nach dem Speichern die gleiche Farbe)
*) Kurven benennen (steht immer nur „unknown“)

Raspberry PI als Webradio verwenden und Endstufe automatisch ein und ausschalten

Es gibt einige Möglichkeiten, ein Software Webradio zu basteln.
Ich hab es mit mpd gemacht, weil sich der recht einfach via Android APP (Droid MPD Client) steuern lässt.

Normalerweise kann man den einfach mit „apt install mpd“ installieren.
Leider ist das Raspbian Paket im Moment (30.Juli 2017) scheinbar kaputt.

Darum muss man das selber kompilieren :

https://www.musicpd.org/doc/user/install_source.html

—————————————-

Das funktioniert soweit recht gut (via USB Soundkarte), schaltet man einen Endstufe via Relais ein und aus, ist das allerdigs ein recht manueller Vorgang.
-> Das gehört natürlich automatisiert.

cat endstufeautoeinaus.sh
#!/bin/bash

relaisnummer=3

o=0
w=2

while (true) do
 s=$(cat /proc/asound/card1/stream0 | grep Status | head -n 1)
 if test "$s" != "$o"
 then
  if test "$s" == "  Status: Running"
  then
   echo ein
   curl http://10.0.9.6/relais/?nummer=$relaisnummer\&wert=1
  else
   sleep 2
   s=$(cat /proc/asound/card1/stream0 | grep Status | head -n 1)
   if test "$s" != "  Status: Running"
   then
    echo aus
    curl http://10.0.9.6/relais/?nummer=$relaisnummer\&wert=0
    w=1
   fi
  fi
  o="$s"
 fi
 sleep $w
 w=2
done

Das Script überwacht die USB Soundkarte, sobald sie im Status „running“ ist, wird das entsprechende Relais eingeschaltet, fürs Ausschalten gibt es eine vernünftige Verzögerung, weil die Endstufe eine ca. 10 Sekunden andauernde Einschaltverzögerung hat. (Das würde sonst stören, gibt sonst immer wieder lange Verzögerungen beim Umschalten…)

Raspberry PI – Relais schalten

Hat man mehrere Relais am PI hängen, möchte man vermutlich dafür ein Script haben, um die Relais komfortabel schalten zu können :

cat /bin/relais
#!/bin/bash

case $1 in
1) pin=21; ;;
2) pin=20; ;;
3) pin=26; ;;
4) pin=16; ;;
5) pin=19; ;;
6) pin=13; ;;
7) pin=12; ;;
8) pin=6; ;;
*)
 for (( x=1 ; $x<=8 ; x++ ))
 do
  /bin/relais $x
 done
exit 0 ;;

esac

if test "$2" == ""
then
 if test "$(cat /sys/class/gpio/gpio$pin/value)" == "0"
 then
  echo 1
 else
  echo 0
 fi
else

 if test "$2" == "1"
 then
  v=0
 else
  v=1
 fi
 #gpio -g mode $pin output
 #gpio -g mode $pin $1

 echo "$pin" > /sys/class/gpio/export 2>/dev/null
 echo "out" >  /sys/class/gpio/gpio$pin/direction
 echo "$v" > /sys/class/gpio/gpio$pin/value

# echo "$(date) $1 $(whoami)" >> /tmp/strom.log
fi

Weiters ist es von Vorteil, die Ausgänge beim Booten zu initialisieren, damit ein definierter Zustand herrscht :

cat /etc.rc.local
...
for (( r=1; $r<=8; r++)); do /bin/relais $r 0; done

Läuft sowieso schon ein Webserver mit PHP, dann bietet sich auch noch ein PHP Script an, um via Webinterface schalten zu können. (Achtung ! das hat keinen Passwortschutz eingebaut) :

index.php :
index_relais_schalten.php

visudo :

...
www-data ALL=(ALL) NOPASSWD: /bin/relais
...

Analog Digital Converter DS2450 am Raspberry PI

Wollte nun mal einen DS2450 am PI anschliessen.
Leider funktioniert das NICHT mit dem Kernel Modul.
(dzt. kein Treiber vorhanden, es taucht nur ein „rw“ device auf…)

D.h. man muss – leider – den Umweg über einen USB-RS232 Converter gehen.

apt instal owfs

Server starten :

owhttpd –passive=/dev/ttyUSB0 -p 4444

Im Browser eingeben, um die Adresse des ds2450 herauszufinden :
http://PI_ADRESSE:4444/bus.0

Ergebnisse in einem Script verwenden :
v=$(wget -qO- http://127.0.0.1:4444/uncached/text/20.xxxxxxxxxxxx/volt.ALL | tr ‚,‘ ‚ ‚)

Test
while (true) do wget -qO- http://127.0.0.1:4444/uncached/text/20.xxxxxxxxxxxx/volt.ALL; done