Startseite>Mit Teamviewer IoT eine Indoor-Farm überwachen
Aus Raspberry Pi Geek 06/2018

Mit Teamviewer IoT eine Indoor-Farm überwachen (Seite 4)

Listing 12

 

/*
   light.c
*/
#include <stdio.h>
#include <wiringPi.h>
#include <wiringPiSPI.h>
int aread(int channel) {
  unsigned char buffer[3] = {1};
  buffer[1] = (8+channel)<<4;
  wiringPiSPIDataRW(0, buffer, 3);
  return ((buffer[1] & 3) << 8) + buffer[2];
}
int main() {
  wiringPiSPISetup(0,1000000);
  int value = aread(2);
  //double voltage = (value*3.3)/1024;
  //double light = voltage*10;
  printf("%d",value);
  return 0;
}

Listing 13

 

$ gcc -Wall -o temp temp.c -lwiringPi
$ gcc -Wall -o hum hum.c -lwiringPi
$ gcc -Wall -o light light.c -lwiringPi

Bevor Sie die Programme starten, fällt noch ein weiterer Arbeitsschritt an: Normalerweise ist die SPI-Schnittstelle des Raspberry Pi nach der Installation deaktiviert. Sie benötigen sie aber, um mit dem MCP3008 zu kommunizieren. Daher aktivieren Sie sie über das Tool Raspi-config (5 Interfacing Options | P4 SPI | Yes). Um sicherzugehen, dass der SPI-Treiber geladen ist, starten Sie den RasPi neu. Nun lesen Sie mit den drei Programmen die Werte für Temperatur, Bodenfeuchte und Helligkeit aus (Listing 14).

Listing 14

 

$ ./temp
$ ./hum
$ ./light

Um die Ausgaben der Programme an die Teamviewer API zu senden, kommt das Shell-Skript updateData.sh zum Einsatz (Listing 15). Es besteht nur aus bereits bekannten Kommandos; das einzig Neue stellt die Integration der Ausgabe der drei Programme in die MQTT-Nachricht dar. Hier verwenden Sie einen Unix-Mechanismus, der es erlaubt, die Ausgaben von Programmen als Variablen in ein Shell-Kommando einzubauen $(Programm) .

In updateData.sh definieren Sie auch die GPIOs für die Lichtsteuerung und die Pumpe als Ausgänge. Um das Skript via Crontab regelmäßig starten zu können, müssen Sie es nach dem Speichern noch ausführbar machen:

$ chmod +x updateData.sh

Listing 15

 

#!/bin/sh
# -------------
# updateData.sh
# -------------
. /home/pi/tvenv.sh
LHOST="localhost"
LPORT="8883"
CERT="/home/pi/myConnector.crt"
KEY="/home/pi/privkey.pem"
V_TEMP="$(/home/pi/temp)"
V_HUM="$(/home/pi/hum)"
V=LIGHT="$(/home/pi/light)"
LOGFILE="/tmp/farm.data"
call_tv_api () {
/usr/bin/mosquitto_pub \
-h ${LHOST} \
-p ${LPORT} \
--cert ${CERT} \
--key ${KEY} \
--cafile $cafile \
-t /v1.0/$conID/sensor/$sensorID \
-f ${LOGFILE}
}
touch ${LOGFILE}
cat << EOM > ${LOGFILE}
{"metrics":
[
{"metricId" : "$TempID",    "value" : ${V_TEMP:-0.0} },
{"metricId" : "$FeuchteID", "value" : ${V_HUM0:-0.0} },
{"metricId" : "$LichtID",   "value" : ${V_LIGHT:-0}  }
]
}
EOM
call_tv_api
/usr/bin/gpio mode 0 out
/usr/bin/gpio mode 1 out

Um das Skript in regelmäßigen Zeitabständen laufen zu lassen, müssen Sie noch einen entsprechenden Eintrag in der Crontab vornehmen (Listing 16). Er sorgt dafür, dass der Dienst das Skript updateData.sh alle fünf Minuten aufruft.

Listing 16

 

*/5 * * * * /home/pi/updateData.sh
1 8 * * * /usr/bin/gpio write 0 1
1 20 * * * /usr/bin/gpio write 0 0
2 20 * * * /home/pi/runPump

Über Cron steuern Sie zusätzlich auch die Beleuchtung und die Bewässerung. Letztere startet nur, wenn die Bodenfeuchte unter den Wert 10 fällt. Diese Schwelle eignet sich auf jeden Fall für erste Tests, hängt aber vom verwendeten Erdreich ab und variiert bei Ihnen unter Umständen etwas.

Zum Bewässern startet die Pumpe in unserem Beispiel für 30 Sekunden. Diese Zeitspanne hängt von der Förderleistung der konkret verwendeten Pumpe ab. Zum Steuern kommt ein weiteres C-Programm (Listing 17) zum Einsatz, das Sie über Cron starten. Um das Programm zur Pumpensteuerung zu kompilieren, verwenden Sie die Zeile aus Listing 18.

Listing 17

 

/*
   runPump.c
*/
#include <stdio.h>
#include <wiringPi.h>
#include <wiringPiSPI.h>
int aread(int channel) {
  unsigned char buffer[3] = {1};
  buffer[1] = (8+channel)<<4;
  wiringPiSPIDataRW(0, buffer, 3);
  return ((buffer[1] & 3) << 8) + buffer[2];
}
int main() {
  wiringPiSPISetup(0,1000000);
  wiringPiSetup();
  pinMode(1,OUTPUT);
  int value = aread(1);
  double voltage = (value*3.3)/1024;
  double hum = (voltage/3)*50;
  printf("%f",hum);
  if(hum < 10) {
    digitalWrite(1,HIGH);
    delay(30000) ;
    digitalWrite(1,LOW) ;
  }
  return 0;
}

Listing 18

 

$ gcc -Wall -o runPump runPump.c -lwiringPi

Die Beleuchtung schalten Sie einfach mit dem Kommando gpio an und aus, das Sie direkt in die Crontab schreiben. Abbildung 9 zeigt das Dashboard mit den Messwerten für einige Tage.

Abbildung 9: Das Dashboard mit Daten für einige Tage.

Abbildung 9: Das Dashboard mit Daten für einige Tage.

Fazit

Es macht etwas Mühe, ein eigenes Projekt in die IoT-Umgebung von Teamviewer zu integrieren. Das liegt aber nicht zuletzt daran, dass hier Sicherheit an erster Stelle steht – was immer etwas Aufwand erfordert. Haben Sie die ersten Hürden überwunden, dann lassen sich über die MQTT-Schnittstelle der API problemlos neue Komponenten hinzufügen.

Die intuitiv bedienbare Weboberfläche von Teamviewer IoT erweist sich als gut durchdacht und betriebssicher. Über sie lassen sich auch Alarme auslösen und Aktionen starten. Innerhalb der nächsten Monate will der Hersteller ein C-basiertes Development-Kit herausbringen, das die Funktionen der API kapselt – dann lohnt sich ein entsprechendes Update der Programme. 

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: HeftseitenPreis €0,99
(inkl. 19% MwSt.)
€0,99 – Kaufen
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland