FHEM Forum

FHEM - Hardware => Einplatinencomputer => Thema gestartet von: m2th3o am 17 Dezember 2014, 15:34:24

Titel: [Projektvorstellung] Piduino - Eine Universalplattform mit RaspberryPi und Ardui
Beitrag von: m2th3o am 17 Dezember 2014, 15:34:24
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:

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:

FHEM

RaspberryPi
$ sudo apt-get update
$ sudo apt-get install arduino

$ ssh -X benutzer@ip
$ lxpanel&



#!/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

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:

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
Titel: Antw:[Projektvorstellung] Piduino - Eine Universalplattform mit RaspberryPi und Ardui
Beitrag von: Patrik am 08 Januar 2015, 16:06:20
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
Titel: Antw:[Projektvorstellung] Piduino - Eine Universalplattform mit RaspberryPi und Ardui
Beitrag von: FilliFairy am 01 Januar 2017, 13:32:30
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