Keypad verschiedene Aktionen ausführen

Begonnen von robertr, 15 Februar 2020, 10:09:21

Vorheriges Thema - Nächstes Thema

robertr

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")
}

}
}

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

robertr

#2
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");}
}

xenos1984

Zeichenketten werden in Perl nicht mit == verglichen, sondern mit eq.

robertr

#4
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

Otto123

Du musst mal noch sagen was dein keypad liefert? Immer nur eine Taste/Zeichen pro Betätigung?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

robertr

Ja schickt immer nur ein Zeichen pro Taste./Betätigung

robertr

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");
}
}

robertr

#8
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?

xenos1984

Defektes / unbrauchbares USB Ladegerät? Hast du es mal mit einem anderen versucht?

robertr

ja, hab schon 2 verschieden Ladegeräte und 2 verschiedene Kabel ausprobiert

Otto123

klingt danach als ob dein ESP den PC für seine Software braucht. Was läuft auf dem ESP für eine Software?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

robertr

#12
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);
    }
  }
}

robertr

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

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz