Ich habe folgendes Problem, ich möchte mit einer IR Fernbedienung zB ein RGB Led schalten. Hardware ist ein D1 Mini mit TSOP4838 Empfänger und einem RGB Treiber, als sw läuft ESP Easy. Die Codes der FB lesen funktioniert, im Log erscheint zB:
2018-01-14 10:18:32 ESPEasy ESPEasy_ESP_Easy_IR_RX IR: 16236607
Nun möchte ich damit zB die angeschlossene RGB Led schalten, dies geht mit dem Befehl:
set ESPEasy_ESP_Easy_TvBeleuchtung rgb ffffff
Nun scheitere ich daran beides zu verknüpfen, ich habe versucht ein notify anzulegen:
ESPEasy_ESP_Easy_IR_RX:IR:16236607 set ESPEasy_ESP_Easy_TvBeleuchtung rgb ffffff
Leider reagiert die RGB Led nicht, ich habe versucht die ":" mit "." und Leerzeichen zu ersetzen da ich mir nicht sicher war ob der Aufbau korrekt ist, allerdings ohne Erfolg.
Die Frage an euch, wie muss der Befehl korrekt aufgebaut werden? Wäre Doif besser geeignet? Und gibt es eine sinnvolle Lösung eine Art Tabelle anzulegen welches Kommando auf welchen ir code ausgelöst werden soll oder müssen für jeden Befehl notifys angelegt werden?
Danke
Gehe in den EventMonitor warte bis der Event kommt (also drücke die FB), markiere die Zeile, dann create/modify und lass dir das Notify anlegen.
Dann noch den set-Befehl anfügen, fertig...
Ansonsten keinen Auszug aus dem Log, besser aus dem EventMonitor...
...aber wenn du den postest hast du ja eigentl. bereits das Ergebnis... ;)
Kurz, da nur Handy...
Gruß, Joachim
Mit log meinte ich den Event Monitor, allerdings war ich mir der sehr praktischen Funktion "create/modify" noch nicht bewusst, danke für den Hinweis! Damit habe ich den Notify nun korrigiert bekommen (der Punkt hat gefehlt, tu mich noch etwas schwer mit dem Syntax) und kann damit schalten:
ESPEasy_ESP_Easy_IR_RX:IR:.16236607 set ESPEasy_ESP_Easy_TvBeleuchtung rgb ffffff
Zu meinem zweiten Teil der Frage, ich möchte nun verschiedene Tasten der FB drücken, um unterschiedliche Aktionen auszulösen, kann ich dies mit einem notify in dem ich mehrere codes mit entsprechenden Befehlen aufliste? Benötigt man dazu eine art switch case funktion in perl oder geht es auch einfacher?
Ich sag mal so:
entweder für jeden Code ein passendes Notify, wie das geht weißt du ja jetzt ;)
Oder ein sehr generelles Notify und dann eben per if etc. (switch case sollte in einer Perl-Sub in myUtils auch gehen, noch nicht getestet) die einzelnen Fälle auseinander tüteln und das entsprechende Gerät schalten/Befehl ausführen.
Würde ich aber dann (wie geschrieben) in einer "ausgelagerten" Sub in myUtils tun...
https://wiki.fhem.de/wiki/99_myUtils_anlegen
define nNotify notify regex {myFunction($EVENT)} (oder $EVTPART0, $EVTPART1, ...)
Also praktisch wie du dir gedacht hast ;)
Gruß, Joachim
Danke für die Info, dann weiß ich jetzt in welche Richtung ich gehen muss, um es vernünftig umzusetzen. Mal schauen ob es ohne Hilfe klappt, sonst meld ich mich hier noch mal ;)
Gerne.
Viel Spaß noch!
Dann diesen Thread auf gelöst stellen, umbenennen des ersten Posts in beispielsweise: [gelöst] Schalten mit IR code
Gruß, Joachim
Hallo nochmal,
ich habe ein notify angelegt wie beschrieben
define IR_notify notify ESPEasy_ESP_Easy_IR_RX:.* {Ir2cmd($EVENT)}
Dieses beinhaltet somit den empfangenen IR code, zum Test habe ich es an einen dummy gesendet und konnte dort die code Änderung sehen.
In der 99_myUtils habe ich folgende Funktion erstellt
sub Ir2cmd($) {
my $IrCode = @_;
my %command = (
"16236607", "set ESPEasy_ESP_Easy_TvBeleuchtung rgb ffffff",
"16203967", "set ESPEasy_ESP_Easy_TvBeleuchtung rgb 000000",
);
fhem ("$command{$IrCode}");
}
Leider tut sich nichts, wo liegt hier mein denkfehler? Kann mir jemand mit dem Syntax helfen?
Ich würde zunächst mal Logausgaben machen:
Log3(undef, 3, "Das ist die Logausgabe");
Dann siehst du, ob das Notify getriggert wird und wenn du ausgibst was "rein kommt" (mache ich immer so, also erst mal "nur" eine Logausgabe mit den Parametern), dann auch "was dir zur Verfügung steht".
Ab und an mache ich dann weitere Logausgaben mit "errechneten" oder "abgefragten" Werten, ob auch die passen.
Wenn dann alles läuft kommentiere ich die wieder aus oder lösche sie.
D.h. du könntest auch:
Log3(undef, 3, "Ir2cmd Command: $command{$IrCode}");
ausgeben (hoffe das geht so), dann siehst du auch was an die "Funktion" fhem übergeben wird.
Und dann warum nicht ein (oder mehrere) "einfaches" if:
sub Ir2cmd($)
{
my ($IrCode) = @_;
Log3(undef, 3, "Ir2cmd IrCode $IrCode);
if($IrCode eq "16236607")
{
fhem("set ESPEasy_ESP_Easy_TvBeleuchtung rgb ffffff");
}
if($IrCode eq "16203967")
{
fhem("set ESPEasy_ESP_Easy_TvBeleuchtung rgb 000000");
}
}
und ob das 'my ($IrCode) = @_;' oder so wie bei dir auch geht 'my $IrCode = @_;' dazu kenne ich perl noch zu wenig.
Ich mache es wie in meinem Code-Schnipsel und das geht...
Ich benenne meine Subs auch immer my_Irgendwas damit ist (weitestgehend) ausgeschlossen, dass es die Funktion/Sub bereits gibt und somit "überschrieben" wird bzw. unklar ist was/welche ausgeführt wird...
Wie gesagt: so mache ich das. Aber ich bin bei weitem kein perl oder fhem "Guru"...
Gruß, Joachim
Danke Joachim, ich hatte die Klammer vergessen bei "my ($Ir2cmd)=@_;"
Nun funktioniert es wie erwartet mit:
sub Ir2cmd($) {
my ($IrCode) = @_;
# Debug Logausgabe
# Log3(undef, 3, "Ir2cmd IrCode $IrCode");
my %command = (
"16236607", "set ESPEasy_ESP_Easy_TvBeleuchtung rgb ffffff",
"16203967", "set ESPEasy_ESP_Easy_TvBeleuchtung rgb 000000",
"16195807", "set ESPEasy_ESP_Easy_TvBeleuchtung rgb ff0000",
"16228447", "set ESPEasy_ESP_Easy_TvBeleuchtung rgb 00ff00",
"16212127", "set ESPEasy_ESP_Easy_TvBeleuchtung rgb 0000ff",
);
fhem ("$command{$IrCode}");
}
Hier siehst du auch warum ich lieber die Liste nehmen wollte, ein weiteres Kommando lässt sich sehr übersichtlich aufnehmen. Lässt sich bestimmt auch noch weiter reduzieren durch herausnehmen des "set" und "device".
Danke für die Hilfe
Dachte ich mir schon ;)
Also das mit der Liste...
Dann viel Spaß noch, Joachim