Mahlzeit, ich wollte mal fragen, ob schon jemand hier Projekte mit dem ESP und Homeyduino verwirklicht hat. Falls das Thema eher in den Bereich Entwickler gehört, bitte verschieben.
Ich sitze momentan daran, eine kleine Steuerung für meinen Garagentorantrieb von Chamberlain zu verwirklichen. Ein ESP32 soll über ein Relais den kurzen Impuls des normalerweise montierten Schalters von Chamberlain weitergeben und zusätzlich über einen Reedkontakt mir anzeigen, ob das Tor zu oder auf ist. Ergänzend hierzu werde ich noch einen Temperatur- und Feuchtigkeitssensor montieren, da es mich schon immer mal interessiert hat, wie sich die Temperatur im Winter in der Garage verhält.
Und da ist er, der erste Prototyp. Bitte beachtet, dass der Code noch nicht optimiert ist.
//20.01.20 Version 4.1 eingefügt.
//02.02.20 Version 4.2 eingefügt
Code Garagensteuerung
//v1 Code von https://huisvanvandaag.nl.
//v2 Code von siehe oben, an ESP32 angepasst, relay.h raus, Wifi Code geändert
//v3 SHT31 eingefügt
//v4 Reed-Kontakt Garagentor, Rückgabewert des Reed Kontaktes an Homey
//v4.1 Millis angepasst, Reedontakt Code geändert
//v4.2 Wifi reconnect eingefügt https://medium.com/diy-my-smart-home/esp-tipp-wifi-reconnect-einbauen-dc4a7397b741
//Relay
#include <WiFi.h>
#include <WiFiClient.h>
#include <Homey.h>
#define PIN_RELAY 17 // Signal Pin Relay
bool state = false;
unsigned long previousMillis = 0;
const unsigned long interval = 100; //Interval in milliseconds
//sht31
#include <Wire.h>
#include “SHTSensor.h”
SHTSensor sht;
unsigned long previousMillis2 = 0;
const unsigned long interval2 = 30000; //Interval in milliseconds
//Reed
int pinStatusGarageDoor = 16;
byte GarageDoorBinaryState;
unsigned long previousMillis3 = 0;
const unsigned long interval3 = 100; //Interval in milliseconds
// Wifi
//============================================================================================
const char* ssid = “XXX”;
const char* password = “XXX”;
void setup() {
Wire.begin();
Serial.begin(115200);
while (!Serial);
Serial.println(F(“Relay, SHT31 und Reed Test”));
StartWiFi();
if (sht.init()) {
Serial.print(“SHT31 init(): success\n”);
} else {
Serial.print(“SHT31 init(): failed\n”);
}
pinMode(PIN_RELAY, OUTPUT); //Set relay pin to output
digitalWrite(PIN_RELAY, LOW); //Turn output off
pinMode(pinStatusGarageDoor, INPUT_PULLUP);
Homey.begin(“Garage”); // Name
Homey.setClass(“socket”);
Homey.addCapability(“onoff”, setState);
Homey.addAction(“output”, setState);
Homey.addCondition(“state”, getState);
Homey.addCapability(“measure_humidity”);
Homey.addCapability(“measure_temperature”);
Homey.addCapability(“alarm_contact”);
}
void loop() {
Homey.loop();
unsigned long currentMillis = millis();
WifiRetry();
if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
}
if (currentMillis - previousMillis2 > interval2) {
previousMillis2 = currentMillis;
sht31();
}
if (currentMillis - previousMillis3 > interval3) {
previousMillis3 = currentMillis;
reed();
}
zeroState();
}
void StartWiFi() {
WiFi.begin(ssid, password);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.println(“Connection Failed! Rebooting…”);
delay(5000);
ESP.restart();
}
Serial.println(“Connected to the WiFi network”);
Serial.println("");
Serial.println(“WiFi connected”);
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void WifiRetry() {
int wifi_retry = 0;
while(WiFi.status() != WL_CONNECTED && wifi_retry < 5 ) {
wifi_retry++;
Serial.println(“WiFi not connected. Try to reconnect”);
WiFi.disconnect();
WiFi.mode(WIFI_OFF);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
delay(100);
}
if(wifi_retry >= 5) {
Serial.println("\nReboot");
ESP.restart();
}
}
void setState() {
state = Homey.value.toInt();
applyState();
}
void applyState() {
//digitalWrite(PIN_RELAY, state);
if (state > 0) {
digitalWrite(PIN_RELAY, HIGH); //turn relay on
delay(100);
digitalWrite(PIN_RELAY, LOW);
}
Serial.println("applyState(): new state is " + String(state));
Homey.setCapabilityValue(“onoff”, state);
Homey.trigger(“state”, state);
}
void getState() {
Serial.println("getState(): state is " + String(state));
return Homey.returnResult(state);
}
void zeroState() {
if (state > 0) {
state = 0; //Status auf Null
Homey.setCapabilityValue(“onoff”, state); //und Rückgabewert an Homey senden
}
}
void sht31() {
float temperature = (sht.getTemperature());
byte humidity = (sht.getHumidity());
Serial.print(“SHT:\n”);
Serial.print(" Temperatur: “);
Serial.print(temperature);
Serial.println(” *C");
Serial.print(" Luftfeuchtigkeit: “);
Serial.print(humidity);
Serial.println(” %");
if (isnan(humidity) || isnan(temperature)) {
Serial.print("\t");
Serial.println(“Failed to read from sht31 sensor (isnan)!”);
//return;
delay(5000);
ESP.restart();
}
if ((humidity >= 100) || (temperature <= -146)) {
Serial.print("\t");
Serial.println(“Failed to read from sht31 sensor (-146 100) !”);
//return;
delay(5000);
ESP.restart();
}
if ((humidity == 0) || (temperature == 0)) {
Serial.print("\t");
Serial.println(“Failed to read from sht31 sensor (0) !”);
//return;
delay(5000);
ESP.restart();
}
Homey.setCapabilityValue(“measure_temperature”, (float) temperature);
Homey.setCapabilityValue(“measure_humidity”, (int) humidity);
}
void reed() {
byte _GarageDoorBinaryState = digitalRead(pinStatusGarageDoor);
if (GarageDoorBinaryState != _GarageDoorBinaryState) {
GarageDoorBinaryState = _GarageDoorBinaryState;
}
if (_GarageDoorBinaryState == HIGH) {
Serial.println(“Die Garage ist geschlossen”);
Serial.println(_GarageDoorBinaryState);
Homey.setCapabilityValue(“alarm_contact”, (false));
}
else
{
Serial.println(“Die Garage ist offen”);
Serial.println(_GarageDoorBinaryState);
Homey.setCapabilityValue(“alarm_contact”, (true));
}
}
Das hierauf folgende Projekt wird deutlich größer, da Homey ja keine Z-Unos unterstützt und ich somit meine Wetterstation (Regenmenge, Wind und -richtung, UV, LUX, Temperatur, Feuchtigkeit und Luftdruck) auf einen ESP32 verändern muss.