
Vi har desværre et godt stykke ud til vores postkasse, da vores indkørsel er ret lang. Derudover er vores postkasse lavet af metal, som gør at trådløse signaler har lidt svært ved at trænge igennem. Alt dette har jeg prøvet at løse på et par forskellige måder, men jeg har endeligt lavet en løsning, jeg er sikker på nok skal holde.
Indkøbsliste
- WEMOS D1 Mini Pro 4M med ekstern antenne (reklamelink) (vælg
16MB And 2.4Gantenna
) - ESP8266 NodeMCU (reklamelink) (vælg
NodeMcu-CH340
) - TP4056 lithium batteribeskyttelse og oplader (reklamelink) (vælg det USB stik der passer dig bedst)
- 18650 batteriholder (reklamelink) (vælg
1X18650
men vælg så mange du har lyst til at bruge) - “Wago” samlemuffer” (reklamelink) (vælg
222 412C
) - Dør/vindue magnetsensor (reklamelink) (der findes mange varianter – vælg en der passer til dit behov)
- MicroWakeupper (den er MEGA fed)
- Et par 18650 lithium batterier (find selv fra en dansk butik – jeg har brugt Sony VTC6)
- Vandtæt kasse til at have alle delene i
Derudover skal du bruge en loddekolbe (jeg anbefaler TS100 (reklamelink) selvom den er lidt dyr). Indkøbslisten er selvfølgeligt lavet, så du kan lave en tro kopi af min postkasse sensor. Anbefaler jeg det? Nok ikke. Det er ret overkill med to store 18650 batterier til 100+ kroner, en D1 Mini Pro, en MicroWakeupper osv., når der faktisk findes mange andre gode løsninger derude, der blot kræver et par modstande (og selvfølgeligt et par ESPer, hvis du vil køre ESP-NOW).
Indledning
Som jeg nævnte før, har jeg haft problemer med, at enheder ikke kan nå ind til huset, på grund af vores lange indkørsel og postkasse af metal. Det har jeg valgt at løse ved at lave noget helt fra bunden, som endte med at koste mere end hvad jeg havde håbet, men løsningen burde også være ret bulletproof nu. Den er i hvert fald lavet som en rigtig “do it yourselfer” ville have lavet det, for der er plads til en masse modificeringer!
Jeg har været kæmpe fan af Zigbee, men jeg oplevede kun problemer og atter problemer, fordi afstanden ud til postkassen var så stor. Jeg har ellers smidt en CC2652 router ind i huset lige på den anden side af muren, men det virkede kun i perioder. Jeg valgte derfor WiFi med ekstern antenne, for der kan jeg teste det lidt nemmere og få lidt mere kontrol over tingene. Men hvem ved – måske bliver det Zigbee om et par måneder, når jeg er færdig med at lege med mine EBYTE E18 Zigbee enheder (hold øje med et nyt opslag!).
Opsætning
Jeg har valgt at gå med en opsætning der kræver, at min lille D1 Mini er online så kort tid som muligt. Hvert millisekund eller sekund den er tændt, bruger den strøm, som betyder at jeg skal lade batterierne op. Det vil jeg helst ikke gøre, med mindre det er nødvendigt (ja, jeg er meget doven). For at løse det problem, har jeg brugt en MicroWakeupper til at tænde for min D1 Mini. Når magnetsensoren mister forbindelsen, går min D1 Mini i deep sleep, hvor den stort set ikke bruger strøm.
Før den går i søvn, sker der dog alt det sjove. Inde i huset har jeg nemlig opsat en anden ESP8266 som agerer som “gateway”, som sørger for at modtage en besked fra min D1 Mini og sende det op til min MQTT server. Dette gøres via et “koncept” der hedder ESP-NOW. Uden at gå for meget i detaljer, så betyder det blot, at min ESP8266 inde i huset er gateway/master og min D1 Mini i postkassen er en peer/slave. Kært barn har mange navne, men jeg vælger at kalde det for master og slave.
Når kontakten bliver brudt, er min D1 Mini kun tændt i 0.15 til 0.25 sekunder, hvorefter den går i deep sleep igen! Det er utrolig kort tid, og på al den tid formår den at koble til masteren inde i huset, aflæse batteriets spænding og sende den spænding til masteren. Hvis jeg bare brugte WiFi, tog det samme omkring 2 sekunder, og det krævede en masse små hacks, som jeg ikke er særlig stolt af.
TP4056
MicroWakeupperen har ikke nogen form for beskyttelse fra batterierne overhovedet. Jeg har derfor valgt at bruge en TP4056, da jeg havde et par stykker af den liggende. Det fede ved TP4056 er, at du også kan bruge den til at oplade batterierne, hvis de engang løber tør for strøm. Batterierne og komponenterne burde nu være beskyttet mod overcurrent, under voltage og over discharge, hvilket man bestemt har lyst til at få, når man arbejder med lithium batterier.
MicroWakeupper
Grunden til at jeg har valgt at bruge en MicroWakeupper, er fordi det er besværligt at vække en ESP8266 op fra deep sleep. Det kræver man har nogle modstande også, som bare øger kompleksiteten. Da prisen på en MicroWakeupper ikke er særlig høj, gav det god mening at bruge sådan en. Derudover passer den også lige ovenpå en D1 Mini, så du ikke skal gøre noget andet end at lodde headers på den. MicroWakeupperen har desuden også mulighed for at aflæse batteriets spænding, som der også er en fin lille metode til i hans bibliotek. Jeg måtte dog selv gange lidt til tallet, da det ikke passede helt.
Strømforbrug
Jeg har ved hjælp af et lille værktøj fundet ud af, hvor længe jeg kan holde dette projekt i live. Da jeg har 2 batterier, vil den totale kapacitet være fordoblet. Jeg har sat de fleste værdier ret højt, bare for at få et lidt mere realistisk tal ud, men det kan sagtens være at det ikke passer. Jeg har målt mig frem til det meste, og så har jeg valgt de værste tal jeg kunne finde, og selv der, burde den holde strøm i 12 år, hvis jeg åbner min postkasse én gang om dagen:

Det er fuldstændig sindssygt hvis det passer. Hvis bare det holder 1-2 år er jeg meget tilfreds!
Diagram
Jeg har prøvet at tegne et diagram over min opsætning, og det har jeg gjort så det er så let at forstå:

Polariteten på forbindelsen mellem MicroWakeupperen og dør/vindue sensoren er ligegyldig, derfor er ledningerne blot markeret med sort. Du kan spare samlemufferne væk, ved at lodde begge ledninger fra batteriholderne over på TP4056 enheden, men jeg har valgt at bruge en samlemuffe, da jeg altid gør det, når der er mere end én ledning.
ESP-NOW
Som jeg nævnte før, bruger jeg ESP-NOW til at få min D1 Mini til at sende et signal til min ESP8266 inde i huset. ESP-NOW har nogle små irriterende “fejl”, som man er nødt til at arbejde udenom. Det er blandt andet ikke muligt både at lytte efter nye beskeder og være forbundet til routeren på samme tid. Derfor har jeg været nødt til at lave et lille hack, hvor jeg først lytter efter beskeder, derefter genstarter ESPen, forbinder til WiFi, forbinder til MQTT serveren, sender beskeden og forbinder så til ESP-NOW igen, så vi kan lytte efter nye beskeder. Alt det tager omkring 2-3 sekunder, men da det sker inde i huset, skal jeg ikke bekymre mig om et batteri, da min ESP8266 er forbundet til konstant strøm.
Jeg har stjålet noget at min kode fra nettet, rettet lidt et par steder og omskrevet en del af logikken. Det er langt fra det pæneste, men nu er jeg heller ikke C++ programmør, så det må I altså lige leve med.
Montering i postkassen
Jeg har valgt at lime mine komponenter fast (nok ikke det smarteste) til en beholder, som jeg ved er vandtæt. Vi har heldigvis (men også desværre) noget der hedder tyngdekraften, som betyder at ting som regel falder nedad. Det gælder også vand. Jeg har derfor monteret min vandtætte kasse på hovedet, for det er nemlig ikke muligt for vand at løbe opad, så det burde aldrig kunne komme ind i kassen. Jeg har derfor heller ikke noget låg på, for så kan der potentielt set samle sig vand i bunden (altså i låget), og det er jeg ikke interesseret i heller.
Selve monteringen af kassen har jeg gjort med stærk 3M dobbeltklæbende tape, for jeg regner ikke med, at jeg på noget tidspunkt skal have den ud igen. Dog ser jeg limen og tapen som værende det svageste led i hele dette projekt, for jeg har sgu ikke tyngdekraften på min side, desværre.
Magnetsensoren er blot monteret på indersiden af postkassen, hvor selve magneten er monteret på låget af postkassen. Den mister forbindelsen ved at åbne låget, og så modtager jeg en besked på telefonen og i Home Assistant:

Arduino kode
Husk at hente MicroWakeupper koden herfra. Får du problemer med at compile det, så undersøg om dine board settings er korrekte. Virker koden efter compiling ikke, så kig i serial monitor og se om du får noget output.
Slave (D1 Mini)
#include <ESP8266WiFi.h>
#include <MicroWakeupper.h>
extern "C" {
#include <espnow.h>
}
MicroWakeupper microWakeupper;
float battery_multiplier = 1.0785;
uint8_t remoteMac[] = {0x33, 0x34, 0x33, 0x34, 0x33, 0x34};
#define WIFI_CHANNEL 1
volatile boolean callbackCalled;
unsigned long entry1 = millis();
void setup() {
int i = 0;
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.disconnect();
Serial.printf("This mac: %s, ", WiFi.macAddress().c_str());
Serial.printf("target mac: %02x%02x%02x%02x%02x%02x", remoteMac[0], remoteMac[1], remoteMac[2], remoteMac[3], remoteMac[4], remoteMac[5]);
Serial.printf(", channel: %i\n", WIFI_CHANNEL);
if (esp_now_init() != 0) {
Serial.println("*** ESP_Now init failed");
ESP.deepSleep(0);
}
esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
esp_now_add_peer(remoteMac, ESP_NOW_ROLE_SLAVE, WIFI_CHANNEL, NULL, 0);
esp_now_register_send_cb([](uint8_t* mac, uint8_t sendStatus) {
callbackCalled = true;
});
callbackCalled = false;
}
void loop() {
float batteryVoltage = microWakeupper.readVBatt() * battery_multiplier;
String batteryVoltageString = (String)batteryVoltage;
uint8_t *buffer;
buffer = (uint8_t*)batteryVoltageString.c_str();
esp_now_send(NULL, buffer, sizeof(buffer));
ESP.deepSleep(0);
}
Master (ESP8266)
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
extern "C" {
#include "user_interface.h"
#include <espnow.h>
}
/*
RET DE VÆRDIER HER
*/
char *ssid = DIT_SSID_HER;
char *password = DIN_KODE_HER;
IPAddress mqtt_server(192, 168, 1, 56);
#define mqtt_port 1883
#define BATTERYTOPIC "homeassistant/sensor/mailboxsensor/battery"
#define NEWMAILTOPIC "homeassistant/sensor/mailboxsensor/newmail"
/*
INDTIL HER
*/
uint8_t mac[] = {0x33, 0x34, 0x33, 0x34, 0x33, 0x34};
void initVariant() {
wifi_set_macaddr(SOFTAP_IF, &mac[0]);
}
WiFiClient wifiClient;
PubSubClient client(wifiClient);
String deviceMac;
struct __attribute__((packed)) SENSOR_DATA {
char voltage[240];
} sensorData;
volatile boolean haveReading = false;
int heartBeat;
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_AP);
initVariant();
Serial.print("This node AP mac: "); Serial.println(WiFi.softAPmacAddress());
Serial.print("This node STA mac: "); Serial.println(WiFi.macAddress());
initEspNow();
Serial.println("Setup done");
}
void loop() {
if (millis() - heartBeat > 30000) {
Serial.println("Waiting for ESP-NOW messages...");
heartBeat = millis();
}
if (haveReading) {
haveReading = false;
wifiConnect();
publishMQTT();
client.disconnect();
delay(200);
ESP.restart();
}
}
void initEspNow() {
if (esp_now_init() != 0) {
Serial.println("*** ESP_Now init failed");
ESP.restart();
}
esp_now_set_self_role(ESP_NOW_ROLE_COMBO);
esp_now_register_recv_cb([](uint8_t *mac, uint8_t *data, uint8_t len) {
deviceMac = "";
deviceMac += String(mac[0], HEX);
deviceMac += String(mac[1], HEX);
deviceMac += String(mac[2], HEX);
deviceMac += String(mac[3], HEX);
deviceMac += String(mac[4], HEX);
deviceMac += String(mac[5], HEX);
memcpy(&sensorData, data, sizeof(sensorData));
Serial.print("Message received from device: ");
Serial.print(deviceMac);
Serial.println(sensorData.voltage);
Serial.println();
haveReading = true;
});
}
void wifiConnect() {
WiFi.mode(WIFI_STA);
Serial.println();
Serial.print("Connecting to "); Serial.print(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(250);
Serial.print(".");
}
client.setServer(mqtt_server, mqtt_port);
reconnectMQTT();
}
void publishMQTT() {
String clientId = "Mailbox-";
clientId += String(random(0xffff), HEX);
if (!client.connected()) {
reconnectMQTT();
}
String voltage = sensorData.voltage;
client.publish(BATTERYTOPIC, voltage.c_str());
client.publish(NEWMAILTOPIC, clientId.c_str());
}
void reconnectMQTT() {
String clientId = "Mailbox-";
clientId += String(random(0xffff), HEX);
while (!client.connected()) {
client.connect(clientId.c_str());
delay(1);
}
}
Home Assistant kode
Jeg har valgt at snyde lidt, fordi jeg ikke helt ved, hvordan man får Home Assistant til at tjekke om der er kommet en ny værdi, hvis den værdi er den samme. Idealt ville jeg sende “true” hvis der var kommet ny mail, men jeg har valgt at sende en tilfældig værdi ind. Du kan derfor tjekke på, om værdien ændrer sig, for så må der være kommet en ny besked i MQTT.
configuration.yaml
sensor:
- platform: mqtt
name: "Mailbox sensor new mail"
state_topic: "homeassistant/sensor/mailboxsensor/newmail"
- platform: mqtt
name: "Mailbox sensor battery voltage"
state_topic: "homeassistant/sensor/mailboxsensor/battery"
Node-RED flow
Burde ikke være så svært at genskabe dette:

Hjælp og kontakt
Jeg har lavet et opslag inde på Dansk Home Assistant gruppe på Facebook, så hvis du har brug for hjælp, kan du eventuelt finde mig derinde og spørge. Alternativt kan du skrive en besked under dette opslag, men jeg kan desværre ikke garantere, at jeg kan svare tilbage (har ikke brugt kommentarfeltet her på siden sååå meget).
Lidt billeder



Skriv et svar