Im Space Bot
Space-Status Release status: beta [box doku] | |
---|---|
Description | Info/API ob der Raum aktuell geöffnet ist |
Author(s) | thoto |
Last Version | 201411-1 (201609-1) |
Platform | Linux/Nagios/PHP |
Inhaltsverzeichnis
Realisierung seit November 2014
Da aus unten angegebenen Projekten nichts wurde, prüft nun das Serviceding (bis 2017-07-22 das Nagios) via Cron-Job ob der ZyXEL-Switch im /dev/tal eingeschaltet ist (ehemals Portstatus an übergeordnetem Switch via SNMP, seit 2016 via ICMP-Ping) und aktualisiert den Status auf moon.devtal.de
.
Zur Abfrage sollte aktuell die URL https://devtal.de/~thoto/statespace/state.php
verwendet werden. Es wird "closed" oder "open" zurückgeliefert. Sollte sich die API ändern, wird es kurzzeitig etwas anderes liefern.
Alte Ideen aus denen nix geworden ist
(Methode mit einer großen Pilztaste)
Hintergrund & Funktion
Da zur Zeit eine Möglichkeit gesucht wird um auf der Webseite anzuzeigen ob der Space offen ist, wurde das Thema am 06.01.12 besprochen. Wir sind auf die Idee gekommen einen Notaus Knopf zu nutzen, an dem wir 2 Status LEDs befestigen. Diese schliessen wir an einen Arduino + Ethernet Shield an. Der Arduino schickt dann jeweils über das Internet an unseren Server ein "open" oder "closed" Signal. Frage ist noch, ob mit dem Notaus Knopf auch der Strom für den Space abgeschaltet wird.
Hardware
- Arduino UNO
- Ethernet Shield W5100
- Notaus Pilztaste (wie hier => Schon da!)
- 2 LED (rot und grün)
- Widerstände (1x 10k Ohm und 2x 220 Ohm)
- 5V Netzteil
- Kabel
Status
- Hardware habe ich zu Hause schon auf einem Breadboard aufgebaut (Ohne Notaus Knopf, aber mit einem Schalter)
- Code ist fertig
- Daten gehen nicht direkt an den /dev/tal e.V. Server, sondern erst an pachube.com von dort aus per API auf unsere Seite
To Do
- Fotos, Code und Schaltpläne uploaden (Wo ?)
Wen fragen ?
Die Lösung á la solo
Ich habe mich dann mal dem angeschlossen und alles Fertig gemacht, was nur noch angeschaft werden muss ist ein Arduino mit Ethernet Karte. Der Code ist von mir und ich hoffe das er verständlich ist. Es wird kein Drittanbieter genutzt und alle Daten bleiben bei /dev/tal.
Ich werde alle Fertigen scripts hier hinterlegen sobald das richtig plugin instaliert worden ist. Bis dahin ist es hier erhältlich: http://etaoin.tk/~solo/dev-tal.tar.gz
Hier der Source für den Arduino:
/* Benötigte Libs müssen geladen werden */ #include <Ethernet.h> #include <SPI.h> /* MAC Adresse des Netzwerk controlers */ byte mac_adr[] = { 0xAB, 0x13, 0x42, 0x37, 0xDE, 0xAD }; /* Server DNS Name von /dev/tal */ char devtal_server[] = "dev-tal.de"; /* Lokale IP, muss nur benutzt werden, wenn kein DHCP genutzt werden soll. */ byte ip_adr[] = { 192, 168, 1, 55 }; /* Verbindungsfehler */ int verb_fail = 0; /* Der Steckplatz des Button drückers */ const int buttonPin = 1; /* Steckplatz der Status LED */ const int ledPin = 5; EthernetClient client; void setup() { /* Fürs Debuging */ Serial.begin(9600); Serial.println("Begin..."); /* Button eingabe definieren. */ pinMode(buttonPin, INPUT); /* IP Addresse via DHCP beziehen, wenn nicht bricht das Programm ab. Für eine Statische wird der aufruf Ethernet.begin(mac_adr, ip_adr) genutzt.*/ if (Ethernet.begin(mac_adr) == 0) { Serial.println("Konnte keine MAC Adresse beziehen."); for(;;); } delay(1500); } void loop() { for(;;) { if (digitalRead(buttonPin) == HIGH) { Serial.println("rufe Funktion zum aktualiesieren auf."); aktu(); Serial.println("aktualiesiert"); /* Warte 3 Minuten */ delay(300000); } else { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); } } } void aktu() { if (client.connect(devtal_server, 80)) { Serial.println("In Bearbeitung..."); client.println("GET /bin_da/update.php?status=1"); client.println(); } else { Serial.print("Konnte nicht mit dem Server verbinden, stimmen die Server Daten?"); verb_fail++; } if (verb_fail == 3) { Serial.print("Arduino muss neugestartet um evtl. netzwerk probleme zu beseitigen..."); } if (!client.connected()) { Serial.print ("schliesse verbindung"); client.stop(); } }
Hier eine kleine globale config Datei für die "update.php" und "dev-tal.php" damit nur diese eine angepast werden muss: (verbindung_mysql.php)
<?php /* Der Nutzer der MySQL Datenbank */ $mysql_user = "mysql_user"; /* Das Passwort des MySQL Nutzters */ $mysql_passwort = "user_password"; /*Der Host auf dem der MySQL server läuft */ $mysql_host = "mysql_host"; /* Die Datenbank die genutzt werden soll. */ $mysql_db = "mysql_datenbank"; /* Die Tabelle in der Datenbank die genutzt werden soll. */ $mysql_table = "mysql_tabelle"; /* Hier wird die verbindung hergestellt. */ $mysql_id = mysql_connect($mysql_host, $mysql_user, $mysql_passwd) or die("Konnte sich nicht mit dem MySQL Server verbinden"); mysql_select_db($mysql_id, $mysql_db) or die("Konnte die Datenbank nicht auswählen"); ?>
Hier die Datei die auf dem Webserver zum Aktualiesieren genutzt wird:
<?php include 'verbindung_mysql.php'; IF ($_GET['status'] == "1") { $status = mysql_query("SELECT status FROM ".$mysql_tabelle); IF ($status == "1") { mysql_query("UPDATE ".$mysql_tabelle." SET status = 0, stunden = ".date(G).", minuten = ".date(i).";"); } } ?>
Und nun das eigentliche sehr magere was den Nutzter folglich sieht:
<html> <head> <?php /* Seitentitel */ $site_title = "/dev/tal Ich bin da!"; /* Externes Script laden für die Verbindung zum MySQL Server */ include verbindung_mysql.php; /* Abruf der Daten */ $mysql_status = mysql_query("SELECT status FROM ".$mysql_tabelle) or die("Fehler bei dem Aufruf der Datenbank"); $mysql_minuten = mysql_query("SELECT minuten FROM ".$mysql_tabelle); $mysql_stunden = mysql_query("SELECT stunden FROM ".$mysql_tabelle); IF ($mysql_status == "1") { IF(date(G) == $mysql_stunden) { $tmp_min = date(i)-$mysql_minuten; IF($tmp_min =< 5) { $status = "1"; } } else { $tmp_std = date(G)-1 IF($tmp_std == $mysql_stunden) { $tmp_min = date(i) + 60 $tmp_min = date(i) - $mysql_minuten; IF ($tmp_min =< 5) { $status = "1"; } } } ?> <meta http-equiv="content-type" content="text/html;charset=ISO-8859-1" /> <title><?php echo htmlspecialchars($site_title); ?></title> </head> <body> <h1>/dev/tal ICH BIN DA!</h1> <p><?php IF ($status == "1") { echo "Jemand ist im Space"; } else { echo "Keiner ist im Space"; } ?> </P> </body> </html>
Einen Pilzförmiger Button muss nicht mehr besorgt werden ich bringe einen mit.
Weitere Möglichkeiten
- Tür-Sensorik
- kapazitive Messung mittels zweier dünner Metallplättchen
- induktive Messung mittels flacher Spulen
- Multi-Faktor-Messung
- Aktive Hosts
- Änderung des Stromverbrauches
- Licht
- Wärme/Luftfeuchtigkeit
- ...
Wen fragen ?