Montag, 28. März 2016

Smarthome Entwicklung

Die Anfangs-Idee war es, ein Smarthome zu entwickeln, welches via Webinterface erreichbar ist. Dieses Webinterface sollte auf einem Arduino Mega + Ethernet Shield liegen sollte. Folgende Features sollte es besitzen:
- Messung von Temperatur, Luftfeuchte, Helligkeit, Bodenfeuchte von Zimmerpflanzen
- Steuerung eines anderen Arduinos mit angeschlossenem TLC59711 zur Steuerung von LED-Strips
- Steuerung von eines Warmweißen LED-Strips zur Schreibtischbeleuchtung
- Steuerung von 3 Funksteckdosen (433 MHz Funktechnologie)
- Steuerung einer RGB LED Lampe via 433 MHz Funktechnologie

In meinem Übermut fing ich an, die Weboberfläche inklusive Arduino-Sketch zu entwickeln/ anzupassen, auf Basis des folgenden Projektes: Self catering Guesthouse





























Oben: Der Aufbau, Arduino, Ethernet, Sensorik, 433 MHz Sender/ Empfänger
Unten: Die Website, abgewandelt von dem oben genannten Projekt, gehostet auf dem Arduino Ethernet Shield

Das Problem was ich nach einiger Zeit feststellte: Websites auf der Arduino SD-Karte lassen sich echt unangenahm entwickeln. Schritte dazu sind: Arduino aus machen, SD-Karte raus, in PC rein, bearbeiten, speichern, wieder in den Arduino reinfummeln, Arduino starten, Browser refreshen.

Somit ist bei der Behebung kleiner Fehler schon ein hoher mechanischer Aufwand nötig, um die Website zu bearbeiten. Des weiteren ist der Arduino eher weniger geeignet, um darauf Websites zu hosten, da er diese ziemlich langsam an den Client übermittelt und Befehle sehr langsam ausführt.

Das Projekt habe ich somit aus Faulheit erst einmal ruhen gelassen. (Stand Anfang Januar 2016)





Jetzt aber (Ende März 2016) habe ich mir diese ganze Sache erneut Vorgenommen. Ich hatte eh noch einen Raspberry Pi hier liegen, somit wollte ich diesen nutzen. Somit schnell Raspbian installiert das läuft nun. Folgende Schritte habe ich dann durchgeführt:

1. Sensorik habe ich mit Thingspeak.com verbunden, mit Hilfe der Anleitung hier.
2. Webserver installiert und erste HTML-Datei getestet. (apatche2 und php5)


Update 27.03.2016:

Problem: Kann man von einem Ubuntu Laptop mithilfe von Nautilus auf das root-Verzeichnis   zugreifen. Wenn mans weiß, ganz einfach: einfach mit dem Raspi verbinden (ssh://IP.zum.Ras.PI),   ALT+UP drücken, in der oberen Zeile auf die Verbindung klicken (Anleitung hier). Nun muss man allerdings noch die Rechte so vergeben, dass Dateien im Ordner /var/www/html gelesen und geschrieben werden dürfen (hier).
Jetzt kann ich eine Website via Nautilus in den Ordner einfügen und bearbeiten. In dem Projekt möchte ich meine bereits erstellte Website (Bild oben) nutzen. Jedoch kann ich nicht die Daten der Sensoren via JavaScript/ XML wie beim Arduino direkt am Pin abrufen. Jedoch sende ich ja schon Daten an Thingspeak. Da ich nur die Aktuellen Daten in der Weboberfläche mittels der analogen Anzeigen darstellen möchte, kann ich mir die Daten mit einem PHP-Befehl abrufen lassen. Thingspeak speichert die aktuellsten Daten in der Datei 

https://api.thingspeak.com/channels/CHANNEL_ID/fields/FIELD_ID/last.txt 

ab. Mithilfe des PHP-Befehls

<?php echo file_get_contents("https://api.thingspeak.com/channels/CHANNEL_ID/fields/FIELD_ID/.txt");?>

abrufen und in die Anzeigen einfügen.


Update 29.03.2016, 00.30 Uhr:

Die Toggle-Switches sind mir vorab etwas unsympathisch, somit habe ich die Seite so umgeschrieben, dass es zwei Knöpfe pro GPIO gibt, einen für ein, einen für aus. Nach ein paar Hindernissen und Facepalm-Momenten aufgrund unsauberer Internetrecherchen/ Blogs, die diese Funktion erklären. Jetzt arbeite ich nach dem Raspberry Pi Guide, und alles funktioniert. Dann den Befehl /usr/bin/gpio export [GPIO-Nr.] out in die Datei /etc/rc.local einfügen.

Update 01.04.2016

Mithilfe des Chips MCP3008 kann ich auch analoge werte loggen und in thingspeak eintragen.
Als Anleitung habe ich die hier genommen.

Update 02.05.2016

So langsam möchte ich die 433MHz - Verbindung zu dem Arduino mit dem TLC59711 - Dimmer für die LED-Strips verbinden. Vorab werde ich mich aber noch mit der 433MHz  und besonders der TLC59711 Arduino-Library auseinandersetzen müssen. Ebenfalls den Einbau ins Webinterface vom RasPi muss ich mir noch angucken.

Update 09.04.2016

Eigentlich ganz einfach mit diesem TLC ,wenn mans nur weiß. Einen Wert setzen, der die Farben des LED-Strips bezeichnet, if-Abfrage und dann senden der Dimmwerte an den TLC. Zu beachten ist, das der höchste Wert (65535) dem kleinsten Dimmer-Wert (-> Aus) und umgekehrt entspricht. Z.B.:

#include "Adafruit_TLC59711.h"
#include <SPI.h>

// How many boards do you have chained?
#define NUM_TLC59711 1

#define data   11
#define clock  13
int i=1;

Adafruit_TLC59711 tlc = Adafruit_TLC59711(NUM_TLC59711, clock, data);

void setup() {
  Serial.begin(9600);
  
  Serial.println("TLC59711 test");
  pinMode(10, OUTPUT);
  tlc.begin();
}

void loop() {

  if (i=1) {
      tlc.setLED(3, 0, 000, 38000);//Rot 100%, Grün 100%, Blau ~42%
      tlc.setLED(2, 0, 000, 38000);
      tlc.setLED(0, 0, 000, 38000);
      tlc.setLED(1, 0, 000, 38000);
      tlc.write();
      delay(50000);
  }
 }

Hier mal ein Bild der Platine:


Update 18.05.2016

Heute habe ich mal mit der Loxone Smarthome-App rumgespielt, und gemerkt, das bei meiner Website noch einiges fehlt. Z.B. Tabs mit den verschiedenen Kategorien von Sensordaten und einer Wettervorhersage. Folglich die Tabs von hier eingebunden: tympanus.net und etwas auf meine Bedürfnisse angepasst. Zur Wettervorhersage nutze ich das Wetter-Widget von WetterOnline.

Update 15.06.2016

Vor kurzem habe ich die Wetter-Seite meteoblue.com entdeckt und gesehen das die ein ganz nettes, modernes Widget haben. Heute habe ich somit mal das WetterOnline-Widget rausgeworfen  und das Widget von Meteoblue eingebunden - sieht garnicht mal verkehrt aus.

Update 13.07.2016

Den ganzen Tag damit verbracht, den 433MHZ-Kram aufzubauen. Erst so versucht, aber ich war etwas unfähig die Befehle übers Webinterface zu geben. Dann so versucht, aber leider konnte ich nicht das Design des Webinterfaces verändern. Im Endeffekt habe ich die zweite Methode genommen und das Webinterface von hier nachgebaut, und - tadaaa! Es funktionierte! Man muss den <form> - Befehl nehmen, und den dann auch noch richtig anwenden, nicht den <button> - Befehl!

Update 26.07.2016

Leider ist mir aufgefallen, das ich mit der genannten Methode nur 5-stellige Binärzahlen senden konnte. Also doch den ersten Versuch wieder aufgerollt, die Rechte mit 

sudo chown www-data:www-data /var/www
sudo chmod 775 /var/www
sudo usermod -a -G www-data pi


angepasst und in der Datei /etc/sudoers mit

sudo visudo

die Zeile

www-data ALL=(ALL) NOPASSWD: ALL

eingetragen. Jetzt kann ich mit dem Befehl 

sudo /home/pi/433Utils/RPi_utils/./codesend 1234

beliebige Codes senden.


Update 06.01.2017


Ein bisschen hat sich in den letzten Monaten getan. Zu erst habe ich die Lochrasterplatine für den Raspberry Pi gelötet. Nachdem ich nicht fähig dazu war die Codes der Fernbedienung für die Steckdosen auszulesen, habe ich eine Möglichkeit entworfen, die Fernbedienung über einen Atmega328 zu steuern. Der RasPi übermittelt mithilfe der 433Mhz-Bibliothek ein digitales Signal an den Atmega, der diese ausließt und den verschiedenen Ausgabe-Pins zuordnet. Die Ausgabe-Pins steuern einen Transistor, welcher die Kontakte der Knöpfe der Fernbedieung verbindet.
Zudem steuert der Atmega auch die Relais für die LED-Strips. Der RasPi gibt ein Analoges Signal auf einen der Analog-Pins des Atmega und dieser "toggelt" die Ausgabe-Pins (mit u.A. diesem Code) für die Relais. 
In der nächsten Woche soll noch auf die Lochrasterplatine eine RJ45-Buchse kommen, damit Buttons für Licht, Steckdosen und Fernsteuerung des Computers in verschiedenen Positionen des Raums angebracht werden können.


Update 30.04.2017


Ich habe noch ein Stück LED-Strip hinter das Bett gemacht - gesteuert über einen Pin des Raspi, ohne die Einbindung des Atmega





PS: Ich denke derzeit über ein Bussystem für Sensoren und Aktoren nach. Aktoren sollen über das Protokoll der WS2812-LEDs angesteuert werden, Sensoren sollen eine einstellbare Adresse bekommen und sich via Serieller Kommunikation zurückmelden..