UP-Bewegungsmelder in Eigenbau
- Details
- Geschrieben von Alexander Schulz
- Kategorie: MySensors
- Zugriffe: 138174
Meine Tests mit MySensors-Technik liefen sehr gut. Daher habe ich beschlossen, dieses System produktiv einzusetzen. Ein Bewegunsmelder darf den Anfang machen. Um diesen möglichst unauffällig zu installieren, habe ich beschlossen, ihn in eine UP Dose einzubauen. Da an der in Frage kommenden Stelle schon ein Kabel für OneWire-Bus lag, sollte damit die Stromversorgung gewährleistet werden.
Das Gnaze besteht hauptsächlich aus einem Arduino, einem Funk-Transmitter, einem (fertigen) Bewegunsmelder, einem Lichtsensor und einer Duo-LED (rot/grün). Das Grät kann somit Bewegung erfassen, Lichtintensität liefern und Statusrückmeldungen mit der rot-grüner LED anzeigen.
An der Firmware muss ich noch etwas feilen, aber grundsätzlich funktioniert alles im Prinzip schon jetzt.
Das Schema:
Der Aufbau:
... und das Endergebnis:
MySensors
- Details
- Geschrieben von Alexander Schulz
- Kategorie: MySensors
- Zugriffe: 29789
Im dem FHEM-Forum (http://forum.fhem.de/) habe ich einen Verweis auf ein weiteres Eigenbau-System gefunden: www.mysensors.org
Auf den ersten (und auch den zweiten) Blick erschien mir das System als gut zu meinen Vorstellungen kompatibel. Es wird aus fertigen, recht günstigen und gut verfügbaren Komponenten aufgebaut. Es existiert ein gut beschriebenes und gepflegtes Software-Architektur mit vielen Beispielen und für alle gängigen Sensoren-Arten. Ein (englischsprachiges) Forum ist aktuell und gut frequentiert.
Auch die FHEM-Anbiendung ist dank Modulen von Norbert Truchsess (https://github.com/ntruchsess) mittlerweile kein Problem mehr.
Nach einigen Tests läuft in meinem haus der erste Sensor (ein Bewegungsmelder mit Lichtmessung) seit ein paar Tagen produktiv. Bis jetzt problemlos. :)
Mein erster Aufbau sah mal so aus:
(das Ziel was ein möglichst komplexes Sensor-Device aufzubauen ;) )
Audiohardware
- Details
- Geschrieben von Alexander Schulz
- Kategorie: Eigenbau
- Zugriffe: 25704
Damit der Automationserver sich auch akustisch melden kann, habe ich einen kleinen Wandlautsprecher in die UP-Dose installiert.
Die Verstärkerplatine habe ich einem Spielzeug entnommen. Es war so eine Art Lautsprecher zum Anschluss an Handy oder MP3-Player. Der Lautsprecher selbst war grottig, aber die Platine für meine Zwecke durchaus brauchbar.
Die Platine kam in ein Hutschienengehäuse...
... und dann in den Verteiler.
Ein wenig Probleme machte die Stromversorgung. Nur mit einem separaten Netzteil war die Ausgabe störungsfrei, ansonsten entstand durch die Grundschleife ein lautes Brummen.
Eine bessere Lösung, als ein eigenes Netztteil, ist eine galvanische Trennung des Eingangsignals. Die Trafos habe ich aus einem "KFZ NF-Filter" genommen, den ich bei eBay für ein paar Euros erworben habe.
Da sind sie
Update 22.11.2014:
Endlich hatte ich Zeit, die Trenntrafos einzubauen.
FHEM spricht Jabber
- Details
- Geschrieben von Alexander Schulz
- Kategorie: FHEM
- Zugriffe: 40644
Mit Hilfe von Jabber-Modul für FHEM kann man nicht nur von FHEM Nachrichten auf sein Handy senden lassen, sondern auch die Gegenrichtung benutzen, um Befehle und Anweisungen an den Server zu schicken.
So habe ich das realisiert...
Zunächst die Definitionen im fhem.cfg (es werden zwei Accounts auf jabber.de benötigt: <fhem_user> und <my_user>):
# Definition Jabber-Account fuer FHEM
define jabber Jabber jabber.de 5222 <fhem_user> <passwort> 1 0 attr jabber OnlineStatus available attr jabber PollTimer 2
# Nachrichten nur von einem bestimmten Account akzeptieren attr jabber RecvWhitelist <my_user>@jabber.de
# Account-Nickname attr jabber ResourceName FHEM
# Eine Methode beim Nachrichtenempfang aufrufen define Jabber_Notify notify jabber:Message.* {sendJabberAnswer();;}
# Taegliche Statusmeldung verschicken define jabberstatus at *05:10:00 {sendMeStatusMsg();;}
Und dann die Perl-Funktionen (irgendwo in inem Modul, z.B. in 99_myUtils.pm):
###################################################### # Meldung per Jabber senden ###################################################### sub sendJabberMessage($$) { my($rcp, $msg) = @_; fhem("set jabber msg $rcp $msg"); }
###################################################### # Meldung an mich per Jabber senden ###################################################### sub sendMeJabberMessage($) { my($msg) = @_; sendJabberMessage('<my_user>@jabber.de', $msg); }
###################################################### # Statusdaten an mein Handy per Jabber senden ###################################################### sub sendMeStatusMsg() {
# Hier ist der Text fuer die Statusmeldung. Z.B. Werte von Sensoren. my $msg = "Status: Umwelt"; $msg=$msg."\n Vorgarten: "; $msg=$msg."T: ".ReadingsVal("Sensor1", "temperature", "---")." C"; $msg=$msg."\n Garten: "; $msg=$msg."T: ".ReadingsVal("Sensor2", "temperature", "---")." C,"; $msg=$msg." H: ".ReadingsVal("Sensor2", "humidity", "---")." %,"; $msg=$msg." Bat: ".ReadingsVal("Sensor2", "battery", "---")." V"; sendMeJabberMessage($msg); }
###################################################### # Kleines Jabber-Cmd-Interface ###################################################### sub sendJabberAnswer() { my $lastsender=ReadingsVal("jabber","LastSenderJID","0"); my $lastmsg=ReadingsVal("jabber","LastMessage","0"); my @cmd_list = split(/\s+/, trim($lastmsg)); my $cmd = lc($cmd_list[0]); # erstes Element entfernen shift(@cmd_list); my $newmsg;
# Hier den Status ausgeben: Z.B. Anwesenheit, Fenster, Telefonanrufe, Tuerklingel oder Briefkasten... if($cmd eq "status") { $newmsg.= "Status: (noch) nicht implementiert"; }
# Ausssentemperatur etc. melden if($cmd eq "umwelt") { $newmsg.= "Umwelt"; $newmsg.="\n Vorgarten: "; $newmsg.="T: ".ReadingsVal("Sensor3", "temperature", "---")." C, "; $newmsg.="B: ".ReadingsVal("Sensor3", "brightness", "---").", "; $newmsg.="Bat: ".ReadingsVal("Sensor3", "battery", "---")." "; $newmsg.="\n Garten: "; $newmsg.="T: ".ReadingsVal("Sensor2", "temperature", "---")." C,"; $newmsg.=" H: ".ReadingsVal("Sensor2", "humidity", "---")." %,"; $newmsg.=" Bat: ".ReadingsVal("Sensor2", "battery", "---")." V"; }
# Systemueberwachung durch SYSMON if($cmd eq "system") { $newmsg.= "CPU Temp: ".ReadingsVal("sysmon", "cpu_temp_avg", "---")." C\n"; $newmsg.= "loadavg: ".ReadingsVal("sysmon", "loadavg", "---")."\n"; $newmsg.= "Auslastung: ".ReadingsVal("sysmon", "stat_cpu_text", "---")."\n"; $newmsg.= "RAM: ".ReadingsVal("sysmon", "ram", "---")."\n"; $newmsg.= "Uptime: ".ReadingsVal("sysmon", "uptime_text", "---")."\n"; $newmsg.= "Idle: ".ReadingsVal("sysmon", "idletime_text", "---")."\n"; $newmsg.= "FHEM uptime: ".ReadingsVal("sysmon", "fhemuptime_text", "---")."\n"; $newmsg.= "FS Root: ".ReadingsVal("sysmon", "fs_root", "---")."\n"; $newmsg.= "FS USB: ".ReadingsVal("sysmon", "fs_usb1", "---")."\n"; $newmsg.= "Updates: ".ReadingsVal("sysmon", "sys_updates", "---")."\n"; } # ggf. weitere Befehle
# kleine Hilfe zu den verfuegbaren Anweisungen if($cmd eq "help" || $cmd eq "hilfe" || $cmd eq "?") { $newmsg.= "Befehle: Help (Hilfe), Status, System, Umwelt"; }
# FHEM-Anweisungen ausfuehren (als ob diese auf der Console eingegben wurden) if($cmd eq "fhem") { my $cmd_tail = join(" ",@cmd_list); $newmsg.=fhem($cmd_tail); }
# Perl-Befehle ausfuehren if($cmd eq "perl") { my $cmd_tail = join(" ",@cmd_list); $newmsg.=eval($cmd_tail); }
# Sprachmeldung ausgeben (ueber TTS Modul)
if($cmd eq "say" || $cmd eq "sprich") {
my $cmd_tail = join(" ",@cmd_list);
speak($cmd_tail,0);
$newmsg.="ok";
} if(defined($newmsg)) { fhem("set jabber msg ". $lastsender . " ".$newmsg); } else { fhem("set jabber msg ". $lastsender . " Unbekanter Befehl: ".$lastmsg); } }
Was das ganze tut:
- Jeden Morgen mir die Wetterdaten von 2 meiner Sensoren senden
- Mehrere Befehle per Jabber-Chat akzeptieren und beantworten:
-- System: ausgewählte System Informationen
-- Umwelt: Wetterdaten
-- perl <perl_cmd>: Perl-Befehle ausführen
-- fhem <fhem_cmd>: FHEM-Commandos ausführen.
-- Sprachmeldungen ausgeben
Und es gibt noch jede Menge Platz für Erweiterungen ;)
Akku für den Cubietruck
- Details
- Geschrieben von Alexander Schulz
- Kategorie: Cubietruck
- Zugriffe: 35852
Eine weitere nützliche Feature des Cubietrucks ist die Möglichkeit, einen Akku anzuschliessen. Damit kann man bei einem Stromausfall eine gewisse Zeit überbrücken und ggf. das System sauber herunterzufahren (und bei Bedarf vorher auch bestimmte Aktionen auszuführen). Aber auch bei einer oder anderen Bastelaktion erweist sich oft als sehr praktisch, den Strom mal kurz unterbrechen zu können, ohne vorher alles herunterfahren zu müssen.
Die Installation ist recht einfach. Es wird ein LiPo oder LiIon Akku benötigt, je größer desto besser ;) (Ich habe einen mit 3250 mAh genommen. Damit läuft mein System über 2 Stunden autark, incl. 2,5 Zoll Festplatte.) An den AKku muss ein Kabel mit einem passendem Stecker angelötet werden (gibts günstig "in der Bucht"). Das ganze wird an den Cubietruck angeschlossen (Wichtig: vorher herunterfahren und von der Stromversorgung trennen!).
Vor dem Anschliessen ist es sinnvoll, dem Board die tatsächliche Akkukapazität mitzuteilen. Diese Einstellung sthet dem System in der Datei /sys/class/power_supply/battery/energy_full_design
zur Verfügung. Man kann sie dort jedoch nicht direkt eintragen, sie wird beim Booten durch /boot/script.bin definiert. Die Datei muss nicht genau so heißen, den genauen Namen erfährt man aus /boot/uEnv.ct (kann je nach eingesetzten Betriebsystem(version) etwas anders sein). Der zuständige Eintrag kann z.B. so aussehen: script=/boot/ct-hdmi.bin
. Die Schript-Datei ist jedoch binär. Damit sie bearbeitet werden kann, muss sie vorher mittels bin2fex-Utility in lesbare Form umgesetzt werden und nach der Bearbeitung auch wieder zurück (bin2fex -> script.fex -> edit -> fex2bin -> script.bin). Der anzupassender Parameter heißt pmu_battery_cap
. Die Angaben haben in mAh zu erfolgen.
Folgende Graphik zeigt ca. 1,5 Stunden Laufzeit des Boards auf dem Akku (von 100 auf ca. 40 %) mit anschliessendem Wiederaufladen.
Wenn die Stromunterbrechung zu lange dauern sollte, ist es sinnvoll das System herunterzufahren, bevor der Akku leer wird. Dafür benutze ich folgendes Script (check_usv.sh):
#!/bin/sh
BATPRESENT=`cat /sys/class/power_supply/battery/present`
BATLEVEL=`cat /sys/class/power_supply/battery/capacity`
BATONLINE=`cat /sys/class/power_supply/battery/online`
DATE=`date +"%F_%R"`
if [ $BATPRESENT -eq 0 ]
then
# Batterie nicht vorhanden
exit
fi
if [ $BATONLINE -eq 0 ]
then
# Batterie wird nicht entladen
exit
fi
if [ $BATONLINE -eq 1 ] && [ $BATLEVEL -le 30 ]
then
echo -e "$DATE: Batterieladezustand niedrig: $BATLEVEL" >> /var/log/battery.log
echo -e "$DATE: Cubietruck wird heruntergefahren" >> /var/log/battery.log
halt
exit
fi
Das Script wird per Cront alle 5 Minuten ausgeführt. Dafür ist ein Eintrag am Ende der Crontab (crontab -e
) einzufügen: */5 * * * * sudo /home//check_usv.sh
. Die Script-Datei kann irgendwo liegen, der Pfad in der Crontab muss natürlich stimmen.
WARNUNG: Die Lithium-Akkus (vor allem LiPos) können gefährlich sein und im ungünstigsten Fall sogar Feuer fangen. Betreiben Sie diese nicht in der nähe von brenbaren Materialien und kontrollieren Sie diese von Zeit zu Zeit. Aufgeblähte Akkus müssen sofort vom Strom getrennt und fachgerecht entsorgt werden!
(Direkt auf dem Holzbrett lag mein Akku nur für die Photos. Ansonsten steckt dieser in einer Blechbox).
Seite 4 von 14