IR-LED an ESP8266 mit EspEasy

Begonnen von erotikbaer, 18 Februar 2017, 03:02:47

Vorheriges Thema - Nächstes Thema

TomLee

#30
Mit Arends Sketch auf einem Sonoff Switch und einem 1:1 Nachbau des erwähnten Ir-Moduls ist es mir nun möglich problemlos zu senden. Allerdings hab ich jetzt natürlich ein LG TV. Hab da nur wenig Erfahrung aber in der xdrv_ir_send.ino finde ich diese Angaben:

if      (!strcmp(protocol,"NEC"))     irsend->sendNEC(data, bits);
          else if (!strcmp(protocol,"SONY"))    irsend->sendSony(data, bits);
          else if (!strcmp(protocol,"RC5"))     irsend->sendRC5(data, bits);
          else if (!strcmp(protocol,"RC6"))     irsend->sendRC6(data, bits);
          else if (!strcmp(protocol,"DISH"))    irsend->sendDISH(data, bits);
          else if (!strcmp(protocol,"JVC"))     irsend->sendJVC(data, bits, 1);
          else if (!strcmp(protocol,"SAMSUNG")) irsend->sendSAMSUNG(data, bits);



Der Bibliothek IRremoteESP8266 entnehm ich in der IRremoteESP8266.h das LG unterstützt werden sollte.

Kann dazu einfach ein vorhandenes Protokoll in der xdrv_ir_send.ino entfernt, durch

(!strcmp(protocol,"LG"))    irsend->sendLG(data, bits)

ersetzt und neu kompiliert werden? Oder sind noch weitere Änderungen erforderlich ?

Weiter versuch ich das ja auch auf einem ESP_01 zum laufen zu bringen. Hier hat der ESP mit angeschlossenem IR-Modul Probleme beim starten. Ohne IR-Modul keine. Zur Spannungsversorgung verwende ich ein IPad Netzteil  und ein MB102, der ESP steckt auf einem Eigenbaubreakoutboard mit integriertem 220µF Kondensator. Verbinde ich das Modul erst nach dem starten ist alles kein Problem und auch das senden möglich. Ein Kondensator (versucht mit 220µF und 100µF) direkt vor dem IR-Modul hilft nicht. Hat da jemand Rat dazu?

Reinhart

eigentlich müsste das so funktionieren was du vorhast, denn du hast ja schon nachgesehen das die IRremoteESP8266.h in der Lib den LG ebenfalls unterstützt.

// Values for decode_type
#define NEC 1
#define SONY 2
#define RC5 3
#define RC6 4
#define DISH 5
#define SHARP 6
#define PANASONIC 7
#define JVC 8
#define SANYO 9
#define MITSUBISHI 10
#define SAMSUNG 11
#define LG 12
#define WHYNTER 13
#define UNKNOWN -1


Das einzige was dabei auffällt, es gibt keine Senderoutine für den LG? Villeicht bedeutet das, das du mit einem anderen kompatiblen Code senden kannst (JVC). Also sendLG wird er in meinen Augen so nicht finden, außer du baust das noch dazu.

{
public:
  IRsend(int IRsendPin);
  void begin();
  void sendWhynter(unsigned long data, int nbits);
  void sendNEC(unsigned long data, int nbits);
  void sendSony(unsigned long data, int nbits);
  // Neither Sanyo nor Mitsubishi send is implemented yet
  //  void sendSanyo(unsigned long data, int nbits);
  //  void sendMitsubishi(unsigned long data, int nbits);
  void sendRaw(unsigned int buf[], int len, int hz);
  void sendRC5(unsigned long data, int nbits);
  void sendRC6(unsigned long data, int nbits);
  void sendDISH(unsigned long data, int nbits);
  void sendSharp(unsigned int address, unsigned int command);
  void sendSharpRaw(unsigned long data, int nbits);
  void sendPanasonic(unsigned int address, unsigned long data);
  void sendJVC(unsigned long data, int nbits, int repeat); // *Note instead of sending the REPEAT constant if you want the JVC repeat signal sent, send the original code value and change the repeat argument from 0 to 1. JVC protocol repeats by skipping the header NOT by sending a separate code value like NEC does.
  void sendSAMSUNG(unsigned long data, int nbits);
  void enableIROut(int khz);
  VIRTUAL void mark(int usec);
  VIRTUAL void space(int usec);
private:
  int halfPeriodicTime;
  int IRpin;
} ;


Aber wenn du dir den Header in der IRremoteESP8266.cpp anschaust, dann schreibt man da:

* LG added by Darryl Smith (based on the JVC protocol)


LG
FHEM auf Raspy4 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

TomLee

#32
Die Signale der LG TV Fernbedienung hab ich nach meiner Fragestellung mal  mit dem Sketch IRrecvDumpV2 aufgenommen und festgestellt das diese das NEC  Protokoll verwendet. Somit ist das senden ohne irgendeine Änderung möglich.

Allerdings bisher nur auf der Kommandozeile am Modul und Broker. Ziel ist ja die Integration in Fhem, drücke ich eine Taste auf der in Fhem definierten Fernbedienung  erhalte ich im Logfile diese  Meldung :

/bin/sh: 0: Illegal option

Die Rechte der ircmd.sh sind angepasst.

Das JVC Protokoll hab ich einfach mal interessehalber verwendet das geht nicht.


edit:
Ich hab ein

sudo rm -f /bin/sh

und

sudo ln -s /bin/bash /bin/sh

ausgeführt. Nun gibt's diese Meldung beim drücken einer Taste im Logfile

/bin/sh: -
: Ungültige Option



Reinhart

Na super, das ist ja schon eine Erfolg!

Versuche doch einmal das Script in der Konsole aufzurufen, vielleicht erhältst du dann eine aussagekräftigere Fehlermeldung.

pi@raspberry /opt/fhem $ ./ircmd.sh KEY_POWER
pi@raspberry /opt/fhem $

sieht bei mir so aus.

Viel kann da nicht sein, das Script besteht ja nur aus IF Abfragen. Gespeichert hast du es aber im Linuxformat? Ich mache das immer mit dem Editor PSPad, Format Linux einstellen und den Text hineinkopieren, dann direkt über FTP auf den Raspi zurück speichern.

Wenn das Script richtig läuft, dann solltest du am Broker den Befehl sehen, bzw. in der Konsole am Sonoff.

LG
FHEM auf Raspy4 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

TomLee

Ich hatte die Datei auf dem Tablet im ES Datei Explorer erstellt (nicht schlagen). Bin deinem Rat jetzt gefolgt und dafür auch extra diesen Editor heruntergeladen (PC). Datei wieder zurück nach /opt/fhem und Rechte wieder vergeben und was soll ich sagen. Mein TV wird ab heute per Sprache bedient werden können. Danke dir abermals.

TomLee

#35
Die Fragerei geht doch tatsächlich weiter ☺. Warum wird  nun bspw. ein

set LG_TV_Wohnzimmer state KEY_POWER

aus der Befehlszeile oder aus einem DOIF, NOTIFY nicht ausgeführt? Direkt im Device aber schon. Liegt das an dem ausgelagertem Script? Wie mach ich das jetzt ? Muss man warten bis du das alles direkt in Fhem eingebundenen hast? Im Logfile find ich nichts auffälliges,  im Event Monitor find ich diesen Eintrag:

27 11:46:43 remotecontrol LG_TV_Wohnzimmer KEY_POWER

Wenn ich den Befehl direkt im Device ausführen, steht nichts anderes da.

Reinhart

poste bitte einmal wie so eine IF Abfrage in der ircmd.sh bei dir jetzt aussieht!

LG
FHEM auf Raspy4 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

TomLee

#!/bin/sh -e
if [ "$1" = "KEY_POWER" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551489775}'
fi
# E0E0E01F   3772833823
if [ "$1" = "KEY_VOLUMEUP" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551502015}'
fi
# E0E0D02F   3772829743
if [ "$1" = "KEY_VOLUMEDOWN" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551534655}'
fi
# E0E0F00F   3772837903
if [ "$1" = "KEY_MUTE" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551522415}'
fi
# E0E020DF   3772784863
if [ "$1" = "KEY_1" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551520375}'
fi
# E0E0A05F   3772817503
if [ "$1" = "KEY_2" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551504055}'
fi   
# E0E0609F   3772801183
if [ "$1" = "KEY_3" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551536695}'
fi
# E0E010EF   3772780783
if [ "$1" = "KEY_4" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551495895}'
fi
# E0E0906F   3772813423
if [ "$1" = "KEY_5" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551528535}'
fi
# E0E050AF   3772797103
if [ "$1" = "KEY_6" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551512215}'
fi
# E0E030CF   3772788943
if [ "$1" = "KEY_7" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551544855}'
fi
# E0E0B04F   3772821583
if [ "$1" = "KEY_8" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551491815}'
fi
# E0E0708F   3772805263
if [ "$1" = "KEY_9" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551524455}'
fi         
# E0E08877   3772811383
if [ "$1" = "KEY_0" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551487735}'
fi
# E0E048B7   3772795063
if [ "$1" = "KEY_CHANNELUP" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551485695}'
fi
# E0E008F7   3772778743
if [ "$1" = "KEY_CHANNELDOWN" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551518335}'
fi

TomLee

Nachdem du jetzt danach gefragt hast hab ich diese etwas angepasst, hätte ja an den Codes nach dem # liegen können, die ich dachte kann man ignorieren. Hat aber auch nichts gebracht.

#!/bin/sh -e
# 20DF40BF   551502015
if [ "$1" = "KEY_POWER" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551489775}'
fi
# 20DF40BF   551502015
if [ "$1" = "KEY_VOLUMEUP" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551502015}'
fi
# 20DFC03F   551534655
if [ "$1" = "KEY_VOLUMEDOWN" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551534655}'
fi
# 20DF906F   551522415
if [ "$1" = "KEY_MUTE" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551522415}'
fi
# 20DF8877   551520375
if [ "$1" = "KEY_1" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551520375}'
fi
# 20DF48B7   551504055
if [ "$1" = "KEY_2" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551504055}'
fi   
# 20DFC837   551536695
if [ "$1" = "KEY_3" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551536695}'
fi
# 20DF28D7   551495895
if [ "$1" = "KEY_4" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551495895}'
fi
# 20DFA857   551528535
if [ "$1" = "KEY_5" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551528535}'
fi
# 20DF6897   551512215
if [ "$1" = "KEY_6" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551512215}'
fi
# 20DFE817   551544855
if [ "$1" = "KEY_7" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551544855}'
fi
# 20DF18E7   551491815
if [ "$1" = "KEY_8" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551491815}'
fi
# 20DF9867   551524455
if [ "$1" = "KEY_9" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551524455}'
fi         
# 20DF08F7   551487735
if [ "$1" = "KEY_0" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551487735}'
fi
# 20DF00FF   551485695
if [ "$1" = "KEY_CHANNELUP" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551485695}'
fi
# 20DF807F   551518335
if [ "$1" = "KEY_CHANNELDOWN" ]; then
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551518335}'
fi


Merkwürdig find ich auch im Wiki zu remotecontrol steht bspw. man könne ein

get <name> layout

ausführen. get ist gar nicht vorhanden in meinem definierten Device.

tklein

Hallo,

kann es evtl sein, dass ich für bestimmte IR-Signale von 940 auf 850 nm wechseln muss? Habe diverse IR Codes (auch RAW) eingelesen. Bis auf ein Gerät konnte ich alle Signale reproduzieren.
Habe die Codes mit zwei unterschiedlichen Receivern empfangen(KY-022 und TSOP38238).

Wer kann mir sagen, wie die Schaltung (Widerstände) aussehen müsste, wenn ich 2,4, oder 6 IR Dioden an einen Pin hängen würde? Da die Geräte im Raum verstreut sind, wäre ein "IR-Würfel" gut. Könnte ich da auch die Wellenlängen kombinieren?

Grüße
Thomas
FHEM auf Pi 3, Echo (Plus, Dot und Connect), CUL868/433, HM Komponenten, Broadlink, Enigma (VU DUO2), Alexa/Homebridge, Sonoffs (POW, RF, Basic), Wemos D1 (IR, DHT, BH1750, OLED, BMP180), IT/Steckdosen, Fritzbox mit SIP, Wifilight, MQTT, Pilight, Xiaomi Flower Sensor, Spotify, Dooya, Shelly, Conbee2

Reinhart

#40
@TomLee

Den Kommentar mit der # habe ich deshalb im Script hinterlegt, das jedermann nachvollziehen kann wie ich auf den Data Code komme.
Du hast doch geschrieben, dass die Kommandos in der Konsole des Moduls ja bereits funktionieren.

# 20DF40BF   551502015
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551489775}'

d.h., du kannst dann mit dieser Befehlszeile am Broker ebenfalls den NEC einschalten. Geht das?

PS: ah ich habe gerade gesehen du hast ja den Samsung Code gegen deinen NEC gar nicht ausgetauscht?
# 20DF40BF   551502015
mosquitto_pub -q 2 -t cmnd/sonoffIR/IRSend/set -m '{"protocol": "NEC","bits": 32, "data": 551502015}'



LG
FHEM auf Raspy4 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

TomLee

#41
Es funktioniert alles, doch wie gesagt ein

set LG_TV_Wohnzimmer state KEY_POWER

oder anderer Befehl ( KEY_1,KEY_2,KEY_3 ...) aus der Befehlszeile, notify oder doif nicht.

Getauscht hatte ich nichts mehr nachdem ich mit dem IRrecvDumpV2 feststellte das NEC verwendet wird.

edit:
Ein

set LG_TV_Wohnzimmer KEY_POWER

ist die Lösung. Warum auch immer.

TomLee

@tklein

Viegener hat im MiniIrCul-Thread ein Multi-directional Infrared Transmitter mit vier Dioden genutzt, allerdings benötigt dieses  5V.Auf B.. gg...d.com findet man Bilder der Vorder und Rückseite zu dem Modul, auf denen die Beschaltung inkl. der Werte der verwendeten Widerstände sehr gut ersichtlich ist. Vlt. hilft das etwas weiter.

Reinhart

Zitat von: TomLee am 27 März 2017, 22:56:05
set LG_TV_Wohnzimmer KEY_POWER

ist die Lösung. Warum auch immer.

da muss ich dann leider passen, ich habe ja keine Ahnung wie du mit dem set Befehl dem MQTT Broker den richtigen Code für den irsend Befehl an den 8266 übergibst bzw. aufgebaut hast. Ich dachte du sendest aus Fhem mit der virtuellen Fernbedienung, somit brauchst du auch kein Script.

LG
FHEM auf Raspy4 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

TomLee

Ich sende mit diesem Befehl aus Fhem mit der virtuellen Fernbedienung, 1:1 deiner Anleitung gefolgt.
Ich sehe auch nicht das Missverständnis, bin genau wie meine Vorstellung war, zu meinem Ziel gekommen. Darum mal ein List meiner remotecontrol und dem notify nur zum Verständnis.

Internals:
   NAME       LG_TV_Wohnzimmer
   NR         382
   STATE      KEY_0
   TYPE       remotecontrol
   Readings:
     2017-03-28 14:43:03   state           KEY_0
Attributes:
   rc_iconpath icons/remotecontrol
   rc_iconprefix black_btn_
   room       TV Fernbedienungen
   row00      KEY_POWER:POWEROFF,:blank,:blank
   row02      :blank,:blank,:blank
   row03      KEY_1:1,KEY_2:2,KEY_3:3
   row04      KEY_4:4,KEY_5:5,KEY_6:6
   row05      KEY_7:7,KEY_8:8,KEY_9:9
   row06      :blank,KEY_0:0,:blank
   row07      :blank,:blank,:blank
   row08      KEY_VOLUMEUP:UP,KEY_MUTE:MUTE,KEY_CHANNELUP:CHUP
   row09      KEY_VOLUMEDOWN:DOWN,:blank,KEY_CHANNELDOWN:CHDOWN



Internals:
   DEF        LG_TV_Wohnzimmer "/opt/fhem/ircmd.sh $EVENT"
   NAME       not_LG_TV_Wohnzimmer
   NOTIFYDEV  LG_TV_Wohnzimmer
   NR         383
   NTFY_ORDER 50-not_LG_TV_Wohnzimmer
   REGEXP     LG_TV_Wohnzimmer
   STATE      2017-03-28 14:43:03
   TYPE       notify
   Readings:
     2017-03-28 11:22:57   state           active
Attributes:
   room       TV Fernbedienungen


Mit readingsproxy muss ich mich mal auseinander setzen ist noch fremd für mich, daher schalte ich jetzt erstmal mit einem dummy und doif den TV ein/aus.

Internals:
   NAME       du_Szene_TV_EinAus
   NR         384
   STATE      off
   TYPE       dummy
   Readings:
     2017-03-28 14:37:53   state           off
Attributes:
   alexaName  Fernseher
   genericDeviceType switch
   room       Alexacontrol
   setList    on off


Internals:
   DEF        ([du_Szene_TV_EinAus] eq "on")(set LG_TV_Wohnzimmer KEY_POWER) DOELSE (set LG_TV_Wohnzimmer KEY_POWER)
   NAME       doif_Alexa_Szenen
   NR         355
   NTFY_ORDER 50-doif_Alexa_Szenen
   STATE      cmd_2
   TYPE       DOIF
   Readings:
     2017-03-28 14:37:53   Device          du_Szene_TV_EinAus
     2017-03-28 14:37:53   cmd             2
     2017-03-28 14:37:53   cmd_event       du_Szene_TV_EinAus
     2017-03-28 14:37:53   cmd_nr          2
     2017-03-28 14:37:53   e_du_Szene_TV_EinAus_STATE off
     2017-03-28 14:37:53   error           set LG_TV_Wohnzimmer KEY_POWER: KEY_POWER
     2017-03-28 14:37:53   state           cmd_2
   Condition:
     0          InternalDoIf($hash,'du_Szene_TV_EinAus','STATE') eq "on"
   Devices:
     0           du_Szene_TV_EinAus
     all         du_Szene_TV_EinAus
   Do:
     0:
       0          set LG_TV_Wohnzimmer KEY_POWER
     1:
       0          set LG_TV_Wohnzimmer KEY_POWER
   Helper:
     event      off
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   du_Szene_TV_EinAus
     timerevent off
     triggerDev du_Szene_TV_EinAus
     timerevents:
       off
     timereventsState:
       state: off
     triggerEvents:
       off
     triggerEventsState:
       state: off
   Internals:
     0           du_Szene_TV_EinAus:STATE
     all         du_Szene_TV_EinAus:STATE
   Itimer:
   Readings:
   Regexp:
     0:
     All:
   State:
   Trigger:
Attributes: