FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: robertr am 15 Februar 2020, 10:09:21

Titel: Keypad verschiedene Aktionen ausführen
Beitrag von: robertr am 15 Februar 2020, 10:09:21
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")
}

}
}
Titel: Antw:Keypad verschiedene Aktionen ausführen
Beitrag von: Otto123 am 15 Februar 2020, 12:36:22
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
Titel: Antw:Keypad verschiedene Aktionen ausführen
Beitrag von: robertr am 15 Februar 2020, 22:19:13
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");}
}
Titel: Antw:Keypad verschiedene Aktionen ausführen
Beitrag von: xenos1984 am 15 Februar 2020, 22:27:08
Zeichenketten werden in Perl nicht mit == verglichen, sondern mit eq.
Titel: Antw:Keypad verschiedene Aktionen ausführen
Beitrag von: robertr am 15 Februar 2020, 22:58:39
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
Titel: Antw:Keypad verschiedene Aktionen ausführen
Beitrag von: Otto123 am 15 Februar 2020, 23:45:34
Du musst mal noch sagen was dein keypad liefert? Immer nur eine Taste/Zeichen pro Betätigung?
Titel: Antw:Keypad verschiedene Aktionen ausführen
Beitrag von: robertr am 15 Februar 2020, 23:49:02
Ja schickt immer nur ein Zeichen pro Taste./Betätigung
Titel: Antw:Keypad verschiedene Aktionen ausführen
Beitrag von: robertr am 16 Februar 2020, 10:12:28
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");
}
}
Titel: Antw:Keypad verschiedene Aktionen ausführen
Beitrag von: robertr am 04 März 2020, 20:01:27
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?
Titel: Antw:Keypad verschiedene Aktionen ausführen
Beitrag von: xenos1984 am 04 März 2020, 20:59:53
Defektes / unbrauchbares USB Ladegerät? Hast du es mal mit einem anderen versucht?
Titel: Antw:Keypad verschiedene Aktionen ausführen
Beitrag von: robertr am 04 März 2020, 21:29:35
ja, hab schon 2 verschieden Ladegeräte und 2 verschiedene Kabel ausprobiert
Titel: Antw:Keypad verschiedene Aktionen ausführen
Beitrag von: Otto123 am 04 März 2020, 21:34:15
klingt danach als ob dein ESP den PC für seine Software braucht. Was läuft auf dem ESP für eine Software?
Titel: Antw:Keypad verschiedene Aktionen ausführen
Beitrag von: robertr am 04 März 2020, 22:34:58
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);
    }
  }
}
Titel: Antw:Keypad verschiedene Aktionen ausführen
Beitrag von: robertr am 14 März 2020, 11:34:55
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
Titel: Antw:Keypad verschiedene Aktionen ausführen
Beitrag von: Otto123 am 16 März 2020, 19:31:29
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
Titel: Antw:Keypad verschiedene Aktionen ausführen
Beitrag von: hofzumberge am 02 Mai 2020, 15:51:15
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.
Titel: Antw:Keypad verschiedene Aktionen ausführen
Beitrag von: Otto123 am 02 Mai 2020, 23:01:20
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