@sborg sagte in GPIO Status Wemos d1 mini an iobroker senden:
außerdem ist die "Punktnotation" nach ioB-Standard bei MQTT falsch
Was meinst du damit?
Ich benötige noch mal einen Tipp
Das Programm sieht jetzt so aus.
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <ESP8266WebServer.h>
#include <PubSubClient.h>
#include <AccelStepper.h>
#include <Adafruit_NeoPixel.h>
WiFiClient espClient;
PubSubClient mqttClient(espClient);
#ifndef STASSID
#define STASSID "----"
#define STAPSK "-----"
#endif
#define ProgrammstartTuerAuf D0
#define Enable D2 // Steppermotor aktivieren/deaktivieren
#define PIN 3 // Umgesteuerter GPIO für die NEO-Led
#define NUMPIXELS 1 // Anzal der LEDs
ESP8266WebServer server(80);
const char* ssid = STASSID;
const char* password = STAPSK;
char* mqtt_client_id = "Huehnerklappe";
const char* mqtt_server = "192.168.----";
const int mqtt_port = 1886;
const char* mqtt_user = "----";
const char* mqtt_password = "---------";
const byte pinTuerAuf = D6; // Endschalter Tür offen
const byte pinTuerZu = D5; // Endschalter Tür geschlossen
const byte pinTasterAuf = D0; // Taster Tür öffnen
const byte pinTasterZu = D7; // Taster Tür schließen
const byte pinTasterStopp = D1; // Taster Bewegung anhalten
const long SchritteUmdrehung = 200; // Schritte des Schrittmotors für 360 Grad der Tür
const unsigned int TuerbewegungZu = -15000;
const unsigned int TuerbewegungAuf = 15000;
enum ZUSTAENDE {MANUELL, TUERZU, OEFFNEN, TUERAUF, SCHLIESSEN};
byte zustand = MANUELL;
AccelStepper stepper(1, D3, D4); //Pins für den Steppermotor STEP , DIR
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
//GPIO Umsteuerung
//GPIO 1 (TX) swap the pin to a GPIO.
pinMode(1, FUNCTION_3);
//GPIO 3 (RX) swap the pin to a GPIO.
pinMode(3, FUNCTION_3);
Serial.begin(9600);
// Per WLAN mit dem Netzwerk verbinden
Serial.print("Verbinden mit ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
///////////////////////////////////////////
// Anfang Update über Wlan
///////////////////////////////////////////
ArduinoOTA.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH) {
type = "sketch";
} else { // U_FS
type = "filesystem";
}
// NOTE: if updating FS this would be the place to unmount FS using FS.end()
Serial.println("Start updating " + type);
});
ArduinoOTA.onEnd([]() {
Serial.println("\nEnd");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) {
Serial.println("Auth Failed");
} else if (error == OTA_BEGIN_ERROR) {
Serial.println("Begin Failed");
} else if (error == OTA_CONNECT_ERROR) {
Serial.println("Connect Failed");
} else if (error == OTA_RECEIVE_ERROR) {
Serial.println("Receive Failed");
} else if (error == OTA_END_ERROR) {
Serial.println("End Failed");
}
});
ArduinoOTA.begin();
///////////////////////////////////////////
// Ende Update über Wlan
///////////////////////////////////////////
// Die IP vom Webserver auf dem seriellen Monitor ausgeben
Serial.println("");
Serial.println("WLAN verbunden.");
Serial.println("IP Adresse: ");
Serial.println(WiFi.localIP());
connectToMQTT(); // Mit ioBroker Mqtt verbinden
server.onNotFound([](){
server.send(404, "text/plain", "Link wurde nicht gefunden!");
});
server.on("/", []() {
server.send(200, "text/plain", "Startseite");
});
server.on("/WebTuerAuf", []() {
server.send(200, "text/plain", "Tuer wird geoeffnet.");
WebTuerAuf();
});
server.on("/WebTuerZu", []() {
server.send(200, "text/plain", "Tuer wird geschlossen.");
WebTuerZu();
});
server.begin();
Serial.println("Webserver gestartet.");
pixels.begin(); // This initializes the NeoPixel library.
Serial.println("Programmanfang");
pinMode(PIN, OUTPUT); // NEO-LED
pinMode(pinTuerAuf, INPUT_PULLUP); // Endschalter Tür offen
pinMode(pinTuerZu, INPUT_PULLUP); // Endschalter Tür geschlossen
pinMode(pinTasterAuf, INPUT_PULLUP); // Taster Tür öffnen
pinMode(pinTasterZu, INPUT_PULLUP); // Taster Tür schließen
pinMode(pinTasterStopp, INPUT_PULLUP); // Taster Bewegung anhalten
pinMode(ProgrammstartTuerAuf, OUTPUT);
stepper.setMaxSpeed(1000);
stepper.setAcceleration(1500);
pinMode(Enable, OUTPUT); // Enable Motor 1
}
void loop() {
ArduinoOTA.handle();
ArduinoOTA.setHostname("Huehnerklappe");
server.handleClient();
mqttClient.loop();
digitalWrite(Enable, LOW); //Motor aktiviert
stepper.run();
digitalWrite(ProgrammstartTuerAuf, digitalRead(pinTuerAuf));
if (!digitalRead(pinTasterStopp)) {
zustand = MANUELL;
pixels.setPixelColor(0, pixels.Color(255,255,255)); //LED Farbe weiss
pixels.show();
}
switch (zustand) {
// Manuelle Steuerung
case MANUELL:
if ((!digitalRead(pinTasterAuf)) && (digitalRead(pinTuerAuf))) {
stepper.move(10);
} else if ((!digitalRead(pinTasterZu)) && (digitalRead(pinTuerZu))) {
stepper.move(-10);
} else {
stopp();
}
if (!digitalRead(pinTuerZu)) {
zustand = TUERZU;
Serial.println("Tuer geschlossen");
}
if (!digitalRead(pinTuerAuf)) {
zustand = TUERAUF;
Serial.println("Tuer geoeffnet");
}
break;
// Tür wird geöffnet
case TUERZU:
stopp();
if (!digitalRead(pinTasterAuf)) {
stepper.move(pos(TuerbewegungAuf));
zustand = OEFFNEN;
Serial.print("Tuer oeffnet ... ");
pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau
pixels.show();
// Schaltzustände übermitteln
if(digitalRead(pinTuerAuf) == HIGH){
mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "1");
mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0");
}
}
break;
// Tür ist offen
case OEFFNEN:
if (!digitalRead(pinTuerAuf)) {
zustand = TUERAUF;
Serial.println("Tuer geoeffnet");
pixels.setPixelColor(0, pixels.Color(255,0,0)); //LED Farbe rot
pixels.show();
// Schaltzustände übermitteln
if(digitalRead(pinTuerAuf) == LOW){
mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "1");
mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0");
}
}
break;
// Tür wir geschlossen
case TUERAUF:
stopp();
if (!digitalRead(pinTasterZu)) {
stepper.move(pos(TuerbewegungZu));
zustand = SCHLIESSEN;
Serial.print("Tuer schliesst ... ");
pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau
pixels.show();
// Schaltzustände übermitteln
if(digitalRead(pinTuerZu) == HIGH){
mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "1");
mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0");
}
}
break;
// Tür ist geschlossen
case SCHLIESSEN:
if (!digitalRead(pinTuerZu)) {
zustand = TUERZU;
Serial.println("Tuer geschlossen");
pixels.setPixelColor(0, pixels.Color(0, 255,0)); //LED Farbe grün
pixels.show();
// Schaltzustände übermitteln
if(digitalRead(pinTuerZu) == LOW){
mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "1");
}
}
break;
}
}
long pos(int winkel) {
return (winkel * SchritteUmdrehung / 360L);
}
void WebTuerAuf(){
stepper.move(pos(TuerbewegungAuf));
zustand = OEFFNEN;
Serial.print("Tuer oeffnet ... ");
// Schaltzustände übermitteln
if(digitalRead(pinTuerAuf) == HIGH){
mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "1");
mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0");
}
// Schaltzustände übermitteln
if(digitalRead(pinTuerAuf) == LOW){
mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "1");
mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0");
}
pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau
pixels.show();
}
void WebTuerZu(){
stepper.move(pos(TuerbewegungZu));
zustand = SCHLIESSEN;
Serial.print("Tuer schliesst ... ");
// Schaltzustände übermitteln
if(digitalRead(pinTuerZu) == HIGH){
mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "1");
mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0");
}
// Schaltzustände übermitteln
if(digitalRead(pinTuerZu) == LOW){
mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "1");
}
pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau
pixels.show();
}
void stopp() {
stepper.stop();
digitalWrite(Enable, HIGH); //Motor deaktiviert
}
// MQTT Funktion
// *************
void connectToMQTT() {
mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port
mqttClient.subscribe("Huehnertuer/Innen");
if (mqttClient.connect(mqtt_client_id , mqtt_user, mqtt_password)) {
Serial.println("Per MQTT mit ioBroker verbunden");
}
else {
Serial.print("failed with state ");
Serial.print(mqttClient.state());
delay(2000);
}
}
Soweit funktioniert auch alles.
Was sich jetzt natürlich anbietet ist, das die http-Kommandos durch mqtt-Befehle ersetzt werden könnten.
Ich habe da auch schon rumprobiert, aber ich verstehe es einfach nicht.
Was muß ich unter ioBroker machen?
Ich hatte dieses hier schon mal eingefügt:
void callback(char* topic, byte* payload, unsigned int length)
{
payload[length] = '\0';
String strTopic = String(topic);
String strPayload = String((char * ) payload);
if(strTopic == "Tuer")
{
if(strPayload == "false")
Serial.println(strPayload);
{
digitalWrite(pinTasterZu, LOW);
}
if(strPayload == "true")
Serial.println(strPayload);
{
digitalWrite(pinTasterAuf, LOW);
}
}
}
und weiter unten dieses hier
void connectToMQTT() {
mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port
mqttClient.subscribe("Huehnertuer");
if (mqttClient.connect(mqtt_client_id , mqtt_user, mqtt_password)) {
Serial.println("connected");
}
else {
Serial.print("failed with state ");
Serial.print(mqttClient.state());
delay(2000);
}
Ich komme da aber nicht weiter.
Eine einfache Anleitung wäre event. nicht schlecht.
Grüße
@beowolf Erwähnte ich schon, dass meine Arduino-Tage schon etwas her sind?
@beowolf sagte in GPIO Status Wemos d1 mini an iobroker senden:
Eine einfache Anleitung wäre event. nicht schlecht.
...und der ist mal so richtig gut. "Einfach" ...
IMO bist du aber fast am Ziel. Du hast zwar den "callback" definiert, "hörst" aber nirgends auf ihn. Sprich der ioB schickt dir den MQTT-Request, der ESP reagiert aber gar nicht drauf.
void connectToMQTT() {
mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port
mqttClient.subscribe("Huehnertuer");
ändern/hinzufügen
void connectToMQTT() {
mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port
mqttClient.setCallback(callback);
mqttClient.subscribe("Huehnertuer");
So richtig geht das noch nicht.
Ich habe unter ioBroker das eingestellt:
Bei den Objekten dieses hier.
Im Programm dieses hier:
// MQTT Funktion
// *************
void connectToMQTT() {
mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port
mqttClient.setCallback(callback);
mqttClient.subscribe("mqtt.0.Huehnertuer.Innen.Tuer");
if (mqttClient.connect(mqtt_client_id , mqtt_user, mqtt_password)) {
Serial.println("Per MQTT mit ioBroker verbunden");
}
else {
Serial.print("failed with state ");
Serial.print(mqttClient.state());
delay(2000);
}
}
void callback(char* topic, byte* payload, unsigned int length)
{
payload[length] = '\0';
String strTopic = String(topic);
String strPayload = String((char * ) payload);
if(strTopic == "mqtt.0.Huehnertuer.Innen.Tuer")
{
if(strPayload == "false") // Tuer schliessen
Serial.println(strPayload);
{
digitalWrite(pinTasterZu, LOW);
}
if(strPayload == "true") // Tuer öffnen
Serial.println(strPayload);
{
digitalWrite(pinTasterAuf, LOW);
}
}
}
Bin zwar auch nicht, der Nerd, aber wenn du den Pin für schließen setzt. Musst du ihn nicht wieder zurück setzen und dann den Pin für das öffnen? Sonst stehen doch beide an oder sehe ich das falsch?
Bis jetzt kann ich noch nicht einmal eine Reaktion am Wemos feststellen. Beide Eingänge sind normalerweise auf "high". Für die manuelle Steuerung sind vor Ort zwei Taster die die Eingänge jeweils auf "low" tasten.
Selbst wenn ich sie per mqtt auf "low" setzte und sie dort bleiben, sollte ja eine Reaktion folgen.
Ich bin mir nicht sicher ob ich den Datenpunkt unter ioBroker so richtig erzeugt habe, sodas der Wemos das mitbekommt.
Ich habe auch noch kein Beispiel im Netz gefunden, in dem es genau beschrieben wird wie das Zusammenspiel läuft.
Also - mache unter ioBroker genau das und frage so und so ab.
@beowolf
Ich versuche es mal auf meinem Elektronik board die Tage mal nachzubauen. Dann teste ich dein Programm mal parallel.
Gruß Tom
@Beowolf Kannst du das aktuelle script mal posten, damit ich's laden kann.
Das ist der aktuelle Code
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <ESP8266WebServer.h>
#include <PubSubClient.h>
#include <AccelStepper.h>
#include <Adafruit_NeoPixel.h>
WiFiClient espClient;
PubSubClient mqttClient(espClient);
#ifndef STASSID
#define STASSID "----"
#define STAPSK "------------"
#endif
#define ProgrammstartTuerAuf D0
#define Enable D2 // Steppermotor aktivieren/deaktivieren
#define PIN 3 // Umgesteuerter GPIO für die NEO-Led
#define NUMPIXELS 1 // Anzal der LEDs
ESP8266WebServer server(80);
const char* ssid = STASSID;
const char* password = STAPSK;
char* mqtt_client_id = "Huehnerklappe";
const char* mqtt_server = "192.168.---------";
const int mqtt_port = 1886;
const char* mqtt_user = "----------";
const char* mqtt_password = "----------------";
const byte pinTuerAuf = D6; // Endschalter Tür offen
const byte pinTuerZu = D5; // Endschalter Tür geschlossen
const byte pinTasterAuf = D0; // Taster Tür öffnen
const byte pinTasterZu = D7; // Taster Tür schließen
const byte pinTasterStopp = D1; // Taster Bewegung anhalten
const long SchritteUmdrehung = 200; // Schritte des Schrittmotors für 360 Grad der Tür
const unsigned int TuerbewegungZu = 61000;
const unsigned int TuerbewegungAuf = -61000;
enum ZUSTAENDE {MANUELL, TUERZU, OEFFNEN, TUERAUF, SCHLIESSEN};
byte zustand = MANUELL;
AccelStepper stepper(1, D3, D4); //Pins für den Steppermotor STEP , DIR
AccelStepper stepperauf(1, D3, D4); //Pins für den Steppermotor STEP , DIR
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
//GPIO Umsteuerung
//GPIO 1 (TX) swap the pin to a GPIO.
pinMode(1, FUNCTION_3);
//GPIO 3 (RX) swap the pin to a GPIO.
pinMode(3, FUNCTION_3);
Serial.begin(9600);
// Per WLAN mit dem Netzwerk verbinden
Serial.print("Verbinden mit ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
///////////////////////////////////////////
// Anfang Update über Wlan
///////////////////////////////////////////
ArduinoOTA.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH) {
type = "sketch";
} else { // U_FS
type = "filesystem";
}
// NOTE: if updating FS this would be the place to unmount FS using FS.end()
Serial.println("Start updating " + type);
});
ArduinoOTA.onEnd([]() {
Serial.println("\nEnd");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) {
Serial.println("Auth Failed");
} else if (error == OTA_BEGIN_ERROR) {
Serial.println("Begin Failed");
} else if (error == OTA_CONNECT_ERROR) {
Serial.println("Connect Failed");
} else if (error == OTA_RECEIVE_ERROR) {
Serial.println("Receive Failed");
} else if (error == OTA_END_ERROR) {
Serial.println("End Failed");
}
});
ArduinoOTA.begin();
///////////////////////////////////////////
// Ende Update über Wlan
///////////////////////////////////////////
// Die IP vom Webserver auf dem seriellen Monitor ausgeben
Serial.println("");
Serial.println("WLAN verbunden.");
Serial.println("IP Adresse: ");
Serial.println(WiFi.localIP());
connectToMQTT(); // Mit ioBroker Mqtt verbinden
server.onNotFound([](){
server.send(404, "text/plain", "Link wurde nicht gefunden!");
});
server.on("/", []() {
server.send(200, "text/plain", "Startseite");
});
server.on("/WebTuerAuf", []() {
server.send(200, "text/plain", "Tuer wird geoeffnet.");
WebTuerAuf();
});
server.on("/WebTuerZu", []() {
server.send(200, "text/plain", "Tuer wird geschlossen.");
WebTuerZu();
});
server.begin();
Serial.println("Webserver gestartet.");
pixels.begin(); // This initializes the NeoPixel library.
Serial.println("Programmanfang");
pinMode(PIN, OUTPUT); // NEO-LED
pinMode(pinTuerAuf, INPUT_PULLUP); // Endschalter Tür offen
pinMode(pinTuerZu, INPUT_PULLUP); // Endschalter Tür geschlossen
pinMode(pinTasterAuf, INPUT_PULLUP); // Taster Tür öffnen
pinMode(pinTasterZu, INPUT_PULLUP); // Taster Tür schließen
pinMode(pinTasterStopp, INPUT_PULLUP); // Taster Bewegung anhalten
pinMode(ProgrammstartTuerAuf, OUTPUT);
stepper.setMaxSpeed(1000);
stepperauf.setMaxSpeed(6000);
stepper.setAcceleration(1500);
stepperauf.setAcceleration(6000);
pinMode(Enable, OUTPUT); // Enable Motor 1
}
void loop() {
ArduinoOTA.handle();
ArduinoOTA.setHostname("Huehnerklappe");
server.handleClient();
mqttClient.loop();
digitalWrite(Enable, LOW); //Motor aktiviert
stepper.run();
stepperauf.run();
digitalWrite(ProgrammstartTuerAuf, digitalRead(pinTuerAuf));
if (!digitalRead(pinTasterStopp)) {
zustand = MANUELL;
pixels.setPixelColor(0, pixels.Color(255,255,255)); //LED Farbe weiss
pixels.show();
}
switch (zustand) {
// Manuelle Steuerung
case MANUELL:
if ((!digitalRead(pinTasterAuf)) && (digitalRead(pinTuerAuf))) {
stepper.move(10);
} else if ((!digitalRead(pinTasterZu)) && (digitalRead(pinTuerZu))) {
stepper.move(-10);
} else {
stopp();
}
if (!digitalRead(pinTuerZu)) {
zustand = TUERZU;
Serial.println("Tuer geschlossen");
}
if (!digitalRead(pinTuerAuf)) {
zustand = TUERAUF;
Serial.println("Tuer geoeffnet");
}
break;
// Tür wird geöffnet
case TUERZU:
stopp();
if (!digitalRead(pinTasterAuf)) {
stepperauf.move(pos(TuerbewegungAuf));
zustand = OEFFNEN;
Serial.print("Tuer oeffnet ... ");
pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau
pixels.show();
// Schaltzustände übermitteln
if(digitalRead(pinTuerAuf) == HIGH){
mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "1");
mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0");
}
}
break;
// Tür ist offen
case OEFFNEN:
if (!digitalRead(pinTuerAuf)) {
zustand = TUERAUF;
Serial.println("Tuer geoeffnet");
pixels.setPixelColor(0, pixels.Color(255,0,0)); //LED Farbe rot
pixels.show();
// Schaltzustände übermitteln
if(digitalRead(pinTuerAuf) == LOW){
mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "1");
mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0");
}
}
break;
// Tür wir geschlossen
case TUERAUF:
stopp();
if (!digitalRead(pinTasterZu)) {
stepper.move(pos(TuerbewegungZu));
zustand = SCHLIESSEN;
Serial.print("Tuer schliesst ... ");
pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau
pixels.show();
// Schaltzustände übermitteln
if(digitalRead(pinTuerZu) == HIGH){
mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "1");
mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0");
}
}
break;
// Tür ist geschlossen
case SCHLIESSEN:
if (!digitalRead(pinTuerZu)) {
zustand = TUERZU;
Serial.println("Tuer geschlossen");
pixels.setPixelColor(0, pixels.Color(0, 255,0)); //LED Farbe grün
pixels.show();
// Schaltzustände übermitteln
if(digitalRead(pinTuerZu) == LOW){
mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "1");
}
}
break;
}
}
long pos(int winkel) {
return (winkel * SchritteUmdrehung / 360L);
}
void WebTuerAuf(){
stepperauf.move(pos(TuerbewegungAuf));
zustand = OEFFNEN;
Serial.print("Tuer oeffnet ... ");
// Schaltzustände übermitteln
if(digitalRead(pinTuerAuf) == HIGH){
mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "1");
mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0");
}
// Schaltzustände übermitteln
if(digitalRead(pinTuerAuf) == LOW){
mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "1");
mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0");
}
pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau
pixels.show();
}
void WebTuerZu(){
stepper.move(pos(TuerbewegungZu));
zustand = SCHLIESSEN;
Serial.print("Tuer schliesst ... ");
// Schaltzustände übermitteln
if(digitalRead(pinTuerZu) == HIGH){
mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "1");
mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0");
}
// Schaltzustände übermitteln
if(digitalRead(pinTuerZu) == LOW){
mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "1");
}
pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau
pixels.show();
}
void stopp() {
stepper.stop();
digitalWrite(Enable, HIGH); //Motor deaktiviert
}
// MQTT Funktion
// *************
void connectToMQTT() {
mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port
mqttClient.setCallback(callback);
mqttClient.subscribe("mqtt.0.Huehnertuer.Innen.Tuer");
if (mqttClient.connect(mqtt_client_id , mqtt_user, mqtt_password)) {
Serial.println("Per MQTT mit ioBroker verbunden");
}
else {
Serial.print("failed with state ");
Serial.print(mqttClient.state());
delay(2000);
}
}
void callback(char* topic, byte* payload, unsigned int length)
{
payload[length] = '\0';
String strTopic = String(topic);
String strPayload = String((char * ) payload);
if(strTopic == "mqtt.0.Huehnertuer.Innen.Tuer")
{
if(strPayload == "false") // Tuer schliessen
Serial.println(strPayload);
{
digitalWrite(pinTasterZu, LOW);
}
if(strPayload == "true") // Tuer öffnen
Serial.println(strPayload);
{
digitalWrite(pinTasterAuf, LOW);
}
}
}
Danke für die Hilfe
@beowolf sagte in GPIO Status Wemos d1 mini an iobroker senden:
mqtt.0.Huehnertuer.Innen.Tuer
Deine Subscribes/strTopics sind noch falsch. Weder der Adaptername noch die Instanz dürfen da hinein, außerdem ist die "Punktnotation" nach ioB-Standard bei MQTT falsch
zB:
mqttClient.subscribe("Huehnertuer/Innen/Tuer");
Ich würde mir im Serial-Monitor auch mal den MQTT-Request ausgeben lassen, da sieht man ob überhaupt was beim ESP ankommt. Hier mal der "callback" eines alten Sketches von mir (inkl. der Ausgabe per Serial-Monitor):
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] : ");
String Topic = String(topic);
char msg[length+1];
for (unsigned int i=0;i<length;i++) {
Serial.print((char)payload[i]);
msg[i] = (char)payload[i];
}
msg[length] = '\0';
Serial.println();
//Zirkulation?
if (strcmp(topic,"cmnd/HeizCon/WW-Zirkulation")==0) {
if(strcmp(msg,"true")==0) {
digitalWrite(STATUS_LED, LOW); //Low=On
delay(3000);
digitalWrite(STATUS_LED, HIGH);
mqtt_client.publish(Topic.c_str(), "false", true); //clear WWZ_state
}
}
} //############################################################################
@sborg sagte in GPIO Status Wemos d1 mini an iobroker senden:
außerdem ist die "Punktnotation" nach ioB-Standard bei MQTT falsch
Was meinst du damit?
@beowolf Das Ordner und der Datenpunkt mittels "Punkt" getrennt werden:
falsch
Huehnertuer.Innen.Tuer
bei MQTT richtig
Huehnertuer/Innen/Tuer
@beowolf sagte in GPIO Status Wemos d1 mini an iobroker senden:
das ist der aktuelle Code
kannst du mir bitte mal die Bibliotheken nennen die du genutzt hast für "PubSubClient.h" und "AccelStepper.h" die Auswahl ist zu groß um die richtige zu erwischen. Danke
@tt-tom said in GPIO Status Wemos d1 mini an iobroker senden:
bitte mal die Bibliotheken nennen
und wahrscheinlich auch die genauen Versionen dazu, ebenso wie die verwendete arduino framework version. Ob dann reproduzierbare Ergebnisse möglich sind? Wer weiß das schon, probieren geht bekanntlich über studieren!
@beowolf sagte in GPIO Status Wemos d1 mini an iobroker senden:
if(digitalRead(pinTuerAuf) == HIGH){
mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "1");
mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0");
}
Nur so eine kleine Idee:
Anstatt 4 verschiedene Topics würde ich hier einen Topic "Huehnertuer/Innen/Tuer_Status" mit 4 verschiednenen Ausprägungen (oeffnet, auf, schliesst, zu) übermitteln.
Das geht dann ja anstatt "0" und "1 sogar im Klartext und kann sofort so in der Visu ausgegeben werden.
Falls Du mit den Flags noch etwas anderes in ioBroker bewirken willst, dann eben mit 1-4 (oder 0-3, oder so).
Also für PubSubClient habe die PubSubClient by Nick O'Leary Version 2.8.0
Und für accelstepper habe ich die von der Homepage genommen. AccelStepper-1.61.
Als ZIP-Datei eingebunden.
Arduino ist 1.8.13
Grüße
Manfred
@andreas-5 sagte in GPIO Status Wemos d1 mini an iobroker senden:
@beowolf sagte in GPIO Status Wemos d1 mini an iobroker senden:
if(digitalRead(pinTuerAuf) == HIGH){
mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "1");
mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0");
mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0");
}Nur so eine kleine Idee:
Anstatt 4 verschiedene Topics würde ich hier einen Topic "Huehnertuer/Innen/Tuer_Status" mit 4 verschiednenen Ausprägungen (oeffnet, auf, schliesst, zu) übermitteln.
Das geht dann ja anstatt "0" und "1 sogar im Klartext und kann sofort so in der Visu ausgegeben werden.
Falls Du mit den Flags noch etwas anderes in ioBroker bewirken willst, dann eben mit 1-4 (oder 0-3, oder so).
Das werde ich mal versuchen. Im Moment behalte ich so aber besser den Überblick.
Danke für den Hinweis.
Gibe es denn keine kleine Anleitung in der das für Dummis steht?
Also etwas so:
Erzeuge unter ioBroker so einen Eintrag und so muß es das in einem Sketch abgefragt werden.
Ich habe soetwas noch nicht gefunden.
Grüße
Manfred
@beowolf said in GPIO Status Wemos d1 mini an iobroker senden:
Gibe es denn keine kleine Anleitung in der das für Dummis steht?
Ich denke das gibt es nicht oder wenn, nur sehr veraltet.
Ich habe soetwas noch nicht gefunden.
Wer das Rad nicht neu erfinden will wird einfach auf eine fertige Lösung wie esphome, tasmota, espeasy etc. setzen
Grüße
PS:
Ich weiß das Du esphome toll findest. Du kennst mein Skript - setzte das doch mal eben ganz einfach in esphome um und poste das hier. Ich probiere das dann aus.
@opensourcenomad sagte in GPIO Status Wemos d1 mini an iobroker senden:
@beowolf said in GPIO Status Wemos d1 mini an iobroker senden:
Gibe es denn keine kleine Anleitung in der das für Dummis steht?
Ich denke das gibt es nicht oder wenn, nur sehr veraltet.
Ich habe soetwas noch nicht gefunden.
Wer das Rad nicht neu erfinden will wird einfach auf eine fertige Lösung wie esphome, tasmota, espeasy etc. setzen
Naja, es gibt zwar keine Anleitung, aber ich habe nicht auf eine fertige Lösung zurückgegriffen!
Grund:
Ein Teil meines Programms auf dem Arduino sollte autark funktionieren, nämlich der Teil, der die Zisterne nachfüllt. Da ich damit auch die Waschmaschine und die Toiletten betreibe, wäre es blöd, wenn die Nachfüllung nicht funktioniert, nur weil ich wieder im ioBroker "herumgespielt" habe.
Zisternendaten, wie der Wasserstand oder das Flag "Nachfüllen läuft" wird per MQTT übermittelt.
Ein anderer Teil des Programm schaltet Beleuchtung und Außen-Steckdosen und diese werden über ioBroker gesteuert.
Also das senden und Empfangen zwischen ioBoker und Arduino funktioniert in beide Richtungen.
Leider kann ich aktuell nichts nachsehen, da ich nicht zu Hause bin, aber ich kann da schon noch etwas zu beisteuern. Ich denke, andere Benutzer auch.
Allerdings habe ich bei MQTT den Eindruck, dass die Verbindung nach einer Zeit (Mehrere Tage) irgendwann verlorden geht. Obwohl ich zyklisch versuche, diese wieder aufzubauen, kommt keine Verbindung mehr zustande.
Neustart des Arduino hilft.
Mein MQTT-Server läuft auf einem anderen Rechner, als der ioBroker, diesen habe ich schon seit Monaten (Jahren?) nicht wegen Problemen neu gestartet.
btw: Demnächst werde ich den Zisternen-Teil exklusiv auf einen Arduino (oder so) umbauen, damit kein anderer Teil des Programms da noch stören kann.
@beowolf said in GPIO Status Wemos d1 mini an iobroker senden:
Du führst "nicht wirklich Zeit dafür" als Grund an "das Rad neu zu erfinden" (an dem du jetzt bereits seit einer Woche nagst), finde den Fehler
Du kennst mein Skript - setzte das doch mal eben ganz einfach in esphome um
Leider habe ich keine Programmierkenntnisse und weiß nicht was dein Skript alles macht, kannst das ja mal versuchen in ein paar Sätzen zu beschreiben.
@andreas-5 said in GPIO Status Wemos d1 mini an iobroker senden:
Grund:
Ein Teil meines Programms auf dem Arduino sollte autark funktionieren
Genau (auch) aus diesem Grund verwende ich überall esphome! So habe ich garantiert das alle "Basisfunktionen" immer funktionieren, egal ob die Zentrale bzw. das WLAN gerade erreichbar ist oder nicht.
https://esphome.io/guides/automations.html#do-automations-work-without-a-network-connection
btw: Demnächst werde ich den Zisternen-Teil exklusiv auf einen Arduino (oder so) umbauen, damit kein anderer Teil des Programms da noch stören kann.
Das riecht ja nach esphome, wenn es denn ein esp ist
@opensourcenomad
Könnten wir diese Diskussion hier bitte lassen!
Entweder hast Du eine brauchbare Hilfe/Lösung (ein komplett anderes System ist dabei keine Lösung), oder einfach die Finger von der Tastatur nehmen. OK?
@beowolf said in GPIO Status Wemos d1 mini an iobroker senden:
Entweder hast Du eine brauchbare Hilfe/Lösung
Ich hatte dir im letzten Post erst Hilfe angeboten wenn du mir beschreiben kannst was dein Aufbau überhaupt macht bzw. machen soll.
Mit ziemlicher Sicherheit kann esphome dein Szenario abdecken, im discord macht manch einer noch ganz andere Dinge im Hühnerstall . So hatte jemand seinen Hühnern gleich RFID-Tags
spendiert um die Hühnertür mit Einlasskontrolle
auch tagsüber immer geschlossen
zu haben wenn gerade niemand
rein/raus muss. Eine andere Person hatte sich eine "Autofütterung"
mit Füllhöhenmessung
gebaut um nur noch ab und an das Trockenfutter
nachfüllen zu müssen. Die Möglichkeiten sind de facto Grenzlos
Hier hat z.B. jemand seinen
Solarhühnerstall mit
Türautomatik und weiterer Sensorik veredelt
ein komplett anderes System ist dabei keine Lösung
Mit Sicherheit ist es leichter mit der native api von esphome zu arbeiten, aber mqtt wird ja auch noch voll Unterstützt. Sprich deine Hardware ist die gleiche und von Seiten der Zentrale wäre auch alles gleich wenn du noch auf mqtt setzen willst (wenn das denn die Vorgabe ist? ).
oder einfach die Finger von der Tastatur nehmen. OK?
Da muss ich dich leider enttäuschen, eine Zensur findet bekanntermaßen nicht statt
Deinen Schmerz verstehe ich aber übrigens nur zu gut, ich habe mich vor vielen Jahren auch viel zu lange (damals schlicht aus Mangel an Alternativen) mit arduino, platformio aber auch tasmota aufgehalten. Es war für mich immer total frustrierend das die dickste Nuss die zu knacken ist schlicht die software bzw. deren (auf 5 Ecken verteilte) Einstellungen waren. Glücklicherweise ist mit esphome diese Komplexität (für mich) Geschichte und ich kann meine Zeit nun sinnvoll nutzen
Ok, dann versuche ist es so.
Die Hühnertür soll zu einer bestimmten Zeit auf gehen, und zu einer anderen Zeit wieder schliessen.
Die Tür selber wird per Steppermotor angetrieben. Die jeweiligen Endpunkte sind Reedkontakte.
Eine ws2412 LED zeigt noch den Zustand der Tür an (für den schnellen Blick durch das Küchenfenster).
Die Steuerung wollte durch ioBroker machen.
Die Anschlüsse:
D6; // Endschalter Tür offen
D5; // Endschalter Tür geschlossen
D0; // Taster Tür öffnen - für manuelles Öffnen vor Ort
D7; // Taster Tür schließen - für schließen vor Ort
D1; // Taster Bewegung anhalten - Lichtschranke falls sich ein Huhn im Türbereich aufhält.
D2 // Steppermotor aktivieren/deaktivieren
PIN 3 // Umgesteuerter GPIO für die NEO-Led (kann das ESPHome auch?)
Diese "Umateuerung" wir mit Arduino so gemacht:
//GPIO Umsteuerung
//GPIO 1 (TX) swap the pin to a GPIO.
pinMode(1, FUNCTION_3);
//GPIO 3 (RX) swap the pin to a GPIO.
pinMode(3, FUNCTION_3);
D3, D4; //Pins für den Steppermotor STEP , DIR
Ich glaube das war´s
Alles ist an einem Wemos D1 mini angeschlossen.
Kannst Du etwas damit machen?
So, ich habe jetzt mal esphome installiert.
Ich habe mir dieses kleine Programm gemacht.
esphome:
name: led
esp8266:
board: d1_mini
# Enable logging
logger:
ota:
password: "1234"
wifi:
ssid: "----"
password: "----------------"
web_server:
port: 80
captive_portal:
# Example configuration entry
light:
- platform: neopixelbus
type: GRB
variant: WS2811
pin: GPIO3
num_leds: 1
name: "NeoPixel Light"
per Browser kann ich die LED schalten.
Das sind die Probleme die ich meine.
@beowolf said in GPIO Status Wemos d1 mini an iobroker senden:
Kannst Du etwas damit machen?
Mit Sicherheit, von unten nach oben
Wemos D1
esphome:
name: Hühnerstall
esp8266:
board: d1_mini
https://esphome.io/components/esphome.html
https://esphome.io/components/esp8266.html
D3, D4; //Pins für den Steppermotor STEP , DIR
wahrscheinlich ein a4988
?
stepper:
- platform: a4988
id: motor
step_pin: D3
dir_pin: D4
https://esphome.io/components/stepper/index.html#a4988-component
Wahrscheinlich willst du noch ein "cover" daraus machen? https://esphome.io/components/cover/endstop.html
PIN 3 // Umgesteuerter GPIO für die NEO-Led (kann das ESPHome auch?)
Pin 3 ist eigentlich RX um diesen nicht (default) als hardware serial zu verwenden ist folgende Zeile im logger nötig:
logger:
baud_rate: 0 # 0 to disable logging via hardware UART.
https://esphome.io/components/logger.html
light:
- platform: neopixelbus
type: GRB
variant: WS2811
pin: GPIO3
num_leds: 1
id: led
https://esphome.io/components/light/neopixelbus.html
D6; // Endschalter Tür offen
D5; // Endschalter Tür geschlossen
D0; // Taster Tür öffnen - für manuelles Öffnen vor Ort
D7; // Taster Tür schließen - für schließen vor Ort
D1; // Taster Bewegung anhalten - Lichtschranke falls sich ein Huhn im Türbereich aufhält.
D2 // Steppermotor aktivieren/deaktivieren
Und das sind soweit alles "Eingänge", bei esphome also binary sensors.
binary_sensor:
- platform: gpio
pin: D6
name: "Tür offen"
- platform: gpio
pin: D5
name: "Tür geschlossen"
- ...
https://esphome.io/components/binary_sensor/gpio.html
Eine ws2412 LED zeigt noch den Zustand der Tür an (für den schnellen Blick durch das Küchenfenster).
und hier kommt schon die esphome magie in's Spiel, einfach an den beiden binary sensoren von gerade eben die gewünschte funktion anhängen:
binary_sensor:
- platform: gpio
pin: D6
name: "Tür offen"
on_press:
then:
- light.turn_on:
id: led
brightness: 100%
red: 100%
green: 0
blue: 0
on_release:
then:
- light.turn_off:
id: led
- platform: gpio
pin: D5
name: "Tür geschlossen"
on_press:
then:
- light.turn_on:
id: led
brightness: 100%
red: 0%
green: 100%
blue: 0
on_release:
then:
- light.turn_off:
id: led
https://esphome.io/components/binary_sensor/index.html#binary-sensor-automation
Die Steuerung wollte durch ioBroker machen.
Dann musst du dich eigentlich nur noch für die native api or mqtt entscheiden und solltest den rest über die Zentrale automatisieren können
@beowolf said in GPIO Status Wemos d1 mini an iobroker senden:
Das sind die Probleme die ich meine.
Ich sehe nur einen Fehler in deinen screenshots, wenn ich diesen google finde ich folgendes issues:
Sprich das sieht aus als ob es ein Fehler im iobroker adapter ist, sollte aber schon gelöst sein
Welche Version von esphome (dashboard) ist denn genau im Adapter installiert? Aktuell sollte 2022.05.0 sein
Dein erster esphome node läuft ja schon wie man dem letzten screen shot entnehmen kann Gratulation
Jepp ist die Version 2022.5.0.
Ich habe meinen pi4 update und upgrade gemacht. Jetzt scheint die Meldung weg zu sein.
Bin dran
@beowolf said in GPIO Status Wemos d1 mini an iobroker senden:
Jetzt scheint die Meldung weg zu sein.
Wobei du auch keine api:
oder mqtt
Zeile in deiner yaml hattest, mit der Zentrale zu kommunizieren ist dann eigentlich unmöglich
api habe ich
Ich habe das jetzt mal zusammen gebastelt.
esphome:
name: led
esp8266:
board: d1_mini
stepper:
- platform: a4988
id: motor
step_pin: D3
dir_pin: D4
max_speed: 250 steps/s
# Enable logging
logger:
baud_rate: 0 # 0 to disable logging via hardware UART.
api:
password: "1234"
ota:
password: "1234"
wifi:
ssid: "----"
password: "--------"
web_server:
port: 80
captive_portal:
# Example configuration entry
light:
- platform: neopixelbus
type: GRB
variant: WS2811
pin: GPIO3
num_leds: 1
id: led
binary_sensor:
- platform: gpio
pin: D6
name: "Tür offen"
- platform: gpio
pin: D5
name: "Tür geschlossen"
- platform: gpio
pin: D0
name: "Taster Tür öffnen"
- platform: gpio
pin: D7
name: "Taster Tür schließen"
- platform: gpio
pin: D1
name: "Taster Bewegung anhalten"
- platform: gpio
pin: D2
name: "Steppermotor aktivieren/deaktivieren"
binary_sensor:
- platform: gpio
pin: D6
name: "Tür offen"
on_press:
then:
- light.turn_on:
id: led
brightness: 100%
red: 100%
green: 0
blue: 0
on_release:
then:
- light.turn_off:
id: led
- platform: gpio
pin: D5
name: "Tür geschlossen"
on_press:
then:
- light.turn_on:
id: led
brightness: 100%
red: 0%
green: 100%
blue: 0
on_release:
then:
- light.turn_off:
id: led
Als Meldung bekomme ich das.
Das sagt mir das es eine doppelte Bezeichnung gibt, richtig?
@beowolf said in GPIO Status Wemos d1 mini an iobroker senden:
Das sagt mir das es eine doppelte Bezeichnung gibt, richtig?
Genau, Zeile 72
und Zeile 45
haben beide binary_sensor:
, nach yaml "Regel" dürfen diese aber nur einmal vorkommen, du musst also beide Inhalte unter einem binary_sensor:
zusammen fassen. Bezüglich der Reihenfolge ist man aber völlig frei.
Ich habe noch mal etwas probiert.
esphome:
name: led
esp8266:
board: d1_mini
stepper:
- platform: a4988
id: motor
step_pin: D3
dir_pin: D4
max_speed: 250 steps/s
sleep_pin: D2
acceleration: inf
deceleration: inf
# Enable logging
logger:
baud_rate: 0 # 0 to disable logging via hardware UART.
api:
password: "1234"
ota:
password: "1234"
wifi:
ssid: "---"
password: "-------"
web_server:
port: 80
captive_portal:
# Example configuration entry
light:
- platform: neopixelbus
type: GRB
variant: WS2811
pin: GPIO3
num_leds: 1
id: led
name: "LED"
binary_sensor:
- platform: gpio
pin:
number: D0
inverted: true
mode:
input: true
name: "Taster Tür öffnen"
on_state:
then:
- stepper.set_target:
id: motor
target: 250
- platform: gpio
pin:
number: D7
inverted: true
mode:
input: true
pullup: true
name: "Taster Tür schließen"
on_state:
then:
- stepper.set_target:
id: motor
target: -250
- platform: gpio
pin:
number: D1
inverted: true
mode:
input: true
pullup: true
name: "Taster Bewegung anhalten"
- platform: gpio
pin:
number: D2
name: "Steppermotor aktivieren/deaktivieren"
- platform: gpio
pin:
number: D5
inverted: true
mode:
input: true
pullup: true
name: "Tür offen"
on_state:
then:
- light.turn_on:
id: led
brightness: 100%
red: 100%
green: 0
blue: 0
- platform: gpio
pin:
number: D6
inverted: true
mode:
input: true
pullup: true
name: "Tür geschlossen"
on_state:
then:
- light.turn_on:
id: led
brightness: 100%
red: 0%
green: 100%
blue: 0
Der Schrittmotor macht aber nichts.
Ich kann auch die Zustände unter ioBroker nicht ändern.
@beowolf said in GPIO Status Wemos d1 mini an iobroker senden:
Ich habe noch mal etwas probiert.
esphome: name: led esp8266: board: d1_mini stepper: - platform: a4988 id: motor step_pin: D3 dir_pin: D4 max_speed: 250 steps/s sleep_pin: D2 acceleration: inf deceleration: inf # Enable logging logger: baud_rate: 0 # 0 to disable logging via hardware UART. api: password: "1234" ota: password: "1234" wifi: ssid: "---" password: "-------" web_server: port: 80 captive_portal: # Example configuration entry light: - platform: neopixelbus type: GRB variant: WS2811 pin: GPIO3 num_leds: 1 id: led name: "LED" binary_sensor: - platform: gpio pin: number: D0 inverted: true mode: input: true name: "Taster Tür öffnen" on_state: then: - stepper.set_target: id: motor target: 250 - platform: gpio pin: number: D7 inverted: true mode: input: true pullup: true name: "Taster Tür schließen" on_state: then: - stepper.set_target: id: motor target: -250 - platform: gpio pin: number: D1 inverted: true mode: input: true pullup: true name: "Taster Bewegung anhalten" - platform: gpio pin: number: D2 name: "Steppermotor aktivieren/deaktivieren" - platform: gpio pin: number: D5 inverted: true mode: input: true pullup: true name: "Tür offen" on_state: then: - light.turn_on: id: led brightness: 100% red: 100% green: 0 blue: 0 - platform: gpio pin: number: D6 inverted: true mode: input: true pullup: true name: "Tür geschlossen" on_state: then: - light.turn_on: id: led brightness: 100% red: 0% green: 100% blue: 0
Der Schrittmotor macht aber nichts.
Ich kann auch die Zustände unter ioBroker nicht ändern.
@beowolf said in GPIO Status Wemos d1 mini an iobroker senden:
Der Schrittmotor macht aber nichts.
Ich kann auch die Zustände unter ioBroker nicht ändern.
Ich habe noch nie einen Schrittmotor mein eigenen genannt, deswegen stochere ich hier ein wenig im Dunkeln:
Das modell a4988
ist der richtige? Was sagt der logger (kann einfach über's esphome dashboard aufgerufen werden) im Moment wenn du "Taster Tür öffnen" und "Taster Tür schließen" betätigst?
Wenn der Motor sich dann hoffentlich bald bewegt könnte ein endstop cover
dann noch die Krönung für dein Vorhaben sein :
@opensourcenomad sagte in GPIO Status Wemos d1 mini an iobroker senden:
Wenn der Motor sich dann hoffentlich bald bewegt könnte ein endstop cover dann noch die Krönung für dein Vorhaben sein :
Leider noch nicht.
Die Funktion erwarte "switch." ich habe aber binary_sensor:
Das bekomme ich nicht zusammen.
@beowolf said in GPIO Status Wemos d1 mini an iobroker senden:
Leider noch nicht.
Dann noch mal einen Schritt zurück:
Das modell
a4988
ist der richtige? Was sagt der logger (kann einfach über's esphome dashboard aufgerufen werden) im Moment wenn du "Taster Tür öffnen" und "Taster Tür schließen" betätigst?
Ich habe es jetzt so gemacht:
esphome:
name: led
esp8266:
board: d1_mini
stepper:
- platform: a4988
id: motor
step_pin: D3
dir_pin: D4
max_speed: 5000 steps/s
sleep_pin:
number: D2
inverted: true
acceleration: inf
deceleration: inf
# Enable logging
logger:
baud_rate: 0 # 0 to disable logging via hardware UART.
api:
password: "1234"
ota:
password: "1234"
wifi:
ssid: "-----"
password: "-------"
web_server:
port: 80
captive_portal:
# Example configuration entry
light:
- platform: neopixelbus
type: GRB
variant: WS2811
pin: GPIO3
num_leds: 1
id: led
name: "LED"
binary_sensor:
- platform: gpio
pin:
number: D0
inverted: true
mode:
input: true
name: "Taster Tür öffnen"
id: oeffnen
on_press:
then:
- stepper.set_target:
id: motor
target: 250000
- platform: gpio
pin:
number: D7
inverted: true
mode:
input: true
pullup: true
name: "Taster Tür schließen"
id: schliessen
on_press:
then:
- stepper.set_target:
id: motor
target: -250000
- platform: gpio
pin:
number: D1
inverted: true
mode:
input: true
pullup: true
name: "Taster Bewegung anhalten"
- platform: gpio
pin:
number: D5
inverted: true
mode:
input: true
pullup: true
name: "Tür offen"
id: offen
on_press:
then:
- light.turn_on:
id: led
brightness: 100%
red: 100%
green: 0
blue: 0
- stepper.report_position:
id: motor
position: 0
- stepper.set_target:
id: motor
target: 0
- platform: gpio
pin:
number: D6
inverted: true
mode:
input: true
pullup: true
name: "Tür geschlossen"
id: geschlossen
on_press:
then:
- light.turn_on:
id: led
brightness: 100%
red: 0%
green: 100%
blue: 0
- stepper.report_position:
id: motor
position: 0
- stepper.set_target:
id: motor
target: 0
Der Motor dreht in die Richtungen wie ich es möchte. Bei erreichen der Endschalter hält der Motor direkt an. Mache hiermit:
- stepper.report_position:
id: motor
position: 0
- stepper.set_target:
id: motor
target: 0
Ob das die beste Methode ist - keine Ahnung.
Was jetzt noch nicht funktioniert ist, wenn die Tür auf ist, und ich jetzt nocht mal auf die AUF-Taste drücke geht die Tür "noch weiter" auf.
Ich brauche also eine "wenn" - "dann" Funktion. Geht das nur über die Lambda Methode?
@beowolf said in GPIO Status Wemos d1 mini an iobroker senden:
Ob das die beste Methode ist - keine Ahnung.
Du steuerst jetzt deinen Motor direkt, kann man so machen.
Was jetzt noch nicht funktioniert ist, wenn die Tür auf ist, und ich jetzt nocht mal auf die AUF-Taste drücke geht die Tür "noch weiter" auf.
Ich glaube genau dafür ist jetzt das oben verlinkte Endstop cover zuständig
Ich brauche also eine "wenn" - "dann" Funktion. Geht das nur über die Lambda Methode?
Die ist auch "normal" in der yaml syntax verfügbar https://esphome.io/guides/automations.html#if-action
@beowolf sagte in GPIO Status Wemos d1 mini an iobroker senden:
Ok, dann versuche ist es so.
Die Steuerung wollte durch ioBroker machen.
Die Anschlüsse:
D6; // Endschalter Tür offen
D5; // Endschalter Tür geschlossenD0; // Taster Tür öffnen - für manuelles Öffnen vor Ort
D7; // Taster Tür schließen - für schließen vor Ort
D1; // Taster Bewegung anhalten - Lichtschranke falls sich ein Huhn im Türbereich aufhält.
Zur Sicherheit würde ich die Endschalter, die Taster und vor Allem die Lichtschranke nicht über ioBroker, sondern direkt auf dem Microcntroller steuern. Hast Du einmal eine Verzögerung in der Kommunikation, klemmt das Huhn in der Tür.