Hallo,
wollte euch nur mal kurz meinen Workaround für die fehlende Unterstützung des neueren Broadlink RM Mini 3 des Broadlink-Adapters präsentieren.
Den Broadlink wollte ich anstelle meines Harmony Hubs verwenden, da dieser auch die "langen" IR-Codes der Klimaanlagen-Fernbedienungen beherrscht.
Ich habe auf meinem raspberry pi 4 zuerst Python3 installiert um damit das python modul von mjg59 ausführen zu können:
https://github.com/mjg59/python-broadlink/tree/master/broadlink
Dann habe ich ein Objekt mit value.temperature angelegt und in der iot-Cloud als Thermostat angelegt. Somit kann ich Alexa nun sagen "Alexa, Temperatur auf 22 Grad" und die Klimaanlage springt mit dem Wert von 22 Grad an.
Folgend noch das Blockly- und Pythonscript, welche ich verwende.
Die IR-Codes, welche im pyhton-Script zu sehen sind, lassen sich mit folgenden befehlen "abgreifen":
pyhton3 starten und folgende Befehle nacheinander ausführen:
Modul importieren:
import broadlink
Geräte suchen:
devices = broadlink.discover(timeout=5)
Prüfen ob ein Gerät gefunden wurde:
devices
Beim entsprechenden Gerät authentifizieren ([0] für das erste, [1] für das zweite, usw.)
devices[0].auth()
Lernmodus starten
devices[0].enter_learning()
Jetzt den gewünschten Knopf auf der Fernbedienung drücken und mit folgendem Befehl den Infrarotcode in der Variable ir_packet speichern:
ir_packet = devices[0].check_data()
Mit folgendem Befehl das IR-Packet anzeigen lassen. Dieses könnt ihr jetzt in das Script kopieren.
ir_packet
Hier mein Blockly:
<xml xmlns="http://www.w3.org/1999/xhtml">
<block type="on" id="QrRIF/4V=/_,M*P;9HxN" x="63" y="63">
<field name="OID">0_userdata.0.Klimaanlage.Temperatur</field>
<field name="CONDITION">any</field>
<field name="ACK_CONDITION"></field>
<statement name="STATEMENT">
<block type="controls_if" id=":;:z4vg=l9LfDAU`fB~v">
<mutation else="1"></mutation>
<value name="IF0">
<block type="logic_operation" id="Yg3s=R+AjHk_GE}V#u8C">
<field name="OP">AND</field>
<value name="A">
<block type="logic_compare" id="sTj+dwywZ[@%6J;KpYQG">
<field name="OP">GTE</field>
<value name="A">
<block type="get_value" id="pR(=wd_W=NTJ]H}nLI]/">
<field name="ATTR">val</field>
<field name="OID">0_userdata.0.Klimaanlage.Temperatur</field>
</block>
</value>
<value name="B">
<block type="math_number" id="4RM:X!y+JF77E!0tm~wE">
<field name="NUM">17</field>
</block>
</value>
</block>
</value>
<value name="B">
<block type="logic_compare" id="VAcn+5Z?#Xh41CF-]=q)">
<field name="OP">LTE</field>
<value name="A">
<block type="get_value" id="t]h|9CnIEwS~%Fs,BLuK">
<field name="ATTR">val</field>
<field name="OID">0_userdata.0.Klimaanlage.Temperatur</field>
</block>
</value>
<value name="B">
<block type="math_number" id="5gx%kjvK09#ljd26S,x*">
<field name="NUM">24</field>
</block>
</value>
</block>
</value>
</block>
</value>
<statement name="DO0">
<block type="exec" id=".Ds@YZm}wc*KK|I$s$fu">
<mutation with_statement="false"></mutation>
<field name="WITH_STATEMENT">FALSE</field>
<field name="LOG">debug</field>
<value name="COMMAND">
<shadow type="text" id=".rWvW1cX^Cj{l)L@UH{P">
<field name="TEXT">python3 /home/pi/python/19grad.py</field>
</shadow>
<block type="text_join" id="mvdwcmvPcOaBg^@):t9D">
<mutation items="2"></mutation>
<value name="ADD0">
<block type="text" id="|@zf9]5CQita7`wX9(x,">
<field name="TEXT">python3 /home/pi/python/klima.py </field>
</block>
</value>
<value name="ADD1">
<block type="get_value" id="cXIDVdty**H5!5@B}hij">
<field name="ATTR">val</field>
<field name="OID">0_userdata.0.Klimaanlage.Temperatur</field>
</block>
</value>
</block>
</value>
<next>
<block type="debug" id="gm/ffH;T69zT)S*?Ie,8">
<field name="Severity">log</field>
<value name="TEXT">
<shadow type="text" id="2[jX0q3@Ugo%|-GoiCA7">
<field name="TEXT">Klimanlage: Sende 19-Grad-Befehl.</field>
</shadow>
<block type="text_join" id="6A_|VMD-%/is]yI+OR!f">
<mutation items="3"></mutation>
<value name="ADD0">
<block type="text" id="p:yND-|@|(!S4O6,@@2r">
<field name="TEXT">Klimanlage: Sende </field>
</block>
</value>
<value name="ADD1">
<block type="get_value" id="jMC_{ttYKy1{!1Pe=5H~">
<field name="ATTR">val</field>
<field name="OID">0_userdata.0.Klimaanlage.Temperatur</field>
</block>
</value>
<value name="ADD2">
<block type="text" id="yd3?v!JtN[xH8A$R`v]=">
<field name="TEXT">-Grad-Befehl.</field>
</block>
</value>
</block>
</value>
</block>
</next>
</block>
</statement>
<statement name="ELSE">
<block type="exec" id="_4F=rl~n8UBTTpwpy4gc">
<mutation with_statement="false"></mutation>
<field name="WITH_STATEMENT">FALSE</field>
<field name="LOG">debug</field>
<value name="COMMAND">
<shadow type="text" id=".rWvW1cX^Cj{l)L@UH{P">
<field name="TEXT">python3 /home/pi/python/aus.py</field>
</shadow>
<block type="text" id="}/~p6IhgV@{LEt`tLgcJ">
<field name="TEXT">python3 /home/pi/python/klima.py 0</field>
</block>
</value>
</block>
</statement>
</block>
</statement>
</block>
</xml>
Und hier mein Python-Script:
import broadlink
import time
import sys
temp = int(sys.argv[1])
if temp == 17:
print("17 Grad!")
ir_packet = b'&\x00\xca\x00\x8c\x92\x0f7\x0f\x14\x106\x0f\x14\x0f\x14\x0f\x14\x10\x13\x115\x115\x10\x13\x11\x12\x10\x13\x10\x13\x10\x13\x107\x0f\x14\x0f\x14\x0f7\x10\x13\x0f\x14\x10\x13\x10\x13\x10\x13\x10\x13\x106\x106\x115\x106\x107\x0f7\x0f7\x0f7\x0f7\x0f7\x106\x106\x106\x115\x107\x106\x10\x13\x106\x0f\x14\x0f7\x106\x106\x11\x12\x10\x13\x10\xab\x8e\x91\x0f\x14\x0f7\x0f\x14\x0f7\x106\x106\x115\x10\x13\x10\x13\x106\x106\x106\x107\x0f7\x10\x13\x0f7\x0f7\x0f\x14\x106\x0f7\x106\x106\x106\x106\x11\x12\x10\x13\x10\x13\x10\x13\x10\x13\x10\x13\x10\x14\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x0f7\x10\x13\x0f7\x10\x13\x10\x13\x10\x13\x106\x106\x10\x00\r\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
elif temp == 18:
print("18 Grad!")
ir_packet = b'&\x00\xca\x00\x8d\x91\x0f7\x0f\x14\x0f7\x10\x13\x10\x13\x10\x13\x10\x13\x106\x106\x10\x13\x10\x14\x0f\x14\x0f\x14\x0f\x14\x0f7\x0f\x14\x0f\x14\x106\x10\x13\x10\x13\x10\x13\x10\x13\x10\x13\x106\x107\x0f7\x0f7\x0f7\x106\x106\x106\x106\x107\x0f7\x0f7\x0f7\x106\x106\x106\x107\x0f\x14\x0f7\x0f\x14\x0f7\x0f7\x106\x10\x13\x106\x10\xac\x8d\x91\x10\x13\x106\x10\x14\x0f7\x0f7\x106\x106\x10\x13\x10\x13\x106\x107\x0f7\x0f7\x0f7\x10\x13\x106\x106\x10\x13\x106\x107\x0f7\x0f7\x106\x10\x13\x10\x13\x10\x13\x10\x13\x10\x13\x10\x13\x10\x14\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x11\x12\x10\x13\x10\x13\x10\x13\x106\x10\x13\x106\x10\x14\x0f\x14\x0f\x14\x0f7\x0f\x14\x0f\x00\r\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
elif temp == 19:
print("19 Grad!")
ir_packet = b'&\x00\xca\x00\x8d\x91\x106\x0f\x14\x0f7\x10\x13\x10\x13\x10\x13\x10\x13\x106\x115\x10\x13\x10\x14\x0f\x14\x0f\x14\x0f\x14\x0f7\x10\x13\x10\x13\x106\x11\x12\x11\x12\x11\x12\x10\x13\x106\x10\x13\x107\x106\x106\x106\x106\x106\x115\x115\x115\x116\x106\x106\x106\x106\x106\x115\x10\x13\x106\x10\x13\x107\x0f7\x0f7\x106\x106\x10\xab\x8d\x91\x10\x14\x0f7\x0f\x14\x0f7\x0f7\x0f7\x106\x10\x13\x10\x13\x106\x106\x106\x106\x106\x10\x14\x0f7\x0f7\x0f\x14\x0f7\x0f7\x106\x106\x10\x13\x106\x10\x13\x10\x13\x10\x13\x10\x13\x10\x13\x10\x13\x10\x13\x10\x13\x10\x13\x10\x14\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x0f7\x0f\x14\x0f7\x10\x13\x10\x13\x10\x13\x10\x13\x10\x13\x10\x00\r\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
elif temp == 20:
print("20 Grad!")
ir_packet = b'&\x00\xca\x00\x8d\x91\x0f7\x0f\x14\x115\x10\x13\x10\x13\x10\x13\x10\x13\x124\x107\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x11\x12\x0f7\x11\x12\x10\x13\x106\x10\x13\x10\x13\x10\x13\x10\x14\x0f7\x0f7\x115\x0f7\x106\x106\x106\x107\x0f7\x0f7\x0f7\x106\x106\x106\x106\x125\x0f7\x0f7\x10\x13\x106\x10\x13\x106\x106\x107\x0f7\x0f\x14\x0f\xac\x8d\x91\x11\x13\x0f7\x0f\x14\x0f7\x106\x106\x106\x12\x12\x0f\x14\x0f7\x0f7\x0f7\x115\x106\x10\x13\x106\x107\x0f\x14\x0f7\x0f7\x106\x106\x10\x13\x10\x13\x10\x13\x10\x13\x10\x14\x0f\x14\x0f\x14\x11\x12\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x10\x13\x10\x13\x10\x13\x12\x11\x10\x13\x10\x13\x106\x10\x14\x0f7\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x115\x10\x00\r\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
elif temp == 21:
print("21 Grad!")
ir_packet = b'&\x00\xca\x00\x8d\x91\x106\x10\x14\x0f7\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x0f7\x106\x10\x13\x12\x11\x10\x13\x10\x13\x10\x13\x107\x0f\x14\x0f\x14\x115\x0f\x14\x10\x13\x10\x13\x106\x10\x13\x10\x13\x106\x107\x0f7\x0f7\x0f7\x106\x106\x106\x106\x107\x0f7\x0f7\x106\x106\x106\x106\x10\x14\x0f7\x0f\x14\x0f7\x115\x11\x12\x10\x13\x10\x13\x10\xab\x8e\x91\x10\x13\x106\x10\x13\x106\x107\x0f7\x0f7\x10\x13\x10\x13\x106\x106\x106\x107\x0f7\x0f\x14\x0f7\x106\x10\x13\x106\x106\x107\x0f\x14\x0f7\x0f7\x10\x13\x11\x12\x10\x13\x10\x13\x10\x13\x10\x13\x12\x11\x10\x13\x10\x14\x0f\x14\x0f\x14\x10\x13\x0f\x14\x0f\x14\x11\x12\x10\x13\x115\x10\x13\x106\x10\x13\x10\x14\x115\x115\x0f7\x11\x00\r\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
elif temp == 22:
print("22 Grad!")
ir_packet = b'&\x00\xca\x00\x8d\x91\x115\x11\x13\x106\x10\x13\x10\x13\x10\x13\x0f\x14\x106\x106\x11\x12\x11\x12\x11\x12\x11\x12\x11\x12\x115\x11\x13\x10\x13\x106\x10\x13\x0f\x14\x0f\x14\x106\x10\x13\x115\x115\x106\x116\x106\x106\x106\x106\x106\x106\x115\x115\x107\x0f7\x0f7\x106\x106\x11\x12\x115\x11\x12\x106\x116\x0f\x14\x0f\x14\x0f7\x0f\xac\x8d\x91\x11\x12\x106\x10\x14\x0f7\x0f7\x115\x0f7\x10\x13\x10\x13\x106\x106\x124\x106\x106\x10\x14\x0f7\x0f7\x0f\x14\x0f7\x0f7\x0f7\x10\x13\x106\x10\x13\x10\x13\x12\x11\x10\x13\x10\x13\x12\x11\x10\x13\x10\x13\x10\x13\x10\x14\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x0f7\x0f\x14\x0f7\x11\x12\x10\x13\x106\x106\x10\x13\x10\x00\r\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
elif temp == 23:
print("23 Grad!")
ir_packet = b'&\x00\xca\x00\x8d\x91\x106\x11\x12\x106\x10\x13\x10\x13\x10\x13\x10\x14\x0f7\x0f7\x0f\x14\x10\x13\x10\x13\x10\x13\x10\x13\x106\x12\x11\x10\x13\x125\x0f\x14\x0f\x14\x0f\x14\x0f7\x106\x10\x13\x124\x124\x107\x0f7\x0f7\x106\x106\x106\x107\x0f7\x115\x106\x106\x124\x107\x0f7\x0f\x14\x0f7\x10\x13\x106\x124\x10\x14\x0f7\x0f7\x10\xab\x8e\x91\x10\x13\x106\x10\x13\x107\x0f7\x0f7\x106\x10\x13\x10\x13\x106\x107\x0f7\x0f7\x106\x10\x13\x106\x106\x10\x14\x0f7\x0f7\x0f7\x10\x13\x10\x13\x106\x10\x13\x10\x14\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x10\x13\x10\x13\x10\x13\x10\x13\x10\x13\x12\x11\x10\x13\x10\x14\x0f\x14\x0f7\x0f\x14\x0f7\x10\x13\x10\x13\x106\x10\x13\x10\x13\x10\x00\r\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
elif temp == 24:
print("24 Grad!")
ir_packet = b'&\x00\xca\x00\x8d\x91\x116\x11\x12\x0f7\x0f\x14\x10\x13\x10\x13\x10\x13\x106\x115\x10\x13\x10\x14\x0f\x14\x0f\x14\x0f\x14\x106\x10\x13\x10\x13\x115\x12\x11\x10\x13\x11\x12\x107\x0f7\x106\x106\x106\x115\x106\x107\x0f7\x0f7\x106\x115\x115\x107\x0f7\x0f7\x0f7\x106\x115\x10\x13\x107\x0f\x14\x0f7\x0f7\x10\x13\x106\x10\x13\x10\xac\x8d\x91\x11\x12\x106\x10\x14\x0f7\x0f7\x0f7\x106\x10\x13\x10\x13\x106\x107\x0f7\x0f7\x106\x10\x13\x106\x106\x10\x14\x0f7\x0f7\x115\x10\x13\x10\x13\x11\x12\x10\x13\x10\x13\x10\x13\x10\x14\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x0f\x14\x10\x13\x10\x13\x10\x13\x10\x13\x12\x11\x106\x10\x13\x107\x11\x12\x0f\x14\x0f7\x11\x12\x106\x11\x00\r\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
elif temp == 0:
print("Aus!")
ir_packet = b'&\x00\xca\x00\x8e\x90\x133\x13\x10\x124\x12\x11\x12\x12\x11\x12\x10\x13\x106\x11\x12\x10\x13\x11\x12\x11\x12\x11\x12\x11\x12\x115\x11\x13\x10\x13\x106\x10\x13\x10\x13\x10\x13\x11\x12\x115\x115\x116\x106\x106\x106\x106\x106\x115\x115\x115\x115\x116\x106\x106\x106\x106\x115\x115\x115\x11\x12\x134\x106\x106\x106\x10\x13\x10\xab\x8f\x90\x10\x13\x106\x10\x13\x115\x115\x115\x115\x11\x13\x106\x106\x124\x106\x106\x115\x11\x12\x115\x115\x11\x12\x133\x133\x125\x106\x10\x13\x10\x13\x10\x13\x10\x13\x10\x13\x10\x13\x10\x13\x10\x13\x11\x12\x11\x12\x11\x12\x11\x12\x11\x12\x11\x13\x10\x13\x10\x13\x10\x13\x10\x13\x10\x13\x10\x13\x106\x11\x12\x11\x12\x11\x12\x11\x12\x115\x11\x00\r\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
devices = broadlink.discover(timeout=1)
print("Folgendes Gerät wurde gefunden:")
print(devices)
devices[0].auth()
print("IR-Paket gesendet:")
print(ir_packet)
devices[0].send_data(ir_packet)
print("Befehl gesendet!")
Bei Fragen einfach fragen.