[Projektvorstellung] Piduino - Eine Universalplattform mit RaspberryPi und Ardui

Begonnen von m2th3o, 17 Dezember 2014, 15:34:24

Vorheriges Thema - Nächstes Thema

m2th3o

Liebe Gemeinde,

im Winter ist Basteilzeit und so habe ich ein schon von langer Hand geplantes Projekt realisiert, was ich euch gerne vorstellen möchte.

Ziel / Anforderungsliste

Ziel war es, eine einfache, flexible Universalplattform zu schaffen. Die weiteren Anforderungen waren:

  • Universalplattform, in die versch. Sensoren (Temperatur, PT100, Licht, ...) einfach integriert werden können
  • keine low-level-uController-Programmierung
  • keine low-level-Protokoll-Programmierung
  • volle Integration in FHEM

Lösungsansatz

Natürlich gibt es die unglaublich fundierten und leistungsfähigen Arbeiten von trilu und Dirk (AskSin und Universalsensor), aber das war mir insbesondere bzgl. der komplexen Programmierung / Anpassung auf uController und HM-Protokollebene in der Tool-Chain einfach zu komplex und unflexibel. Von Vorteil ist hier natürlich die volle Homematic-Integration sowie eine geringe Leistungsaufnahme (Batteriebetrieb möglich).

Da ich noch einen RaspberryPi rumfliegen hatte, sollte dieser auf jeden Fall verwendet werden. Leider ist mit diesem ohne A/D-Wandler kein Einlesen von analogen Werten an den GPIOs möglich.
Per Zufall bin ich "in diesem Internet" auf die mögliche Kombi mit einem Arduino gestoßen. Praktisch, dass ich davon ebenfalls noch einen Uno R3 rumfliegen hatte.

Umsetzung

Für die Umsetzung müssen folgende Schritte durchgeführt werden:

  • In FHEM ein Dummy (Piduino) anlegen und mind. ein Reading hinzufügen
  • Auf dem "Piduino" die Arduino IDE installieren
  • Ein Arduino-Programm erstellen
  • Auf dem "Piduino" ein Python-Skript anlegen, welches die Daten per serieller Schnittstelle vom Arduino holt und an FHEM sendet

FHEM

  • Anlegen eines neuen Dummies: set Piduino dummy
  • Anlegen eines neuen Readings im Dummy: setreading Piduino temperature 0
  • Weitere Readings nach Belieben anlegen

RaspberryPi

  • Arduino IDE mit apt-get install installieren
$ sudo apt-get update
$ sudo apt-get install arduino


  • Arduino IDE öffnen - Wenn man komplett per SSH auf dem Pi arbeitet, helfen folgende beiden Befehle, um den X-Server zu spiegeln
$ ssh -X benutzer@ip
$ lxpanel&


  • Starten der Arduino IDE
  • Erstellen eines Arduino-Programms, z.B. zum Übermitteln von Temperaturwerten. Detaillierte Beschreibung folgt unter "Arduino".
  • Anlegen eines Python-Skripts, welches die Daten über die serielle Schnittstelle vom Arduino abholt und z. B. per WLAN oder LAN an FHEM sendet


#!/usr/bin/env python

from serial import Serial
from time import sleep
import re
import urllib2

serial_port = '/dev/ttyACM1';
serial_bauds = 9600;

def open_serial_port() :
s = Serial(serial_port, serial_bauds)
s.flushInput()
return s

def read_value(s) :
line = s.readline()
if line.startswith('set'):
print line
urllib2.urlopen('http://fhem_ip/fhem?cmd=' + line)
return

ser = open_serial_port();
while True:
temp = read_value(ser)
sleep(1)


Das stellt quasi ein Universalskript dar, welches beliebige Befehle - mit "set" beginnend - vom Arduino nimmt und an FHEM per Webpost übermittelt. So lässt sich auch das einfache Beispiel beliebig erweitern...
Am Ende sollte man das Skript noch so einstellen, dass es beim Neustart des RPi automatisch mit gestartet wird. Dazu sind folgende Schritte auszuführen:





Das Skript vorbereiten#!/usr/bin/env python
Das Skript ausführbar machensudo chmod +x skript.py
Das Skript in die rc.local datei eintragensudo vim /etc/rc.local und vor "exit 0" den Pfad zum Skript /home/pi/skript.py &

Arduino

  • Starten der Arduino IDE
  • Erstellen eines Arduino-Programms, z.B. zum Übermitteln von Temperaturwerten. Detaillierte Beschreibung folgt unter "Arduino".(z. B. von LM35, hier war es ein PT100 Messwandler), welches in der Struktur wie folgt aufgebaut ist

int analogInPin = A0;

int sensorValue = 0;
int outputValue = 0;
int holdValue = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  sensorValue = analogRead(analogInPin);
  outputValue = map(sensorValue, 100, 1021, 0, 247);
  if ((outputValue < holdValue - 2) || (outputValue > holdValue + 2)) {
    Serial.print("setreading%20Piduino%20temperature+");
    Serial.print(outputValue);
    Serial.print("\n");
    holdValue = outputValue;
    delay(1000); 
  }
}

Wichtig ist, dass:

  • Eine serielle Verbindung aufgemacht wird.
  • der String mit "setreading..." und dem Wert übertragen wird
  • Konkret wird in FHEM ein reading "temperature" im (dummy)Device Piduino auf outputValue gesetzt
  • der holdValue wird lediglich benötigt, um unnötigen Traffic zu vermeiden. Wo man das letztendlich wegfiltert, hab ich noch nicht zuende gedacht. Hier jetzt direkt an der Quelle - in Arduino

Wie das ganze als Hardware aussieht kann man sich in den beiden Anhängen gucken.
Ich habe jetzt auf dem Mini-Breadboard einen PT100-Messwandler für meine Sauna angeschlossen und einen LM35 für die allgemeine Raumtemperatur. An Sensorik ist jetzt alles denkbar, was sich auch in in einen Arduino integrieren lässt.

Freue mich auf eure Anregungen und Anmerkungen :)

Gruß,
Markus

Patrik

Hallo Markus,

genial. So etwas brauche ich für meine Haussteuerung, und nicht nur für die analogen Daten. Ich habe z.B. Zählerdaten, die ich mit Arduino generieren und dann nach FHEM transferieren will.

Mein FHEM ist auf dem RPi. Wie muss ich das Python-Skript anpassen, um nicht über die IP-Adresse zu gehen?

Gruß
Patrik

FilliFairy

Hallo Markus,

Deine Idee habe ich auch aufgegriffen und danke Dir für den Vorschlag.

Da die Datenübermittlung gelegentlich abgerissen ist, bin ich auf Ursachenforschung gegangen und dabei bemerkt, dass der readline() auf die serielle Schnittstelle im Python Script die Ursache war.

Beheben konnte ich das Problem, indem das Anlegen der Schnittstelle mit dem Parameter für den timeout aufgerufen wird:

Serial(serial_port, serial_bauds, timeout=3)

Gruß

FilliFairy
FHEM auf Raspi mit
HMLAN: HM-CC-RT-DN,HM-CC-TC,HM-CC-VD,HM-LC-BL1-FM,HM-LC-SW1-PL2,HM-LC-SW2-FM,HM-LC-Sw1PBU-FM,HM-RC-4-B,HM-SCI-3-FM,HM-SEC-MDIR,HM-SEC-MDIR-2,HM-SEC-SC-2,HM-SEC-TIS,HM-Sen-MDIR-O,HM-WDS10-TH-O,HM-WDS40-TH-I
OWDevice: DS18B20,DS2408,DS2413,DS2438