Projekt:door-status: Unterschied zwischen den Versionen
ChrisC (Diskussion | Beiträge) (MQTT Doku hinzugefügt) |
ChrisC (Diskussion | Beiträge) (Technische Spezifikation des Türsensors aktualisiert) |
||
(7 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 2: | Zeile 2: | ||
| maintainer = [[User:ChrisC|ChrisC]] | | maintainer = [[User:ChrisC|ChrisC]] | ||
| machine = [[Host:tuerstatus.intern.k4cg.org|tuerstatus.intern.k4cg.org]] | | machine = [[Host:tuerstatus.intern.k4cg.org|tuerstatus.intern.k4cg.org]] | ||
| jahr = 2017 | | jahr = 2017-2019 | ||
| url = https://github.com/k4cg/door-status | | url = https://github.com/k4cg/door-status | ||
}} | }} | ||
Zeile 9: | Zeile 9: | ||
=Hardware= | =Hardware= | ||
<gallery> | |||
File:door-status-hw.jpg|Hardware-Prototyp vom Türsensor | |||
File:door-status-schalter.jpg|Hardware-Prototyp vom Türschalter im K4 | |||
File:door-status-v2.jpg|Neue Hardware in der Peuntgasse 5 | |||
File:door-status-schalter-v2.jpg|Neuer Türschalter in der Peuntgasse 5 | |||
</gallery> | |||
Hardware-Prototyp (2017): Das ESP8266-Board in der Mitte wird über ein Kabel von unten mit 5V versorgt, ein kreativ verlöteter Regler auf der Rückseite der Platine (LM1117) wandelt die Spannung auf die benötigten 3.3 Volt. Der Türsensor (Schalter) ist über die drei Kabel von rechts angeschlossen. Der Schalter ist ein Umschalter, von dem nur zwei Kontakte als Schließer verwendet werden. Wird der Schalter durch den eingeführten Türriegel geschlossen, verbindet dieser den IO Pin mit Masse und zieht hierdurch den internen Pullup auf Masse, sodass ein Low-Pegel im "zu"-Zustand zu messen ist und High-Pegel im "offen"-Zustand. Die im Bild rechts gekennzeichneten Pins (Pin-Header, RM2.54mm) können mit einem USB-UART-Kabel verwendet werden, um eine Verbindung zur lokalen Shell (115200 Baud, 8N1) herzustellen, beispielsweise wenn das ESP keine automatische Verbindung mehr zum WLAN aufbauen sollte. | |||
Neue Hardware (12/2017): Neu gestaltetes PCB (siehe Repo), mit eingestecktem BME280. Der Taster ist nun gegen Masse geschaltet, auf dem PCB ist ein Pullup auf VCC installiert. Beim Drücken des Tasters wird die Spannung auf Masse heruntergezogen | |||
Hardware-Fix (03/2019): GPIO0 und GPIO2 mit >1k Pullup auf 3V3 versehen, damit definierter Pegel beim Booten. Dessen Fehlen könnte zu den gelegentlichen Hängern des ESP in der Vergangenheit geführt haben. | |||
Pinbelegung: | Pinbelegung: | ||
Zeile 20: | Zeile 26: | ||
! Pin !! Verwendung | ! Pin !! Verwendung | ||
|- | |- | ||
| | | GPIO0 || Spannungsversorgung 3.3V (an: low, aus: high), Pullup 10k auf 3V3 | ||
|- | |- | ||
| | | GPIO2 || Spannungsversorgung 5V (an: high, aus: low), Pullup 10k auf 3V3 | ||
|- | |- | ||
| | | GPIO4 || I2C SDA für BME280 | ||
|- | |- | ||
| | | GPIO5 || I2C SCL für BME280 | ||
|- | |||
| GPIO12 || Schalterkontakt | |||
|- | |- | ||
| GPIO16 || Verbindung zum Reset-Pin für deepsleep | | GPIO16 || Verbindung zum Reset-Pin für deepsleep | ||
Zeile 33: | Zeile 41: | ||
=Software= | =Software= | ||
Beim Booten stellt der ESP eine Verbindung zum WLAN "k4cg- | Beim Booten stellt der ESP eine Verbindung zum WLAN "k4cg-devices" (hidden SSID) her, synchronisiert die Zeit per NTP, fragt den Türsensor sowie den BME280 ab und überträgt die Resultate an den MQTT Server 192.168.178.20, danach geht das System für 5 Minuten in den Schlafmodus. Format: | ||
Jeder Datensatz-Wert im MQTT ist ein json-Dictionary und enthält mindestens die Schlüssel: | |||
* "_datestr", Format: YYYY-MM-DDTHH:MM:SS.000000 | |||
* "_timestamp", Float, Unix-Time (Sekunden seit 1.1.1970, 00:00:00) | |||
* "value", String mit Wert | |||
MQTT Topics: | |||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
! | ! Topic !! Value im json-Dictionary | ||
|- | |- | ||
| door || "open" oder "closed" | | sensors/door/default/status || "open" oder "closed" | ||
|- | |- | ||
| humidity || | | sensors/door/default/bme280/humidity || Luftfeuchtigkeit als Float (0..100) | ||
|- | |- | ||
| | | sensors/door/default/bme280/temperature || Temperatur als Float | ||
|- | |- | ||
| | | sensors/door/default/bme280/pressure || Luftdruck als Float in hPa | ||
|} | |} | ||
Zeile 56: | Zeile 71: | ||
| iot.eclipse.org || k4cg/door/status || JSON (s.o.) | | iot.eclipse.org || k4cg/door/status || JSON (s.o.) | ||
|- | |- | ||
| heimat || sensors/door/status || YYYY-MM-DDTHH:MM:SS.000000 (open|closed) | | heimat || sensors/door/default/status || YYYY-MM-DDTHH:MM:SS.000000 (open|closed) | ||
|- | |- | ||
| || sensors/door/ | | || sensors/door/default/bme280/temperature || YYYY-MM-DDTHH:MM:SS.000000 FLOAT | ||
|- | |- | ||
| || sensors/door/humidity || | | || sensors/door/default/bme280/humidity || YYYY-MM-DDTHH:MM:SS.000000 FLOAT | ||
|- | |||
| || sensors/door/default/bme280/pressure || YYYY-MM-DDTHH:MM:SS.000000 FLOAT | |||
|} | |} | ||
Hinweis: Der führende "/" wird gemäß gängiger Empfehlungen weggelassen. Dies macht bei MQTT einen Unterschied, da "/" eine zusätzliche Top-Level-Ebene mit der ID "" (leerer String) einführt. Da dies unsinnig ist, wird der führende "/" weggelassen. | Hinweis: Der führende "/" wird gemäß gängiger Empfehlungen weggelassen. Dies macht bei MQTT einen Unterschied, da "/" eine zusätzliche Top-Level-Ebene mit der ID "" (leerer String) einführt. Da dies unsinnig ist, wird der führende "/" weggelassen. | ||
Beispiel-Datensatz: | |||
sensors/door/default/bme280/pressure {"_datestr": "2019-03-09T21:57:18.000000", "value": "977.96", "_timestamp": 1552168639} | |||
sensors/door/default/status {"_datestr": "2019-03-09T21:57:18.000000", "value": "open", "_timestamp": 1552168639} | |||
sensors/door/default/bme280/temperature {"_datestr": "2019-03-09T21:57:18.000000", "value": "21.49", "_timestamp": 1552168639} | |||
sensors/door/default/bme280/humidity {"_datestr": "2019-03-09T21:57:18.000000", "value": "36.68", "_timestamp": 1552168639} | |||
=Software-Aktualisierung= | =Software-Aktualisierung= | ||
Zeile 70: | Zeile 94: | ||
Vorgehen beim Verbinden (mit mpfshell, installieren über pip/pip3): | Vorgehen beim Verbinden (mit mpfshell, installieren über pip/pip3): | ||
(Hinweis: zuerst muss des Watchdog Timer möglichst schnell deaktiviert werden, bevor das System dann neustartet und die WLAN-Verbindung abreißt) | |||
# mpfshell -c "open ws:192.168.178.9,PASSWORD" | # mpfshell -c "open ws:192.168.178.9,PASSWORD" | ||
mpfs [/]> repl | |||
>>> tim.deinit() | |||
Strg+] | |||
mpfs [/]> put boot.py | mpfs [/]> put boot.py | ||
mpfs [/]> put service.py | mpfs [/]> put service.py | ||
... | ... | ||
mpfs [/]> repl | mpfs [/]> repl | ||
>>> reboot() | >>> util.reboot() |
Aktuelle Version vom 9. März 2019, 23:00 Uhr
Projekt:door-status | |
Betreuer*In | ChrisC |
Jahr | 2017-2019 |
Läuft auf | tuerstatus.intern.k4cg.org |
URL | https://github.com/k4cg/door-status |
Mit diesem Sensor wird überwacht, ob die innere Tür im k4cg abgeschlossen ist oder nicht - ein sicheres Indiz, ob das k4cg offen oder zu ist. Zudem gibt es noch einen Temperatur-/Feuchtesensor, damit das Device sich nicht ganz so sehr beim Abfragen eines Tasters langweilt.
Hardware
Hardware-Prototyp (2017): Das ESP8266-Board in der Mitte wird über ein Kabel von unten mit 5V versorgt, ein kreativ verlöteter Regler auf der Rückseite der Platine (LM1117) wandelt die Spannung auf die benötigten 3.3 Volt. Der Türsensor (Schalter) ist über die drei Kabel von rechts angeschlossen. Der Schalter ist ein Umschalter, von dem nur zwei Kontakte als Schließer verwendet werden. Wird der Schalter durch den eingeführten Türriegel geschlossen, verbindet dieser den IO Pin mit Masse und zieht hierdurch den internen Pullup auf Masse, sodass ein Low-Pegel im "zu"-Zustand zu messen ist und High-Pegel im "offen"-Zustand. Die im Bild rechts gekennzeichneten Pins (Pin-Header, RM2.54mm) können mit einem USB-UART-Kabel verwendet werden, um eine Verbindung zur lokalen Shell (115200 Baud, 8N1) herzustellen, beispielsweise wenn das ESP keine automatische Verbindung mehr zum WLAN aufbauen sollte.
Neue Hardware (12/2017): Neu gestaltetes PCB (siehe Repo), mit eingestecktem BME280. Der Taster ist nun gegen Masse geschaltet, auf dem PCB ist ein Pullup auf VCC installiert. Beim Drücken des Tasters wird die Spannung auf Masse heruntergezogen
Hardware-Fix (03/2019): GPIO0 und GPIO2 mit >1k Pullup auf 3V3 versehen, damit definierter Pegel beim Booten. Dessen Fehlen könnte zu den gelegentlichen Hängern des ESP in der Vergangenheit geführt haben.
Pinbelegung:
Pin | Verwendung |
---|---|
GPIO0 | Spannungsversorgung 3.3V (an: low, aus: high), Pullup 10k auf 3V3 |
GPIO2 | Spannungsversorgung 5V (an: high, aus: low), Pullup 10k auf 3V3 |
GPIO4 | I2C SDA für BME280 |
GPIO5 | I2C SCL für BME280 |
GPIO12 | Schalterkontakt |
GPIO16 | Verbindung zum Reset-Pin für deepsleep |
Software
Beim Booten stellt der ESP eine Verbindung zum WLAN "k4cg-devices" (hidden SSID) her, synchronisiert die Zeit per NTP, fragt den Türsensor sowie den BME280 ab und überträgt die Resultate an den MQTT Server 192.168.178.20, danach geht das System für 5 Minuten in den Schlafmodus. Format:
Jeder Datensatz-Wert im MQTT ist ein json-Dictionary und enthält mindestens die Schlüssel:
- "_datestr", Format: YYYY-MM-DDTHH:MM:SS.000000
- "_timestamp", Float, Unix-Time (Sekunden seit 1.1.1970, 00:00:00)
- "value", String mit Wert
MQTT Topics:
Topic | Value im json-Dictionary |
---|---|
sensors/door/default/status | "open" oder "closed" |
sensors/door/default/bme280/humidity | Luftfeuchtigkeit als Float (0..100) |
sensors/door/default/bme280/temperature | Temperatur als Float |
sensors/door/default/bme280/pressure | Luftdruck als Float in hPa |
MQTT Hosts (übermittelt als "Retained Message", d.h. bei einer Verbindung mit dem Topic durch einen Client wird die letzte Meldung übertragen):
Host | Topic | Format |
---|---|---|
iot.eclipse.org | k4cg/door/status | JSON (s.o.) |
heimat | sensors/door/default/status | YYYY-MM-DDTHH:MM:SS.000000 (open|closed) |
sensors/door/default/bme280/temperature | YYYY-MM-DDTHH:MM:SS.000000 FLOAT | |
sensors/door/default/bme280/humidity | YYYY-MM-DDTHH:MM:SS.000000 FLOAT | |
sensors/door/default/bme280/pressure | YYYY-MM-DDTHH:MM:SS.000000 FLOAT |
Hinweis: Der führende "/" wird gemäß gängiger Empfehlungen weggelassen. Dies macht bei MQTT einen Unterschied, da "/" eine zusätzliche Top-Level-Ebene mit der ID "" (leerer String) einführt. Da dies unsinnig ist, wird der führende "/" weggelassen.
Beispiel-Datensatz:
sensors/door/default/bme280/pressure {"_datestr": "2019-03-09T21:57:18.000000", "value": "977.96", "_timestamp": 1552168639} sensors/door/default/status {"_datestr": "2019-03-09T21:57:18.000000", "value": "open", "_timestamp": 1552168639} sensors/door/default/bme280/temperature {"_datestr": "2019-03-09T21:57:18.000000", "value": "21.49", "_timestamp": 1552168639} sensors/door/default/bme280/humidity {"_datestr": "2019-03-09T21:57:18.000000", "value": "36.68", "_timestamp": 1552168639}
Software-Aktualisierung
Es kann per WLAN eine Verbindung hergestellt werden, sobald der ESP aufgewacht ist. Um die Verbindung zu erleichtern, wartet das Programm 60 Sekunden nach einer Statusübermittlung.
Vorgehen beim Verbinden (mit mpfshell, installieren über pip/pip3): (Hinweis: zuerst muss des Watchdog Timer möglichst schnell deaktiviert werden, bevor das System dann neustartet und die WLAN-Verbindung abreißt)
# mpfshell -c "open ws:192.168.178.9,PASSWORD" mpfs [/]> repl >>> tim.deinit() Strg+] mpfs [/]> put boot.py mpfs [/]> put service.py ... mpfs [/]> repl >>> util.reboot()