Moin, anbei der Code;
in secrets.h stehen nur Definitionen wie Wlan-SSID, Passwörter Fingerprints etc.
in functions.h steht neben #include <time.h> noch die Zeitfunktion setupTime().
Wenn diese noch benötigt werden, kann ich die auch noch Posten...
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <MQTT.h>
// https://www.youtube.com/watch?v=ytQUbyab4es
// platformio device monitor --baud 115200
// platformio run --target upload && platformio device monitor --baud 115200
//enable only one of these below, disabling both is fine too.
//#define CHECK_CA_ROOT // geht nicht!
//#define CHECK_PUB_KEY
#define CHECK_FINGERPRINT
////--------------------------////
#include "secrets.h"
#include "functions.h"
#if (defined(CHECK_PUB_KEY) and defined(CHECK_CA_ROOT)) or (defined(CHECK_PUB_KEY) and defined(CHECK_FINGERPRINT)) or (defined(CHECK_FINGERPRINT) and defined(CHECK_CA_ROOT)) or (defined(CHECK_PUB_KEY) and defined(CHECK_CA_ROOT) and defined(CHECK_FINGERPRINT))
#error "cant have both CHECK_CA_ROOT and CHECK_PUB_KEY enabled"
#endif
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
int PIN_EMPFAENGER = 0 ; // D3 = PIN 0 Receiver on interrupt 0 => that is pin D3
int PIN_SENDER = 5 ; // D1 = PIN 5
BearSSL::WiFiClientSecure net;
MQTTClient client;
int timezone = 2;
unsigned long lastMillis_tuer = 0;
unsigned long lastMillis_zeit = 0;
time_t now;
const int TimeSleepS = 1800; // 900s = 15Min
//const int TimeSleepS = 60; // 900s = 15Min
int temp = 22;
int hum = 11;
char actDate[20];
char actTime[20];
// unsigned long lastMsg_zeit = -333999999; // nicht mehr benötigt.
unsigned long lastMsg_tuer = -333999999;
bool GEAENDERT=false;
bool ALTER_STATUS=false;
int PIN_TASTER=D0;
bool STATUS_TASTER=false;
void tuer(){
now = time(nullptr);
time_t nowi = time(nullptr);
struct tm *tmp = localtime(&nowi);
sprintf (actDate, "%02d.%02d.%04d", tmp->tm_mday , tmp->tm_mon+1, 1900+tmp->tm_year);
sprintf (actTime, "%02d:%02d:%02d", tmp->tm_hour , tmp->tm_min, tmp->tm_sec );
String payloadT = "{\"id\": \"Flur\",";
payloadT += "\"date\": \"";
payloadT += actDate;
payloadT += "\",";
payloadT += " \"time\": \"";
payloadT += actTime;
payloadT += "\",";
payloadT += " \"utctimestamp\": \"";
payloadT += now;
payloadT += "\",";
if(digitalRead(PIN_TASTER))
{
payloadT += "\"msg\": \"Tür auf\"}";
}
else
{
payloadT += " \"msg\": \"Tür zu\"}";
}
// payloadT += "}";
char attributesT[200];
payloadT.toCharArray(attributesT, 200 );
Serial.println(attributesT);
client.publish(MQTT_PUB_TOPIC, attributesT, true, 1);
}
void messung()
{
STATUS_TASTER=digitalRead(PIN_TASTER);
if(STATUS_TASTER != ALTER_STATUS)
{
ALTER_STATUS=STATUS_TASTER;
Serial.println(" Status Taster hat sich geändert");
tuer();
}
}
void mqtt_connect()
{
Serial.print("Prüfe WLAN...");
if(WiFi.status() != WL_CONNECTED){
Serial.print("WiFi verbindung verloren!");
}else {
Serial.print("bin noch online");
}
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(1000);
}
Serial.println("ok");
client.setWill(MQTT_LWT_TOPIC, "offline", true, 1);
Serial.print("Verbinde mit MQTT-Server ");
while (!client.connect(HOSTNAME, MQTT_USER, MQTT_PASS))
{
Serial.print(".");
delay(500);
}
Serial.print(" verbunden ");
client.publish(MQTT_LWT_TOPIC,"online",true, 1);
Serial.println(" und wieder online!");
client.subscribe(MQTT_SUB_TOPIC);
}
void messageReceived(String &topic, String &payload)
{
Serial.println("Recieved [" + topic + "]: " + payload);
if(payload!="ok")
{
int zahl = payload.toInt(); // mach payload zu einer Zahl...
mySwitch.send(zahl, 24); // sende diese Zahl.
client.publish(MQTT_SUB_TOPIC, "ok", true, 1);
}
}
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.print("Attempting to connect to SSID: ");
Serial.print(ssid);
Serial.println();
Serial.println();
WiFi.hostname(HOSTNAME);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
Serial.println("connected!");
Serial.print("Setting time using SNTP");
configTime(timezone * 3600, 0, "ptbtime1.ptb.de", "ptbtime2.ptb.de");
#ifdef CHECK_CA_ROOT
BearSSL::X509List cert(digicert);
net.setTrustAnchors(&cert);
#endif
#ifdef CHECK_PUB_KEY
BearSSL::PublicKey key(pubkey);
net.setKnownKey(&key);
#endif
#ifdef CHECK_FINGERPRINT
net.setFingerprint(fp);
#endif
#if (!defined(CHECK_PUB_KEY) and !defined(CHECK_CA_ROOT) and !defined(CHECK_FINGERPRINT))
net.setInsecure();
#endif
client.begin(MQTT_HOST, MQTT_PORT, net);
client.onMessage(messageReceived);
mqtt_connect();
Serial.print("Sender und Empfänger vorbereiten..");
mySwitch.enableReceive(PIN_EMPFAENGER); // Receiver on interrupt 0 => that is pin D3
mySwitch.enableTransmit(PIN_SENDER); // D1 PIN Sender 5
Serial.println(". Fertig!");
Serial.print("Setup Time ..");
setupTime();
Serial.println(". Done!");
}
void loop()
{
now = time(nullptr);
if (WiFi.status() != WL_CONNECTED)
{
Serial.print("Wlan verloren ");
while (WiFi.waitForConnectResult() != WL_CONNECTED)
{
WiFi.begin(ssid, pass);
Serial.print(".");
delay(10);
}
Serial.println("connected");
}
else
{
if (!client.connected())
{
Serial.println("Mqtt verbindung verloren");
mqtt_connect();
}
else
{
client.loop();
}
}
unsigned long jetzt = millis();
if (jetzt - lastMsg_tuer > 500) {
lastMsg_tuer = jetzt;
messung();
}
delay(100);
}