Hier geht es um übersichtliches „Smart Home“ mit selbstprogrammierten Mikrocontrollern zur Lichtsteuerung mit Kleinspannung. Die einfachste Lösung, das Stromstoßrelais, wird in Fachkreisen Eltako genannt und kommt auf die Hutschiene im Sicherungskasten. Für den massenhaften Einsatz erschien mir sein Einsatz zu teuer. Außerdem fehlt dieser Lösung die Möglichkeit, als Monoflop zu funktionieren: Wenn man mal wirklich vergessen hat, das Licht auszuschalten, soll es irgendwann auf jeden Fall automatisch aus gehen.
Smart-Home-Systeme auf Basis von LAN und WLAN kranken irgendwann am fehlenden Support für Zertifikatupdates (HTTPS und darauf aufbauendes) sowie Weiterentwicklungen beim WLAN. Da erweist sich eine selbstgestrickte Lösung kurioserweise als langlebiger.
Ein Manko üblicher Stromstoßrelais ist, dass man für viele getrennt schaltbare Lampen auch viele Eltakos benötigt und — noch schlimmer — viele Tasten. Gegen das Tastenchaos werden die Lampen mit nur einer Taste mit kurzen Morsekodes geschaltet. Der Zusatznutzen dabei ist, dass diese Morsekodes auch an einer 433-MHz-Funkfernsteuerung eingegeben werden können. Außerdem bieten Eltakos keine Möglichkeit, die Einschaltdauer zu begrenzen. Wie oft vergisst man, das Licht auszumachen! Zwei Stunden Maximal-Leuchtdauer sind ziemlich unauffällig für eine Außenbeleuchtung.
Außerdem gibt es einen gesonderten Gast-Lichttaster. Seine Funktion unterscheidet sich von den innenliegenden Tastern vor allem darin, dass bei seiner Betätigung die Maximal-Leuchtdauer bei 2 Minuten liegt.
Buchstabe | Kode | 1 (PA5) | 2 (PA4) | 3 (PA3) | 4 (PA2) | 5 (PA1) | 6 (PA0) |
---|---|---|---|---|---|---|---|
Haus | Tor | Platz vorn | Platz hinten | Wald vorn | Wald hinten | ||
Taste 1 (PA6), Timeout: 2 h | |||||||
e | . | 1 | 0 | x | x | x | x |
a | .- | 1 | 0 | 1 | 0 | x | x |
i | .. | 1 | 1 | x | x | x | x |
u | ..- | 1 | 1 | 1 | 1 | x | x |
s | ... | 0 | 1 | x | x | x | x |
v | ...- | 0 | 1 | 0 | 1 | x | x |
t | - | wechselt zwischen „Platz vorn“ und „Platz hinten“ | |||||
Taste 2 (PA7), Timeout: 2 h | |||||||
e | . | x | x | 1 | 1 | 0 | 0 |
a | .- | x | x | 0 | 0 | 1 | 1 |
i | .. | x | x | 1 | 0 | 0 | 0 |
u | ..- | x | x | 0 | 0 | 1 | 0 |
s | ... | x | x | 0 | 1 | 0 | 0 |
v | ...- | x | x | 0 | 0 | 0 | 1 |
t | - | wechselt zwischen „Platz“ und „Wald“ | |||||
Taste 3 (PB2), Timeout: 2 min, für Besucher | |||||||
e | . | 1 | 0 | 1 | x | x | x |
i | .. | 1 | 1 | 1 | x | x | x |
s | ... | 1 | 1 | 0 | x | x | x |
h | .... | 0 | 0 | 0 | 0 | 0 | 0 |
Nochmal so? Beim nächsten Mal würde ich beleuchtete Taster
vorsehen, also dem Mikrocontroller eine kleine Transistorschaltung
vorschalten, wie früher schon einmal.
Ansonsten ist die Morsekodesteuerung genial,
weil sie wenig (eigentlich nur einen) Taster braucht und sich gut mit
Funkfernbedienungen erweitern lässt.
Wenn am Haus Licht leuchtet, soll es auch an der Gartenlaube leuchten. Zur Laube liegt ein bereits voll beschaltetes Drehstromkabel, und es soll keine weitere Leitung eingegraben werden. Dafür bietet es sich zunächst an, eine schaltbare Steckdose für das Gartenlauben-Licht einzusetzen. Nur für den Sender muss man sich 'was neues ausdenken: Dieser soll beim Einschalten den Einschaltkode senden, und wenn die Spannung zusammenbricht noch den Ausschaltkode.
Wenn die schaltbare Steckdose auch noch eine Einschaltzeitbegrenzung realisieren soll, bietet es sich doch an, den Empfänger auch noch selbst zu basteln. Auch wenn an Sender- und Empfänger-Mikrocontroller allergeringste Anforderungen bestehen, die eine Lösung mit PIC12F508 nahelegen, bin ich AVR-Freund genug, um dafür einen ATtiny13 (Empfänger) und einen ATtiny4 (Sender) zu spendieren.
Um halbwegs sicher über die unsichere,
unidirekionale Funkverbindung zu funktionieren,
wiederholt der Sender alle 40 Sekunden den Einschaltbefehl.
Der Ausschaltbefehl kann nicht wiederholt werden,
weil der Sender dann keine Energie mehr hat.
Der Empfänger mit eigener Firmware hingegen schaltet 2 Minuten
nach dem letzten Einschaltkode automatisch ab,
in der Annahme, den Ausschaltbefehl „überhört“ zu haben.
So kann ein gästezugänglicher Lichttaster (mit Batterie) nur
den Einschaltkode liefern und die Beleuchtung arbeitet dann für 2 Minuten.
Vier Sender wurden mittels CY7C68013A + sigrok + PulseView auf den Zahn gefühlt. Dabei lassen sich sowohl ein 4-Tasten-China-Schlüsselanhänger als auch eine Pollin-Fernbedienung mit dem Protokolldekoder RC encode untersuchen. In Klammern habe ich die binären Einzelbits aufgeschrieben. Ein Klingelknopf hält sich jedoch nicht an das Muster und verwendet eine Pulspausenmodulation mit 1 kBit/s und Zeitrahmen-Drittelung. Der Zweibit-Kode ergibt sich aus dem Datenblatt der ursprünglichen Sende- und Empfangschips PT2262 bzw. PT2272, bei dem so ein Ternärkode ausgesendet wurde und durch Beschaltung von 6 Adresspins mit High, Low oder offen ein Adressumfang von 36 = 729 statt 26 = 64 realisiert werden konnte; die Kombination „U“ = 10 tauchte dabei nicht auf. Der Zweibit-Kode hat bei den heute üblichen Mikrocontroller-Implementierungen keine ernsthafte Bedeutung und wird allenfalls durch den sigrok-Protokolldekoder benutzt. Dennoch hält man sich auch in der Mikrocontroller-Ära an den 24-Bit-Rahmen mit dem Sync-Bit.
Alle untersuchten Sender ersparen sich das Senden von Loslasskodes. Es ist bekloppt, dass alle gesichteten Schaltsteckdosen zwei Tasten und Kodes zum Ein- und Ausschalten benötigen! Überall sonst geht es mit nur einer Taste, wie beim Kugelschreiber. Sofern man den Schaltzustand des Verbrauchers sicher erkennt, aber das sollte man bei allen unidirektionalen Funklösungen sowieso.
Taste | Zweibit-Kode | Binärkode (+ Sync) | Hexadezimal | Bemerkung |
---|---|---|---|---|
A on | 00F000FFFF0F | 000001000000010101010001(0) | 040551 | T(bit) = 1,24 ms 0-Bit = 1/4 Puls 1-Bit = 3/4 Puls
|
A off | 00F000FFFFF0 | 000001000000010101010100(0) | 040554 | |
B on | 00F00F0FFF0F | 000001000001000101010001(0) | 041151 | |
B off | 00F00F0FFFF0 | 000001000001000101010100(0) | 041154 | |
C on | 00F00FF0FF0F | 000001000001010001010001(0) | 041451 | |
C off | 00F00FF0FFF0 | 000001000001010001010100(0) | 041454 | |
D on | 00F00FFF0F0F | 000001000001010100010001(0) | 041511 | |
D off | 00F00FFF0FF0 | 000001000001010100010100(0) | 041514 | |
loslassen | 00F00FFFFF11 | 000001000001010101011111(0) | 04155F |
Beim Loslassen werden zudem noch Kodes mit wirren Funktions-Bits gesendet. Da entlädt sich wohl noch ein Kondensator? Vermutlich ignoriert die Steckdose solche Kodes.
Taste | Zweibit-Kode | Binärkode (+ Sync) | Hexadezimal | Bemerkung | R1 | R3 |
---|---|---|---|---|---|---|
1 ein | 0FFF0FFFFFF1 | 000101010001010101010111(0) | 151557 | Tbit = 1,3 ms 0-Bit = 1/4 Puls 1-Bit = 3/4 Puls
| ? | ? |
1 aus | 0FFF0FFFFFF0 | 000101010001010101010100(0) | 151554 | |||
2 ein | 0FFFF0FFFFF1 | 000101010100010101010111(0) | 154557 | 2 kΩ | — | |
2 aus | 0FFFF0FFFFF0 | 000101010100010101010100(0) | 154554 | |||
3 ein | 0FFFFF0FFFF1 | 000101010101000101010111(0) | 155157 | — | — | |
3 aus | 0FFFFF0FFFF0 | 000101010101000101010100(0) | 155154 |
Diese Fernbedienung „EverFlourish EMW202R-1“ (Hornbach) macht keinerlei Unterschied aus Adress- und Datenbits, und es gibt weder DIL-Schalter noch vorprogrammierte Kodes; die Steckdosen werden sich gegenseitig beeinflussen. Ich habe es hier notiert, um mir später einen eigenen Funksender zu machen, der die beiden hier übrig gebliebenen Steckdosen schaltet.
Im Empfänger werkelt ein Mikrocontroller (U1, abgeschliffen; sicherlich) PIC16C508, erkennbar an der typischen Lage der Versorgungsspannungspins. Der Funkempfänger-Chip U2 ist mit CMI2210L beschriftet. Mit der Bestückung der Widerstände R1 und R3 wird die Nummer der Steckdose kodiert: Kein Widerstand kodiert Steckdose Nummer 3, siehe Tabelle.
Der supergenial-superbillig gebaute Kodierschalter legt nahe, dass es sich bei diesem Schalter um das teuerste Bauteil handelt. Davon habe ich den Schaltplan des diskret aufgebauten HF-Verstärkers nachgezeichnet. Hier leider ohne Foto und Typbezeichnung.
Siehe auch:
Taste | Zweibit-Kode | Binärkode (+ Sync) | Hexadezimal | Bemerkung |
---|---|---|---|---|
A | UFFFUFFUU1U0 | 100101011001011010111000(0) | 9596B8 | Tbit = 1,24 ms 0-Bit = 1/4 Puls 1-Bit = 3/4 Puls
|
B | UFFFUFFUU1F0 | 100101011001011010110100(0) | 9596B4 | |
C | UFFFUFFUU10U | 100101011001011010110010(0) | 9596B2 | |
D | UFFFUFFUU10F | 100101011001011010110001(0) | 9596B1 |
Die zugehörige 4-Kanal-Relaiskarte hat eine Lerntaste. Mit dieser lernt diese wahrscheinlich die ersten 20 Bits des Telegramms. Es ist zu vermuten, dass jeder der vier ausgelieferten Schlüssel einen anderen Kode hat. Immerhin ergeben sich 220 = 1 Mi Kodierungen, das macht das damit „gesicherte“ Garagentor schon ziemlich sicher, sofern man den Schlüssel nicht belauscht. Es war keine sinnvolle Kodierung beim Drücken mehrerer Tasten gleichzeitig erkennbar, obwohl das Kodierschema ein Bit pro Taste erkennbar macht.
Wie bei allen Closed-Source-Systemen kann nicht ausgeschlossen werden, dass der zugehörige Funkempfänger neben dem passenden Kode noch auf einen Generalschlüssel hört, den der chinesische Geheimdienst hat.
Ein zweiter Schlüssel hatte als erste Tetrade ebenfalls „1001“, sodass davon ausgegangen werden kann, dass die Relaiskarte nur 16 Bit pro Schlüssel speichert und die ersten 4 Bits stets so erwartet werden, so wie auch die letzte Tetrade einen „Popcount“ von 1 haben muss. Der Kode ist im Schlüssel-Chip einprogrammiert.
Das Kodierschema ist gänzlich anders und arbeitet mit Zeitschlitzen von genau 1 ms. Der Zeitschlitz wird gedrittelt, und kodiert wird:
Firmware für ATtiny13 in C++ mit Inline-Assembler.
Die Firmware läuft nur in Interruptserviceroutinen (ISRs),
die mittels naked
-Attribut ganz ohne Prolog und Epilog laufen.
Da das Hauptprogramm nur sleep
ausführt und die ISRs mit gesperrten
Interrupts sich nie gegenseitig unterbrechen,
kann man auf das Rechenzeit und Flash-Speicher fressende push
und pop
verzichten.
Ohne Interrupts verbleibt der Prozessor im Stromspar-Schlafmodus,
nur der Zeitgeber läuft weiter.
Die CPU-Taktfrequenz wurde auf sparsame 128 kHz festgelegt.
Das (sehr gute) Energiemessgerät von Reichelt zeigt eine Leistungsaufnahme von 0,0 W an. Es ist davon auszugehen, dass diese eher bei 0,1 W liegt. Bei eingeschaltetem Relais zeigt es 0,3 W an. Damit ist dieser Funkempfänger extrem Energie sparend! Der Einsatz des Verarmungs-MOSFETs T1 für das Relais K1 macht's auf einfache Weise möglich. Das hatte ich vor Jahren bei Wikipedia gepostet, aber bisher hat's noch kein chinesesischer Entwicklungsingenieur gelesen.
Beim zweiten Aufbau ins Hutschienengehäuse machte sich ein massiver Reichweitenverlust bemerkbar, verursacht durch eine Nachbestellung von 433-MHz-Sende-Empfangsmodulen, die offenbar bedeutend schlechter und zudem schlechter kalibriert sind. Die Inbetriebnahme gelang nur durch direktes Danebenhalten des Pollin-Funkschaltsteckdosen-Handsenders. Danach konnte ich durch Verstellen des Spulenkernes die Reichweite auf 5 m Luftlinie erhöhen — mehr ging nicht. Um die Lebensdauer des künftig im Dauerbetrieb laufenden Kondensatornetzteils zu erhöhen, wurden hier 2 Kondensatoren 220 nF in Reihe geschaltet und die einhergehende Kapazitätshalbierung durch ein besonders energiesparendes Relais mit nur 8 mA Stromaufnahme kompensiert.
Hier kommt ein ATtiny4..10 zum Einsatz. Um Platz zu sparen und alles in eine Unterputzdose zu bekommen. (Hier bietet sich übrigens auch ein 3D-gedrucktes Gehäuse an.) Den meisten Platz benötigt das Kondensatornetzteil. Dabei wurde nur ein 100-nF-Kondensator eingebaut, der gerade mal 6 mA zu liefern vermag. Die Pfostenleiste der Sendeplatine wurde durch dünnere Stifte ersetzt, um eine höhensparende IC-Fassung zur Kontaktierung verwenden zu können. Der Mikrocontroller im winzigen SOT23-6-Gehäuse sitzt auf einer käuflichen Adapterplatine. Diese wird mit in Bohrlöchern versenkten Schaltkreisfassungskontakten aufgesteckt.
Die Firmware sendet beim Start Einschaltbefehle, sobald am 50-Hz-Eingang ein Pegelwechsel wahrgenommen wird. Diese werden mittels Pulsweitenmodulation am Timer0 per Hardware zeitlich exakt generiert — so genau wie der 128-kHz-Watchdog-Oszillator ist. Danach wiederholt das Programm den Einschaltbefehl alle 40 Sekunden bzw. nach 4000 Pegelwechseln. Bleibt ein Pegelwechsel innerhalb 15 ms aus, werden permanent Ausschaltbefehle gesendet, bis die Stromversorgung durch die Elkos schließlich einbricht.
TODO: Programmierung, Test, Inbetriebnahme
Wie oben geht es darum, mehrere Lampen von mehreren Schaltstellen aus mit berührsicherer Kleinspannung zu steuern. Diesmal für Keller und Garage mit mehreren Durchgangs-Räumen, hervorgerufen durch unzweckmäßige Architektur. Im Unterschied zu oben werden diesmal 5 Relais (2 Garagen, 2 Durchgangszimmer, 1 Außenlicht) und 3 Torsteuerungen (2 Garagentore und 1 Gartentor) angesteuert, und es stehen insgesamt 7 Tasteneingänge zur Verfügung, wobei alle angeschlossenen Tasten (jeweils nach GND) mit LEDs beleuchtet werden können, die vom Mikrocontroller in der Helligkeit beeinflusst werden kann, also Anzeigefunktionen erfüllen können. Die Torsteuerungen arbeiten bidirektional; parallel angeschlossene Tasten (jeweils nach GND) können erkannt werden und bspw. die Garagenbeleuchtung mit aktivieren. Zusätzlich ist der Anschluss eines Funkempfängers vorgesehen. Damit können mit einer 4-Tasten-Fernbedienung alle 3 Tore sowie (per Morsekodes) alle Lampen gesteuert werden; wichtig ist hierbei nur das Außen- und das Garagenlicht. Für den Aufbau wurde diesmal ein größeres Hutschienen-Gehäuse gewählt, in das auch der Netztrafo und alle Relais mit hineinpassen. Auf eine Lokalbedienung wurde dabei vorerst verzichtet.
Zwei Festspannungsregler in Reihe mag nach Verschwendung aussehen. Da aber übliche 78L05 bei Eingangsspannungen über 20 V Probleme haben und eine solche nicht ganz ausgeschlossen werden kann, ist ein Vorregler nicht so schlecht. Die Relaisspulen werden von diesen nun stabilen 12 V betrieben; die Freilaufdioden in IC2 = ULN2003 arbeiten hingegen an der höheren Eingangsspannung. Das macht nichts und sorgt dafür, dass die Relais schneller abfallen.
Die merkwürdige Transistorkombination aus T1 und T3 für die Totsteuerung Tor1 (gleicher Aufbau für Tor2) bewirkt sowohl eine Spannungs- und Stromverstärkung als auch eine Nichtinvertierung. Zudem ist die Spannungsverstärkung gegen GND nicht so groß, dass es über die Diode D7, die für die Abfrage externer parallel geschalteter Tasten gegen GND erforderlich ist, zu Selbsthaltungs- bzw. Thyristoreffekten kommt. Letztlich spart diese Schaltung Mikrocontroller-Pins; mit 2 Pins mehr würde die Spannungs- und Stromverstärkung mit den 2 freien Einheiten des ULN2003 (IC2) funktionieren; die Abfrage externer Taster würde dann die 2 weiteren Pins verbraten. Bei Tor3 ist dieser Aufwand nicht erforderlich, weil bei diesem die Steuerung mit TTL-Pegel erfolgt.
Das nicht sonderlich Energie sparende Netzteil, insbesondere der Trafo mit P0 = 0,7 W, kann am Anschluss X2-1 mit externer Spannung gespeist werden, beispielsweise mit einem ohnehin ständig eingeschalteten Torantrieb. Die Primärseite bleibt dann unangeschlossen. Allerdings spart das nicht wirklich viel, da alle drei Torantriebe auch nicht sonderlich gut sind.
Die Tasten werden diesmal als Aufputzversion mit dem 3D-Drucker erstellt, mit geeigneten Symbolen. Als Tastenkörper dienen solche aus einer alten ausgeschlachteten hochwertigen PC-Tastatur mit Einzeltasten. Von Nutzen ist dabei deren eingebaute, halbwegs brauchbare Parallelführung. Beim Nachbau bieten sich Knackfrösche an, die aber ein anderes haptisches Verhalten zeigen und eine Umkonstruktion der 3D-Druckvorlagen erfordern.
Die etwas sinnlose LED D6 im Innern ist eher als Platzhalter für einen „TTL-RS485“-Hausbus gedacht und deshalb extra an RxD angeschlossen: Serieller Empfang lässt sich schwieriger in Software gießen als serielles Senden.