Introductie
Ik wil mijn deurbel automatiseren, waarover op internet en GOT al 100 topics zijn voorbijgekomen. Dit topic is misschien niet zozeer een vraag maar meer een verslag van wat ik heb gevonden, welke beslissingen ik heb genomen en wat ik uiteindelijk voor elkaar heb gekregen. Ik denk dat ik een aantal toevoegingen kan doen aan deze topics zodat het een soort van 'mega deurbel' topic kan worden waaruit iedereen inspiratie kan putten.Om eerlijk te zijn ben ik met solderen en weerstandjes nooit verder gekomen dan wat aan elkaar solderen van diverse kabels. Weerstanden, bridge rectifiers en optocouplers zijn nieuw voor me en ik probeer dan ook zo min mogelijk hiermee in aanraking te komen. Mocht dat wel zo zijn dan hoop ik dat ik op DIT gebied (waar nodig) wat hulp van jullie kan krijgen en zelfs wat bij kan leren.
De volgende topics zijn doorgenomen ter inspiratie
- Deurbel uitlezen Raspberry via optocoupler probleem
- Deurbel -> Raspberry GPIO
- Deurbel op NodeMCU/Arduino aansluiten
- Raspberry Pi deurbel
- Draadloze deurbel aansluiten op bestaande bel
Wat ik wil bereiken is dit
- Feedback aan de deur geven dat er gebeld is dmv bijv. een ledje
- Lege batterij van draadloze bel drukknop voorkomen
- Blaffende hond voorkomen, eventueel door geen ding/dong af te laten spelen maar bijvoorbeeld een MP3 over bluetooth speaker of via een Alexa/Google Home melding.
- De bel 'remote' uit kunnen zetten als mijn kinderen slapen
- De bel 'remote' kunnen triggeren, voor bijv. Sinterklaas
- Als we WEL thuis zijn en er aangebeld is: indien we TV aan het kijken zijn, dat er een afbeelding van de security cam op mijn Neeo remote komt (= universele afstandsbediening).
- Als we NIET thuis zijn en er aangebeld is: een whatsapp ontvangen, met daarin o.a. een afbeelding van de beveiligingscamera.
- 's Nachts de bel uitzetten hoeft voor mij niet, want als er een noodsituatie is dan wil ik wel wakker gebeld kunnen worden.
Uitgangssituatie
- Houten kozijn, met daarop een plak bel van de Action, er zit een doorvoer naar de meterkast van de oude bel
- In de straat heeft iemand eenzelfde bel, waardoor onze bel het niet meer doet, of in ieder geval sporadisch. Heel irritant
- In de meterkast hangt een Raspberry Pi 3, die o.a. de slimme meter uitleest
- Er zijn nog een flink aantal NodeMCU bordjes beschikbaar in mijn electronica kist
Mogelijke aanvliegroutes
Aangezien ik de deurbel o.a. remote wil kunnen triggeren, niet af wil laten gaan als we niet thuis zijn (in verband met een blaffende keeshond) is een bestaande bel van bijv. de Action in zijn geheel gebruiken eigenlijk geen optie. Ik zat in plaats daarvan te denken aan het hergebruiken van mijn Raspberry Pi 3, want die draait toch en heeft GPIO pins. Nadeel echter is dat als de Raspberry Pi vast loopt, of stuk is, of de software die de deurbel checkt stopt of vastgelopen is, de deurbel niks meer doet. Dat de software vastloopt kun je oplossen, maar als de Pi vastloopt heb je natuurlijk wel een probleem.Ik heb eventueel ook nog een aantal ESP8266 development bordjes met Micro USB en dat is misschien nog wel een betere oplossing dan de Raspberry Pi hiervoor te gebruiken. Daarmee zou ik de bel ook gewoon 'de bel' kunnen laten zijn die via WiFi en MQTT een bericht op een bus publiceert wat dan weer door Domoticz (in mijn geval) opgepakt kan worden en dat de 'slimmigheid' doet. In de eerste versie kan ik dan in de ding/dong module eventueel ook een ESP8266 zetten die weer op een ander topic is geabonneerd en dan de audio kan afspelen.
Uiteindelijk heb ik gekozen voor de volgende oplossing:
Deurbel -> NodemCU -> MQTT -> Domoticz -> Logica -> MQTT -> NodeMCU -> DingDong
Ik denk dat het voordeel van deze aanvliegroute is dat ik het redelijk hufter-proof kan maken en geen 433 MHz signaal hoef uit te zenden (vanaf Domoticz) om mijn bel te triggeren. Een MQTT bus heb ik zoiezo al draaien omdat de meterstanden van mijn slimme meter via MQTT naar mijn Domoticz install gaan. Eventueel zou je de 2 NodeMCU's ook met elkaar kunnen laten praten via HTTP (REST) maar dat is misschien versie 3.0. Eerst zorgen dat we iets hebben dat werkt.
Stap 1: de deurbel aansluiten en een ledje laten branden
Hoe dan ook moet ik beginnen bij de voordeur, d.w.z de belknop. Ik dacht te beginnen met iets simpels, van 4 euro bij een willekeurige bouwmarkt. Uiteindelijk wil ik naar een vandal button gaan want dat vind ik gewoon sjieker.
Voor het gemak ga ik uit van NodeMCU (ESP8266) aangezien ik die nog een aantal heb liggen en hierdoor de Raspberry Pi verder ook niets hoeft te doen. Ik zou volgens mij zelfs de NodeMCU in deep sleep kunnen brengen zo lang er niet op de deurbel is gedrukt. Via deze tutorial zie je hoe je een button op de NodeMCU kunt aansluiten, ik ga er vanuit dat deze tutorial hetzelfde is voor een vandal button;

Het eerste project
Sinds ik dit topic aan het typen ben, ben ik ook flink aan het zoeken naar eventuele implementaties met de ESP8266, vooral in combinatie met WiFi en sleep, om de power consumption te beperken. Ik heb wat informatie gevonden op de volgende pagina's en ga dit in de loop van de week combineren tot een werkend prototype.- http://blog.nexusuk.org/2016/07/wifi-doorbell-project.html
- https://www.bakke.online/...mption-on-esp8266-part-3/
Blog 2 geeft wat meer uitleg hoe de WiFi reconnect snelheid van de ESP8266 nog verder kan worden verbeterd door DHCP uit te zetten (m.a.w. geef de bel een statisch IP) en WiFi persistence uit te zetten.
Eerste code is af
Zo, de eerste code is af, doet eigenlijk niets anders dan de onboard LED laten knipperen zodra de bel ingedrukt is. WiFi reconnect tijd zit met een statisch IP op 150ms, zonder statisch IP zit dat op 8 seconden. Dat kan aan mijn router liggen, maar dit werkt. Volgende stap is een MQTT bericht publiceren. Wat ik nog moet uitzoeken in onderstaande sketch is of ik 'altijd' een WiFi verbinding wil, of alleen bij het indrukken (gezien de snelheid van reconnecten).code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
| #include <ESP8266WiFi.h> const char* ssid = "XXXX"; const char* password = "XXXX"; const int ledWifi = 2; const int ledHttp = LED_BUILTIN; const int doorbellPin = D5; void setup() { pinMode(doorbellPin, INPUT_PULLUP); pinMode(ledWifi, OUTPUT); digitalWrite(ledWifi, HIGH); pinMode(ledHttp, OUTPUT); digitalWrite(ledHttp, HIGH); Serial.begin(115200); Serial.println(); } void WIFI_Reconnect() { if (WiFi.status() != WL_CONNECTED) { long setupStartMillis = millis(); WiFi.mode(WIFI_STA); Serial.print("Connecting to: "); Serial.println(ssid); if (strcmp (WiFi.SSID().c_str(), ssid) != 0) { Serial.println("- SSID was empty"); WiFi.begin(ssid, password); } else { WiFi.begin(); } WiFi.config(IPAddress(192, 168, 1, 20), IPAddress(192, 168, 1, 1), IPAddress(255, 255, 255, 0)); int timeout = millis() + 10000; while ((WiFi.status() != WL_CONNECTED) && (timeout > millis())) { delay(1); } if ((WiFi.status() != WL_CONNECTED)) { digitalWrite(ledWifi, HIGH); Serial.println("- failed to connect!"); } else { Serial.print("- Connected in: "); Serial.print(millis() - setupStartMillis); Serial.println("ms"); Serial.print("- IP: "); Serial.println(WiFi.localIP()); Serial.print("- MAC address: "); Serial.println(WiFi.macAddress()); Serial.println(); } } } void loop() { if (!digitalRead(doorbellPin)) { digitalWrite(ledHttp, LOW); }else{ digitalWrite(ledHttp, HIGH); } if (WiFi.status() != WL_CONNECTED) { WIFI_Reconnect(); } if (WiFi.status() == WL_CONNECTED) { digitalWrite(ledWifi, LOW); } delay(5); } |
[ Voor 13% gewijzigd door xces op 06-11-2017 23:03 . Reden: Eerste code toegevoegd ]