HomeMini:Zusatzscripts

Aus Hansemannwiki
Wechseln zu: Navigation, Suche

Wie schon erwähnt, laufen im Hintergrund, per cron ausgeführt, ein paar Scripts, die kleine, aber feine Aufgaben erfüllen.

Inhaltsverzeichnis


fetchplots.sh

Dieses script holt per wget regelmässig alle in fhem.cfg definierten Weblinks von Fileplots ab und kopiert sie ins Web-Verzeichnis.

#!/bin/sh
host="http://fhem.server.name:8083";
options="&pos=zoom=week";
filetype="svg";
configfile="/etc/fhem.cfg";
targets="/pfad/zum/ersten/Verzeichnis /pfad/zu/weiterem/Verzeichnis /und/so/weiter";

for i in $(awk '/weblink fileplot/ { print $2 ":" $5 }' $configfile); do

year=$(date +%Y);

weblink=$(echo $i | cut -d ":" -f 1);
filelog=$(echo $i | cut -d ":" -f 2);
logtype=$(echo $i | cut -d ":" -f 3);

search="define $filelog";
define=$(awk '$0 ~ s { print $4 ":" $5 }' s="$search" $configfile);

logfile=$(echo $define | cut -d ":" -f 1);
logfile=$(echo $logfile | sed "s/%Y/$year/g")
logfile=${logfile##*/};

sensor=$(echo $define | cut -d ":" -f 2);

source="$host/fhem?cmd=showlog $weblink $filelog $logtype $logfile$options";
wget -q "$source" -O $sensor.$filetype;

for t in $targets; do
 cp $sensor.$filetype $t
done
rm $sensor.$filetype

echo $sensor finished.
done

Das Script ist bei mir unter /usr/share/fhem abgelegt und wird mit folgender crontab-Zeile gestartet:

# m                               h  dom mon dow   command
*/5 *   *   *   *    /usr/share/fhem/fetchplots.sh

(Das Script wird also alle 5 Minuten ausgeführt)

setpoint.sh

Ein Script, das aus einem Parameterfile Uhrzeitabhängig eine Solltemperatur ausliest und als Sollwert an ein PID-Device von fhem übergibt.

#!/bin/sh
awk 'BEGIN { "date +%H:%M" | getline time }
     $1 <= time { if((NF > 0)&&($2 ~ ele)) x = $3}
     END { print "set " ele " desired " x}' ele=$1 $2 | nc localhost 7072

Das Script erfordert zwei Übergabeparameter:

  1. PID-Devicename
  2. Tabellendateiname

Die zugehörige Tabellendatei ist wie folgt aufgebaut:

06:00 PID_WZ 20
10:00 PID_WZ 22
13:00 PID_WZ 23
16:00 PID_WZ 22
20:00 PID_WZ 20
22:00 PID_WZ 16

Jede Zeile legt einen Schaltpunkt eines PID-Devices fest. Die erste Spalte definiert die Uhrzeit, die zweite das Device, und die Dritte die Solltemperatur.

Per awk wird die Liste solange durchlaufen, solange die Uhrzeit in der 1. Spalte kleiner gleich aktuellen Uhrzeit ist. Von jeder Zeile, in der das Device dem als Parameter 1 vorgegebenen Device entspricht, wird die Solltemperatur als Variable x gespeichert. Wenn das File zu Ende gelesen ist, wird "set <PID-Device> desired <Solltemp.>" per netcat an fhem geschickt.

Funktioniert eigentlich recht brav, jedoch fehlen noch ein paar Dinge:

Aufgerufen wird das Script von folgender crontab:

# m h  dom mon dow   command
  * *   *   *   *    /pfad/zu/setpoint.sh PID_WZ pid_wz.table

(Das Script wird also jede Minute ausgeführt)

pingtest.sh

Dieses Script führt regelmässig ping's zu in einer Liste festgelegten Rechnern aus. Je nachdem, ob der Rechner ereichbar war oder nicht, wird ein fhem-Befehl abgeschickt, mit dem z.B. die Schreibtischlampe, die Monitore oder sonstiges Zubehör geschalten werden können.

#!/bin/sh
rechnerliste="rechner.list";
host="localhost";
port="7072";

for line in $(awk '/^[^#]/ { print $1 ":" $2 ":" $3 ":" $4 }' $rechnerliste); do
  rechner=$(echo $line | cut -d ":" -f 1);
  element=$(echo $line | cut -d ":" -f 2);
  truestate=$(echo $line | cut -d ":" -f 3);
  falsestate=$(echo $line | cut -d ":" -f 4);

  ping $rechner -q -c 1
  if [ $? -eq "0" ]; then
    state=$truestate;
  else
    state=$falsestate;
  fi

  echo "set $element $state" | netcat $host $port;
done

Die zugehörige Tabellendatei ist wie folgt aufgebaut:

# Rechnername       fhem Element     State bei OK      State bei Fail
meineip.domain.net    Lampe1             on                 off

Jede Zeile definiert einen Rechner, das zu schaltende fhem-Element und die Sollzustände für erfolgreiche ping's oder fehlerhafte.

Per awk wird die Datei Zeilenweise durchlaufen, alle Zeilen mit # am Anfang werden ignoriert. awk fasst die Zeile als per ":" getrennten String zusammen, der mit dem Befehl cut in die einzelnen ELemente aufgesplittet wird.

Danach wird ein ping auf den Rechnernamen ausgeführt, der Rückgabewert $? ist entweder "0" (bei erfolgreichem Ping) oder "1" (bei fehlgeschlagenem Ping). In der if Abfrage wird je nach Rückgabewert der "OK" oder "FAIL"-Zustand gespeichert, und im Anschluss per netcat an fhem gesandt.

Aufgerufen wird das Script von folgender crontab:

# m h  dom mon dow   command
  * *   *   *   *    /pfad/zu/pingtest.sh

(Das Script wird also jede Minute ausgeführt)


Zurück zu HomeMini

Meine Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
Werkzeuge