Broadlink: Unterschied zwischen den Versionen

Aus FHEMWiki
Zur Navigation springen Zur Suche springen
(4. Skript ergänzt)
KKeine Bearbeitungszusammenfassung
Zeile 28: Zeile 28:




Auf dem FHEM-Rechner (z.B. Raspi) muss python und am besten auch git installiert sein. Ggf. muss auch noch simplejson installiert werden.
Auf dem FHEM-Rechner (z.B. Raspi) muss python und am besten auch git installiert sein. Ggf. muss auch noch simplejson und pip installiert werden.
Da ich mich nicht als user ''fhem'' einlogge, sind in dieser Anleitung viele "sudo"s drin.
Da ich mich nicht als user ''fhem'' einlogge, sind in dieser Anleitung viele "sudo"s drin.


  sudo apt-get install python git
  sudo apt-get install python git pip
  sudo pip install simplejson
  sudo pip install simplejson


Zeile 155: Zeile 155:
</source>
</source>


 
Dieses Skript ist noch nicht getestet. Erläuterung siehe unten.  
Hier kommt ein 4. noch ungetestetes Skript. Erläuterung siehe unten.  


4. sendmore-bl.sh
4. sendmore-bl.sh
Zeile 243: Zeile 242:
Dabei die doppelten Anführungszeichen stehen lassen und an der passenden Stelle jeweils die IP und an der anderen die MAC-Adresse (mit Leerzeichen anstelle der Doppelpunkte) eintragen. Das erste Script liefert die auch so formatiert. Wenn man sie aber aus dem Router hat oder so, dann eben beachten!
Dabei die doppelten Anführungszeichen stehen lassen und an der passenden Stelle jeweils die IP und an der anderen die MAC-Adresse (mit Leerzeichen anstelle der Doppelpunkte) eintragen. Das erste Script liefert die auch so formatiert. Wenn man sie aber aus dem Router hat oder so, dann eben beachten!


Das zweite Script dient zum Anlernen des Fernbedienungscodes und Abspeichern in eine txt Datei. Das Script verbindet sich mit dem Broadlink und erwartet einen Namen für den Code. Dann hat man 5 Sec Zeit, um die entsprechende Fernbedienungstaste zu drücken, um den Code anzulernen. Dieser wird dann in eine Datei mit dem Codenamen gespeichert. So kann man alle seine zu verwendenden Codes nacheinander anlernen.
Das zweite Script dient zum Anlernen des Fernbedienungscodes und Abspeichern in jeweils einer txt Datei. Das Script verbindet sich mit dem Broadlink und erwartet einen Namen für den Code. Dann hat man 5 Sec Zeit, um die entsprechende Fernbedienungstaste zu drücken, um den Code anzulernen. Dieser wird dann in eine Datei mit dem Codenamen gespeichert. So kann man alle seine zu verwendenden Codes nacheinander anlernen.


  sudo ./learn-bl.sh
  sudo ./learn-bl.sh
Zeile 257: Zeile 256:
Mit dem dritten und vierten Script kann man den Code wieder senden. Auch hier wieder die eigene IP Adresse und MAC Adresse des Broadlink von oben eintragen.
Mit dem dritten und vierten Script kann man den Code wieder senden. Auch hier wieder die eigene IP Adresse und MAC Adresse des Broadlink von oben eintragen.


Der Aufruf ist für das dreitte Skript:  
Der Aufruf ist für das dritte Skript:  
  sudo /opt/BroadLink/send-bl.sh /opt/BroadLink/test.txt  
  sudo /opt/BroadLink/send-bl.sh /opt/BroadLink/test.txt  


Wichtig ist für das Textfile den ganzen Pfad anzugeben, und der in test.txt gelernte Befehl wird gesendet.
Wichtig ist bei diesem Skript, für das Textfile den ganzen Pfad anzugeben, und der in test.txt gelernte Befehl wird gesendet.


Aus FHEM heraus kann dann z.B. auf der Eingabezeile gesendet werden:
Aus FHEM heraus kann dann z.B. auf der Eingabezeile gesendet werden:
Zeile 274: Zeile 273:


1. Es sendet auch mehrere Codes nacheinander, also z. B. auch Zahlenfolgen wie "0202".
1. Es sendet auch mehrere Codes nacheinander, also z. B. auch Zahlenfolgen wie "0202".
2. Es nimmt an, dass die Codes als .txt-Dateien im selben Verzeichnis liegen wie das Skript.
2. Es nimmt an, dass die Codes als .txt-Dateien im selben Verzeichnis liegen wie das Skript.
3. Das Skript gibt keine Meldungen aus. Die sind beim Aufruf aus FHEM heraus auch unnötig.
3. Das Skript gibt keine Meldungen aus. Die sind beim Aufruf aus FHEM heraus auch unnötig.


Das Skript extrahiert aus dem Aufruf den Pfad und ergänzt ihn jeweils bei den Parametern. Daher kann der Aufruf dann kürzer sein. Angenommen, es sind die Code-Dateien 1.txt, 2.txt, 3.txt usw. im selben Verzeichnis vorhanden, lautet der Aufruf dann nur noch:


  /opt/BroadLink/sendmore-bl.sh 0 2 0 2
Das Skript extrahiert aus dem Befehlsaufruf den Pfad und ergänzt ihn jeweils bei den Parametern sowie um die Dateierweiterung ".txt". Daher kann der Aufruf dann kürzer sein. Angenommen, es sind die Code-Dateien 1.txt, 2.txt, 3.txt usw. im selben Verzeichnis wie die Skripte vorhanden, lautet der Aufruf dann z.B. nur noch:
 
  /opt/BroadLink/sendmore-bl.sh 1 2 3 2




== Bekannte Probleme ==
== Bekannte Probleme ==
Man kann auf diese Weise nur einzelne Tastendrücke senden, also z.B. nicht "0100", um auf den Kanal zu wechseln. Und der Aufruf von mehreren Befehlen nacheinander liegt so weit auseinander, dass das nicht als Folge von Befehlen ankommt, sondern jeweils als Einzelbefehle.
Man kann mit dem dritten Skript nur einzelne Tastendrücke senden. Und der Aufruf von mehreren Befehlen nacheinander liegt so weit auseinander, dass das nicht als Folge von Befehlen ankommt, sondern jeweils als Einzelbefehle. Dafür kann man das 4. Skript ausprobieren.


== Hinweis ==
== Hinweis ==
Wenn alles funktioniert, kann man aus dem dritten Skript natürlich die Bildschirmausgaben löschen, da es ja im Hintergrund aufgerufen wird. Umgekehrt kann man sie auch im 4. Skript wieder "freischalten", indem man die # vor den "print"-Anweisungen löscht.
Wenn alles funktioniert, kann man aus dem dritten Skript natürlich die Bildschirmausgaben löschen, da es ja in FHEM im Hintergrund aufgerufen wird. Umgekehrt kann man sie auch im 4. Skript wieder "freischalten", indem man die # vor den "print"-Anweisungen löscht.


Gelegentlich auftretende Fehlermeldungen (die nur im Terminal sichtbar sind), tun der Funktion keinen Abbruch.
Gelegentlich auftretende Fehlermeldungen (die nur im Terminal sichtbar sind), tun der Funktion keinen Abbruch.

Version vom 14. März 2017, 11:35 Uhr

Beschreibung

Der BroadLink RM Pro ist ein WLAN zu Infrarot / 433MHz-Gateway. Im deutschen Versandhandel ca. 40 Euro, aus China direkt nochmal günstiger. Damit ist der BroadLink RM Pro eine preiswerte Alternative zu anderen Produkten, die oft nur Infrarot können.

Nutzung in FHEM

Da der Hersteller sein API nicht veröffentlicht, gibt es (noch) kein echtes FHEM-Modul. Es gibt wohl einen anderen Weg, der einen permanent laufenden Server und ein Android-Gerät mit der App RM-Bridge voraussetzt. Das hier gezeigte Vorgehen wird auf dem FHEM-Server mit installiert und nur jeweils bei Bedarf angestoßen (also keine permanente Systemlast). Die Reaktionsgeschwindigkeit ist nicht überwältigend, aber praxistauglich. (Ca 2-3 sec)

Hinweis

Mit diesem Vorgehen unterstützt das BroadLink sowohl IR als auch RF.

Credits

Meine Lösung basiert auf [1]. Von dort sind auch die ersten drei Skripte, die ich nur eingedeutscht habe. Wer lieber Englisch benutzt, nimmt die bitte direkt von dort. Die Python-API ist von dieser Github-Seite.

Vorgehen

Zunächst wird der Broadlink mit der App ins eigene Netz eingebunden. Hierzu der Anleitung folgen: Broadlink Manual

1.Plug in your RM-pro / RM-home,your will find that the blue Wi-Fi indicating light is on and flashing fast (5 times per second). If not, please reset your device.
2.Firstly, link your phone to your own Wi-Fi. Secondly,operate your “Broadlink e-control ” on your smart phone. Third, press the “+” on the top right hand and select “add remote control”.
3.Input WI-Fi password to configure and click “configure” on the button.
4.The blue Wi-Fi indicating light is flashing slowly now (once per second). After being wait for about 60 seconds,the configuration is finish. The RM is linked to your smartphone through your own Wi-Fi.The blue Wi-Fi indicating light is off at this moment.


Auf dem FHEM-Rechner (z.B. Raspi) muss python und am besten auch git installiert sein. Ggf. muss auch noch simplejson und pip installiert werden. Da ich mich nicht als user fhem einlogge, sind in dieser Anleitung viele "sudo"s drin.

sudo apt-get install python git pip
sudo pip install simplejson

Verzeichnis erstellen und die Bibliothek installieren

sudo mkdir /opt/BroadLink
sudo chown fhem.dialout /opt/BroadLink
cd /opt/BroadLink
sudo git clone https://github.com/mjg59/python-broadlink.git
cd python-broadlink
sudo python setup.py install
cd ..

In das Verzeichnis dann noch die vier Skripte kopieren.

1. search-bl.sh

#!/usr/bin/python

#Script to locate Broadlink devices on local network by Graeme Brown Dec 23 2016
#These must be set up using the Broadlink app first!

import broadlink
import time

print "************************************************"
print "Using python library created by Matthew Garrett"
print "https://github.com/mjg59/python-broadlink"
print "************************************************"
print "Scanning network for Broadlink devices...."

mydevices = broadlink.discover(timeout=5)
print "Found " + str(len(mydevices )) + " broadlink devices"
time.sleep(1)
print "..............."

for index, item in enumerate(mydevices):

  mydevices[index].auth()

  ipadd = mydevices[index].host
  ipadd = str(ipadd)
  print "Device " + str(index + 1) +" Host address = " + ipadd[1:19]
  macadd = ''.join(format(x, '02x') for x in mydevices[index].mac[::-1])
  macadd = str(macadd)
 
  mymacadd = macadd[:2] + " " + macadd[2:4] + " " + macadd[4:6] + " " + macadd[6:8] + " " + macadd[8:10] + " " + macadd[10:12]
  print "Device " + str(index + 1) +" MAC address = " + mymacadd
  print "..............."

2. learn-bl.sh

#!/usr/bin/python

import broadlink
import time
import sys

device = broadlink.rm(host=("<your RM3 IP address>",80), mac=bytearray.fromhex("<your RM3 mac>"))

print "Connecting to Broadlink device...."
device.auth()
time.sleep(1)
print "Connected...."

codeName = raw_input("Bitte Namen f. den Code eingeben, z.B. tvOff ")
time.sleep(1)
print "Wenn die LED am Broadlink angeht, innerhalb von 5 Sek die FB-Taste druecken "

device.host
device.enter_learning()
time.sleep(5)
ir_packet = device.check_data()
#convert code to hex
myhex = str(ir_packet).encode('hex');

if ir_packet == None:
   print "Kein Code empfangen - Ende"
   sys.exit()
else:

# record learned hex code to file
   f = open(codeName +".txt",'w')
f.write(myhex)
f.close()

print "Hex code gespeichert unter " + codeName + ".txt"
</python>

3. send-bl.sh
<source lang="python">
#!/usr/bin/python

import broadlink
import time
import sys

try:
    fileName = sys.argv[1]
except IndexError:
    fileName = 'null'

if fileName == 'null':
   print "Error - kein Dateiname angegeben"
   sys.exit()
else:

   device = broadlink.rm(host=("<your RM3 IP address>",80), mac=bytearray.fromhex("<your RM3 mac>"))

print "Connecting to Broadlink device...."
device.auth()
time.sleep(1)
print "Connected...."
time.sleep(1)
device.host

file = open(fileName, 'r')

myhex = file.read()

device.send_data(myhex.decode('hex'))
print "Code Sent...."

Dieses Skript ist noch nicht getestet. Erläuterung siehe unten.

4. sendmore-bl.sh

#!/usr/bin/python

import broadlink
import time
import sys

try:
    fileName = sys.argv[1]
except IndexError:
    fileName = 'null'

if fileName == 'null':
   print "Error - kein Dateiname angegeben"
   sys.exit()
else:
 device = broadlink.rm(host=("<your RM3 IP address>",80), mac=bytearray.fromhex("<your RM3 mac>"))

# print "Connecting to Broadlink device...."
 device.auth()
 time.sleep(1)
# print "Connected...."
 device.host

# Pfad aus Aufruf extrahieren und dann den Befehl selbst vom Stapel nehmen
 Parameter = sys.argv
 # Name des Befehls selbst
 filename1 = Parameter[0]
 # Gesamtlaenge
 FileNameLaenge = len(filename1)
 # in Bestandteile aufteilen
 filearray = filename1.split("/")
 # den letzten identifizieren. Das ist der eigentliche Befehl
 splitNo = len(filename1.split("/"))
 lastElement = filearray[splitNo-1]
 # den vom Aufruf wegschneiden, um den Pfad zu bekommen
 FileNameAbzug = len(lastElement)
 Ende = FileNameLaenge - FileNameAbzug
 Pfad = filename1[0:Ende]
 # Befehl aus der Liste loeschen, damit die Parameter bleiben
 Parameter.pop(0)

 # repeat for each argument
 for argument in Parameter:
    fileName = Pfad + argument +".txt"
    file = open(fileName, 'r')
    myhex = file.read()
    device.send_data(myhex.decode('hex'))
    time.sleep(0.5)
# print "Code Sent...."
sys.exit()


Dann in dem Verzeichnis noch die Dateibesitzer wechseln und die Skripte ausführbar machen:

sudo chown fhem.dialout *.sh
sudo chmod 744 *.sh

Nun gilt es, die IP und MAC-Adresse des Broadlink herauszufinden. Entweder man schaut im Router nach, benutzt die Android-App FING oder das Script "search-bl.sh". Dazu

sudo ./search-bl.sh

Beispielhaft kommt dann:


************************************************
Using python library created by Matthew Garrett
https://github.com/mjg59/python-broadlink
************************************************
Scanning network for Broadlink devices....
Found 1 broadlink devices
...............
Device 1 Host address = '192.168.1.16', 8
Device 1 MAC address = b4 43 0d aa b3 54
...............

Für später sind die IP Adresse und die MAC Adresse wichtig. Diese müssen im zweiten bis vierten Script eingetragen werden!! Ich benutze da den Editor nano.

sudo nano ./learn-bl.sh
sudo nano ./send-bl.sh
sudo nano ./sendmore-bl.sh

Dabei die doppelten Anführungszeichen stehen lassen und an der passenden Stelle jeweils die IP und an der anderen die MAC-Adresse (mit Leerzeichen anstelle der Doppelpunkte) eintragen. Das erste Script liefert die auch so formatiert. Wenn man sie aber aus dem Router hat oder so, dann eben beachten!

Das zweite Script dient zum Anlernen des Fernbedienungscodes und Abspeichern in jeweils einer txt Datei. Das Script verbindet sich mit dem Broadlink und erwartet einen Namen für den Code. Dann hat man 5 Sec Zeit, um die entsprechende Fernbedienungstaste zu drücken, um den Code anzulernen. Dieser wird dann in eine Datei mit dem Codenamen gespeichert. So kann man alle seine zu verwendenden Codes nacheinander anlernen.

sudo ./learn-bl.sh

zeigt Folgendes an:

Connecting to Broadlink device....
Connected....
Bitte Namen für den Code eingeben, z.B. tvOff test
Wenn die LED am Broadlink angeht, innerhalb von 5 Sek die FB-Taste drücken 
Hex code gespeichert unter test.txt

Mit dem dritten und vierten Script kann man den Code wieder senden. Auch hier wieder die eigene IP Adresse und MAC Adresse des Broadlink von oben eintragen.

Der Aufruf ist für das dritte Skript:

sudo /opt/BroadLink/send-bl.sh /opt/BroadLink/test.txt 

Wichtig ist bei diesem Skript, für das Textfile den ganzen Pfad anzugeben, und der in test.txt gelernte Befehl wird gesendet.

Aus FHEM heraus kann dann z.B. auf der Eingabezeile gesendet werden:

 "/opt/BroadLink/send-bl.sh /opt/BroadLink/test.txt"

Dabei sind die " " wichtig, da es sich um einen Shell-Befehl handelt.

So kann man das dann auch in at-, notify- oder DOIFs verwenden. Hier mal ein Beispiel:

define atAbendsLichtAn at *19:00:00 "/opt/BroadLink/send-bl.sh /opt/BroadLink/FB1An.txt"


Das 4. Skript "sendmore-bl.sh" ist eine Modifikation des Send-Skripts. Die Unterschiede sind:

1. Es sendet auch mehrere Codes nacheinander, also z. B. auch Zahlenfolgen wie "0202".

2. Es nimmt an, dass die Codes als .txt-Dateien im selben Verzeichnis liegen wie das Skript.

3. Das Skript gibt keine Meldungen aus. Die sind beim Aufruf aus FHEM heraus auch unnötig.


Das Skript extrahiert aus dem Befehlsaufruf den Pfad und ergänzt ihn jeweils bei den Parametern sowie um die Dateierweiterung ".txt". Daher kann der Aufruf dann kürzer sein. Angenommen, es sind die Code-Dateien 1.txt, 2.txt, 3.txt usw. im selben Verzeichnis wie die Skripte vorhanden, lautet der Aufruf dann z.B. nur noch:

/opt/BroadLink/sendmore-bl.sh 1 2 3 2


Bekannte Probleme

Man kann mit dem dritten Skript nur einzelne Tastendrücke senden. Und der Aufruf von mehreren Befehlen nacheinander liegt so weit auseinander, dass das nicht als Folge von Befehlen ankommt, sondern jeweils als Einzelbefehle. Dafür kann man das 4. Skript ausprobieren.

Hinweis

Wenn alles funktioniert, kann man aus dem dritten Skript natürlich die Bildschirmausgaben löschen, da es ja in FHEM im Hintergrund aufgerufen wird. Umgekehrt kann man sie auch im 4. Skript wieder "freischalten", indem man die # vor den "print"-Anweisungen löscht.

Gelegentlich auftretende Fehlermeldungen (die nur im Terminal sichtbar sind), tun der Funktion keinen Abbruch.