Hallo,
ich steh irgendwie auf der Leitung....
Ich will mittels einem Keypad welches über einen ESP verbunden ist, folgendes ausführen:
1.) Wenn ich 1234 und # eingebe soll der Befehl "set Garage send" gesendet werden. Das funktioniert auch soweit
2.) Mit # soll immer der "current_entry" gelöscht werden (funktioniert nicht zuverlässig, seit ich die Tasten A & B hinzugefügt habe)
3.) Wenn Taste A & # am Keypad gedrückt wird, soll "Esszimmer_Schalter2 ON" gesendet werden (funktioniert auch)
4.) Wenn Taste B & # am Keypad gedrückt wird, soll "Esszimmer_Schalter2 OFF" gesendet werden (funktioniert nicht)
Sieht irgendwer einen Fehler
GA_Keypad:keypress:.*
{
my $newValue = $EVTPART1;
if ($newValue ne '#')
{
fhem("setreading GA_Keypad current_entry " . ReadingsVal("GA_Keypad", "current_entry", "") . $newValue);
}
else {
if (ReadingsVal("GA_Keypad", "current_entry", "" ) == 1234)
{
fhem("set Garage send");
}
else {
if (ReadingsVal("GA_Keypad", "current_entry", "" ) == "A")
{
fhem("set Esszimmer_Schalter2 ON");
}
else {
if (ReadingsVal("GA_Keypad", "current_entry", "" ) == "B")
{
fhem("set Esszimmer_Schalter2 OFF");
}
fhem("deletereading GA_Keypad current_entry")
}
}
}
Hi,
also ich weiß nicht was GA_Keypad:keypress:.* wirklich liefert, aber wozu immer Tante Else? ;)
Ich würde das vom Prinzip her eher so machen:
if ($newValue ne '#') {
if (){}
if (){}
if (){}
}
else {fhem("deletereading GA_Keypad current_entry")}
Gruß Otto
habs jetzt so probiert
klappt aber leider nicht.. Jetzt ist egal welche Taste ich drücke, es schaltet immer Esszimmer_Schalter2
GA_Keypad:keypress:.*
{
my $newValue = $EVTPART1;
if ($newValue ne '#') {fhem("setreading GA_Keypad current_entry " . ReadingsVal("GA_Keypad", "current_entry", "") . $newValue);}
if (ReadingsVal("GA_Keypad", "current_entry", "" ) == 1234){fhem("set Garage send");}
if (ReadingsVal("GA_Keypad", "current_entry", "" ) == "A"){fhem("set Esszimmer_Schalter2 ON");}
if (ReadingsVal("GA_Keypad", "current_entry", "" ) == "B"){fhem("set Esszimmer_Schalter2 OFF");}
else {fhem("deletereading GA_Keypad current_entry");}
}
Zeichenketten werden in Perl nicht mit == verglichen, sondern mit eq.
wenn ich es so ausführe funktioniert das Garagentor öffnen mit dem Code 1234 & # nicht mehr
GA_Keypad:keypress:.*
{
my $newValue = $EVTPART1;
if ($newValue ne '#') {fhem("setreading GA_Keypad current_entry " . ReadingsVal("GA_Keypad", "current_entry", "") . $newValue);}
if (ReadingsVal("GA_Keypad", "current_entry", "" ) eq '1234'){fhem("set Garage send");}
if (ReadingsVal("GA_Keypad", "current_entry", "" ) eq 'A'){fhem("set Esszimmer_Schalter2 ON");}
if (ReadingsVal("GA_Keypad", "current_entry", "" ) eq 'B'){fhem("set Esszimmer_Schalter2 OFF");}
else {fhem("deletereading GA_Keypad current_entry");}
}
und wenn ich es so aufbau funktioniert das Garagentor öffnen mit dem Code richtig, nur das Esszimmerlicht wird mit # und nicht mit A & B aus und eingeschaltet
GA_Keypad:keypress:.* {
my $newValue = $EVTPART1;
if ($newValue ne '#')
{
fhem("setreading GA_Keypad current_entry " . ReadingsVal("GA_Keypad", "current_entry", "") . $newValue);
}
else
{
if (ReadingsVal("GA_Keypad", "current_entry", "" ) == 1234)
{
fhem("set Garage send");
}
fhem("deletereading GA_Keypad current_entry");
if (ReadingsVal("GA_Keypad", "current_entry", "" ) == "A")
{
fhem("set Esszimmer_Schalter2 ON");
}
fhem("deletereading GA_Keypad current_entry");
if (ReadingsVal("GA_Keypad", "current_entry", "" ) == "B")
{
fhem("set Esszimmer_Schalter2 OFF");
}
fhem("deletereading GA_Keypad current_entry");
}
}
Mit der # sollen der Inhalt von current_entry immer zurückgesetzt werden
Du musst mal noch sagen was dein keypad liefert? Immer nur eine Taste/Zeichen pro Betätigung?
Ja schickt immer nur ein Zeichen pro Taste./Betätigung
Mit folgendem Code hab ich es nun geschafft ....
GA_Keypad:keypress:.* {
my $newValue = $EVTPART1;
if ($newValue ne '#') {
fhem("setreading GA_Keypad current_entry " . ReadingsVal("GA_Keypad", "current_entry", "") . $newValue);
} else
{
if (ReadingsVal("GA_Keypad", "current_entry", "" ) == 1234) {
fhem("set Garage send"); }
if (ReadingsVal("GA_Keypad", "current_entry", "" ) eq 'A') {
fhem("set Esszimmer_Schalter2 ON"); }
if (ReadingsVal("GA_Keypad", "current_entry", "" ) eq 'B') {
fhem("set Esszimmer_Schalter2 OFF"); }
fhem("deletereading GA_Keypad current_entry");
}
}
Hallo,
ich hab nun das Keypad fix verbaut hab aber nun folgendes Problem.
Wenn ich den ESP über die MircoUSB Schnittstelle mittels USB Ladegerät (5V/1A) versorge, bekomme ich nicht die richtigen Tastendrücke vom Keypad (Bsp. 01123A*��?L��?���?0*0*0*0*0*0***00*00*0)
Schließ ich den ESP aber anstelle vom USB Ladegerät an die USB Buchse vom PC an, funktioniert jeder Tastendruck normal
Der ESP übers Wlan verbunden, Position des ESP ist immer die gleiche, egal ob am PC angeschlossen oder am Ladegerät
Verbauter Wemos: https://www.amazon.de/Antennenanschluss-NodeMCU-basiert-ESP-8266EX-WIFI-Entwicklungsboard-Micro-USB/dp/B07SVS4VD9/ref=sr_1_12?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=1WAV41FREC3TI&keywords=wemos+d1+mini&qid=1583348627&s=industrial&sprefix=wemo%2Cindustrial%2C178&sr=1-12
Hat jemand eine Idee woran das liegen kann?
Defektes / unbrauchbares USB Ladegerät? Hast du es mal mit einem anderen versucht?
ja, hab schon 2 verschieden Ladegeräte und 2 verschiedene Kabel ausprobiert
klingt danach als ob dein ESP den PC für seine Software braucht. Was läuft auf dem ESP für eine Software?
Hab das auf den ESP gespielt
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <Keypad.h>
const char* mqtt_server = "10.0.0.72";
const char* ssid = "Fritzbox";
const char* password = "";
Keypad keypad(
makeKeymap(((char[4][4])
{
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
})),
(byte[]){D3,D2,D1,D0},
(byte[]){D7,D6,D5,D4},
//(byte[]){D7,D6,D5,D4},
//(byte[]){D3,D2,D1,D0},
4,
4
);
WiFiClient net;
PubSubClient client(net);
void setup() {
pinMode(BUILTIN_LED, OUTPUT);
Serial.begin(115200);
Serial.println();
Serial.println("Booting...");
WiFi.mode(WIFI_AP_STA);
WiFi.begin(ssid, password);
connect();
Serial.println("Setup completed...");
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
char key = keypad.getKey();
if (key) {
Serial.print("Pressed Key: ");
Serial.println(key);
client.publish("Garage/Keypad", &key);
}
}
void connect() {
// WiFi
while (WiFi.waitForConnectResult() != WL_CONNECTED)
{
WiFi.begin(ssid, password);
Serial.println("WiFi connection failed. Retry.");
}
Serial.print("Wifi connection successful - IP-Address: ");
Serial.println(WiFi.localIP());
// MQTT
client.setServer(mqtt_server, 1883);
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientId = "WemosKeypad-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
Hab noch immer das gleiche Problem, wenn ich den Wemos an die USB Schnittstelle des PC´s anschließe funktioniert alles perfekt. Schließ ich den Wemos über ein USB Ladegerät an funktioniert es nicht. Er schickt die ganze Zeit ein "D" vomKeypad an MQTT. Die Taste steckt aber nicht..... Ich brauch es nur wieder umstecken auf den PC (ohne das ich sonst was angreife) und es funktioniert wieder alles?
Hat jemand eine Idee?
Danke
Also ich habe nicht viel Ahnung davon, aber wenn ich meinen Arduino Editor öffne, ist da zufällig ein Programm in der Anzeige (war mein letztes? Muss schon ewig her sein) Notruftaster.
Das beginnt so:
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <EEPROM.h>
#include <ESP8266HTTPClient.h>
#include "WEBset.h" // Hier ist die HTML-Webseite als Array abgelegt
#define LEDpin 1 // LED zum Blinken. Bei ESP-07 Pin 2. Bei ESP-01 Pin 1
// #define seriell; // Einschalter für serielle Ausgabe
Beachte: define seriell ist auskommentiert!
Und im Hauptprogramm stehen solche Dinge:
#if defined seriell
Serial.begin(115200);
Serial.println("");
Serial.println("WiFi connected");
Serial.print("Signal strength: ");
Serial.print(rssi);
Serial.println("dBm");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("connecting to ");
Serial.println(url);
#endif
Also mach die seriellen Ausgaben nur wenn es definiert ist.
Ich bleibe dabei: Dein Programm will seriell ausgeben - hast Du keine serielle Verbindung - läuft es nicht.
Da Du sie ja nicht brauchst, nimm den seriellen Kram doch mal raus?
Das Schema wie hast Du ja nun als Beispiel :)
Ein Versuch ist es wert!
Gruß Otto
Hier hätte ich eine ähnliche Frage:
ich würde gerne die Eingabe "ReadingsVal("GA_Keypad", "current_entry", "" )" vergleichen mit einem dummy, der eine Liste von zugangsberechtigten Zahlen enthält
leider führt die nicht zum Erfolg:
NAME ZugangABSV
NR 24885
STATE 6<br>4<br>
TYPE dummy
Versuch:
Beach_Keypad:keypress:.* {
my $newValue = $EVTPART1;
if ($newValue ne '#') {
fhem("setreading Beach_Keypad current_entry " . ReadingsVal("Beach_Keypad", "current_entry", "") . $newValue);
} else {
if (ReadingsVal("Beach_Keypad", "current_entry", "") == ReadingsVal("ZugangABSV", "current_entry", "")) {
fhem("set HSS5.3.SoccerInd toggle");
}
fhem("deletereading Beach_Keypad current_entry");
}
}
das führt dazu dass nur die Eingabe von # zum toggle führt.
Also ich versteh den Code und die Aufgabe nicht.
Zum Post generell muss ich sagen, bitte die Ausführung hier beachten: https://forum.fhem.de/index.php/topic,71806.0.html
ReadingsVal("ZugangABSV", "current_entry", "") liest ein Reading current_entry - da sehe ich aber in dem kurzen List vom Dummy nicht.
Gruß Otto