Jens Jacobsen

Fritid - Smart Home - Postkasseføler

Jeg bruger Home Assistant til at styre en del automatik i hjemmet. Det kører på en lille Intel NUC-computer under linux (Ubuntu).
Bl.a. måler jeg når der kommer post i postkassen, og igen når postkassen tømmes. Det bliver vist på en lille tablet i stuen der også viser alle mulige andre nyttige ting - de næste dages vejr, temperaturen ude og inde, aktuelt strømforbrug i huset, sidste døgns regnmængde og så videre.

Jeg har sat to kontakter fast inde i postkassen. Den ene brydes når den smalle lem foroven i postkassen åbnes, altså når der smides post i kassen. Jeg har brugt en kontakt med 3 ben, så man kan få en forbindelse imellem to ben når kontakten ikke trykkes ind, og så den afbrydes når den trykkes ind (hvis man forbinder benene omvendt får man den modsatte måling, som man normalt bruger en kontakt, men det skal vi ikke her).
Den anden kontakt sidder så den brydes når den store lem i postkassen åbnes, den man åbner når man tømmer postkassen.

Når der kommer post vækkes ESP'en og sender et "1" til MQTT-brokeren i Home Assistant.
Når postkassen tømmes, så fungerer vores postkasse sådan at den store klap (som man får posten ud af) også åbner den lille klap (som posten kommer ind ad). Så når vi tømmer kassen, så vækkes ESP'en igen, men nu er den anden knap (til den store låge) sluttet idet ESP'en vækkes, og det får den til at sende noget andet, nemlig et "0".

Det betyder selvfølgelig at mekanikken og programmet her er ret så afhængigt af udformningen af postkassen...

postkasselåge

kontakt

postkasse indvendig

Bemærk at for at forhindre at klappen til postindkast skal stå og klapre når det blæser, så har jeg lavet et lille snoretræk med et lod (en sten)...

esp8266-01

Processoren, en ESP8266-01

postkasseføler

Diagram:
post sensor schematic

 

Esp-processoren blev programmeret i Arduino IDE og brændt vha en "USB adaptor to ESP8266 Serial Wireless Wifi Module CH340G". Bemærk at for at bruge adapteren på billedet, så skal man modificere den med en kontakt (google det eller se her: https://makeradvisor.com/esp8266-esp-01-usb-serial-programmer )

ch340g

 

Programmet der er lagt i ESP8266-01'en ser ud som følger:

/* 3/6 2019 Postkassefoeler * * ESP-01 (AI-Cloud) * Måler om postkassen fyldes eller tømmes, og går i deep sleep resten af tiden. Sender 1 eller 0 (fuld eller tom) til * mqtt-broker Mosquitto i Home Assistant (med retain-flaget sat, fordi der sendes så sjældent) Settings i Arduino 1.8.9 IDE: Board: Generic ESP8266 Module Upload Speed: 115200 CPU: 80 Crystal: 26! Flash Size: 1M no SPIFF Flash mode: DIO Flash Frequency: 40 Reset Method: ck Erase Flash: Only Sketch Postkasseklappen (øverst) kontakt forbinder RST med stel - det vækker ESP'en fra deep sleep Nederste låge (tømning) forbindes med GPIO2, der forbindes med GPIO0. GPIO0 sættes som output og LOW i setup. Både GPIO0, GPIO2, RST og CH_PD forbindes til 3V igennm hver sin 3K3 modstand ESP01 forsynes med 2 1,5V batterier (3V) */ #include "ESP8266WiFi.h" #include <Wire.h> #define SERIAL_BAUD 115200 #include <ESP8266mDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> #include "EspMQTTClient.h" ADC_MODE(ADC_VCC); //vcc read const char* ssid = "Your-WiFiSSID"; //String const char* password = "Your-WiFiPassword"; String postkasseStatus = ""; //1 = Fuld, 0 = Tom. String postkasseBatteri = ""; int knapTom = 2; //Postkasselågen (tømning) er på GPIO2 int knapFyld = 0; //Klappen (fyldning) er på GPIO0 boolean knapTomStatus = LOW; // boolean knapFyldStatus = LOW; WiFiClient wificlient; extern "C" { #include "gpio.h" } extern "C" { #include "user_interface.h" } EspMQTTClient client( "Your-WiFiSSID", // Wifi ssid "Your-WiFiPassword", // Wifi password "192.168.2.6", // MQTT broker ip 1883, // MQTT broker port "MQTTusername", // MQTT username "MQTTpassword", // MQTT password "Postkasse-sender", // Client name sendMQTT, // Connection established callback true, // Enable web updater true // Enable debug messages ); ////////////////////////////////////////////////////////////////// void setup() { Serial.begin(SERIAL_BAUD); // while (!Serial) {} // Wait Serial.println("Woke up from sleep"); pinMode(0, OUTPUT); // Sætter GPIO0 som output digitalWrite(0, LOW); // og tvinger den lav //LOW pinMode(2, INPUT); //PostkasselÃ¥gen (tømning) er pÃ¥ GPIO2 knapTomStatus = digitalRead(2); if (knapTomStatus == LOW) { postkasseStatus = "0"; } else { postkasseStatus = "1"; } Serial.println(postkasseStatus); postkasseBatteri = ESP.getVcc() / 1000.0; WiFi.begin ( ssid, password ); // Wait for connection while ( WiFi.status() != WL_CONNECTED ) { delay ( 10 ); } Wire.begin(); // Pause for at varme lidt op igen Serial.println("Pause i 0.5 (0) sekunder"); delay(50); ArduinoOTA.handle(); client.loop(); delay(60000); // 30 sekunder til evt omprogrammering Serial.println("Går i deep sleep for evigt, indtil der kommer eller tømmes post igen (øverste klap åbnes)"); ESP.deepSleep(0); // 0 = forever } void loop() { } void sendMQTT() { client.publish("ude/postkasse", postkasseStatus, true); //true = retain-flag, for at mqtt-brokeren holder værdien ved client.publish("ude/postkasse/batteri", postkasseBatteri, true); // evt genstart af hassio Serial.print("sendMQTT postkasseStatus: "); Serial.println(postkasseStatus); }

 

 

I Home Assistant kører MQTT-brokeren Mosquitto. Det er dens (og Home Assistants) IP-adresse der hedder "MQTT broker ip" i koden. I HA's brugerflade, i Supervisor - Mosquitto broker, konfigurerer man brugernavn og password.
Når der er post er sensor.postkasse's tilstand=1 og man kan vise det i Home Assistant som f.eks sådan her:
ha-screendump

 


Sidst opdateret 2020