OH 4.0.4 Broadlink binding RM3 mini error

Hi all,
I run OH 4.0.4 (on raspberry Pi 3) and have installed the broadlink binding to integrate my new RM 3 mini. I registered the remote on my wifi network via broadlink app (and aborted the process after this, to bypass the cloud registration lock), created the Thing and linked the three channels to their items (I followed a guide for creating thing/items on OH 3.2) but when I set the switch for entering learning mode nothing happens on RM 3 mini side (I mean the led remains off) and the log shows the following error: [com.github.mob41.blapi.BLDevice ] - RM2 enter learning received error: fffffffb / -5
This is my Thing configuration:

{
  "channels": [
    {
      "linkedItems": [
        "Remote_Camera_Grande_Learning_Mode"
      ],
      "uid": "broadlinkthermostat:rmuniversaldevice:7d189fe32c:learningmode",
      "id": "learningmode",
      "channelTypeUID": "broadlinkthermostat:learningmode",
      "itemType": "Switch",
      "kind": "STATE",
      "label": "Learning Mode",
      "description": "Put device in infrared learning mode when turned on",
      "defaultTags": [],
      "properties": {},
      "configuration": {}
    },
    {
      "linkedItems": [
        "Remote_Camera_Grande_Save_Learned"
      ],
      "uid": "broadlinkthermostat:rmuniversaldevice:7d189fe32c:savelearned",
      "id": "savelearned",
      "channelTypeUID": "broadlinkthermostat:savelearned",
      "itemType": "String",
      "kind": "STATE",
      "label": "Save Learned",
      "description": "Saves the learned keys using the provided name.",
      "defaultTags": [],
      "properties": {},
      "configuration": {}
    },
    {
      "linkedItems": [
        "Remote_Camera_Grande_Send_Learned"
      ],
      "uid": "broadlinkthermostat:rmuniversaldevice:7d189fe32c:sendlearned",
      "id": "sendlearned",
      "channelTypeUID": "broadlinkthermostat:sendlearned",
      "itemType": "String",
      "kind": "STATE",
      "label": "Send Learned",
      "description": "Send previously learned keys by name.",
      "defaultTags": [],
      "properties": {},
      "configuration": {}
    }
  ],
  "statusInfo": {
    "status": "ONLINE",
    "statusDetail": "NONE"
  },
  "editable": true,
  "label": "Remote Camera Grande",
  "configuration": {
    "host": "192.168.1.121",
    "macAddress": "E8:16:56:70:53:AA"
  },
  "properties": {},
  "UID": "broadlinkthermostat:rmuniversaldevice:7d189fe32c",
  "thingTypeUID": "broadlinkthermostat:rmuniversaldevice"
}

and the sitemap configuration:

Switch item=Remote_Camera_Grande_Learning_Mode label="Modalità Acquisizione" icon="switch"
Selection item=Remote_Camera_Grande_Save_Learned label="Selezione chiave di salvataggio RM" icon="settings" mappings=["OFF"="OFF","ON AUTO +1 MID"="ON AUTO +1 MID"]
Selection item=Remote_Camera_Grande_Send_Learned label="Selezione chiave di invio RM" icon="temperature" mappings=["OFF"="OFF","ON AUTO +1 MID"="ON AUTO +1 MID"]

Is there a bug of the binding? Am I missing something or doing wrong?
Any ideas?
Thanx in advance.

L.

The Binding dies not work with RM Mini. There is an openHAB 3 version I am going to migrate to openHAB 4 after the Christmas break….

1 Like

Thanx Hans for the quick reply, I’ll wait for the binding to work (hoping soon :-)). In the meanwhile I’d ask you to update the binding docs for OH 4.0.4 to point out the issue.
Best regards.

L.

No, the Broadlinkthermostat binding is not maintained by me and I don‘t use it. I am trying to migrate the Broadlink binding, which is existing aa an openHAB 3.2 beta binding only and not included in the distro.

But this will not happen too soon as I have other important things to do.

Just found this Pull Request

So I will step back from migrating the binding, but rather help to brin this PR forward…

Hi, I have been super swamped, so i was not able to work at all in it.
Mi interest in working on it is still there, but i just cannot find the time…

3 Likes

Providing a little bit more context on what is missing:

  1. Last time i did the PR, the OH developers asked to migrate the storage for the binding to use some of the newer features of OH. I had a couple of issues with making the unit tests work with the OH storage objects
  2. Once that is migrated, there is probably a bit of work to be done creating a script that can convert the previous storage to the new one, as the change is a breaking one.
  3. While this binding is fully featured, I always found that it has some terrible delays sometimes, and wanted to troubleshoot that to make it more usable.
1 Like

Someone else may be good at scripting and be able to help, or people can manually convert the text file contents.
The stance that has been made in the past is that if a binding is not yet merged, it should be considered BETA and any requested changes to get it merged are not breaking changes. I think it is great that your considering current users, but the need to get it merged after a long period of time also has to be considered. During review of the code it was probably me that made the request to change the location of the stored remote codes to use the recommended location for user data. This is to ensure the binding has rights to write to the storage device as some users are on MAC, windows or linux as their openHAB server. Less people will have issues if the storage location is the recommended place. Backups can also grab files from a consistent place.
If the storage file just needs to be manually moved, I don’t think people will be too annoyed considering this is not merged, and when it finally is they will be thankful to have it merged. If your talking about changing the contents of the storage file, then that I have not looked at and can not comment on it, but take the stance that you should not worry about changes if they make the long term sense for the binding, anyone using it currently is using it as a Alpha or Beta release. This is why the review process looks at trying to foresee issues, to reduce problems in the long run for all users.

If you get the binding merged, then more people will help test, narrow the cause down and also help code. Sometimes people don’t want to contribute before it is merged as they feel their code may not get merged and it is a waste of time, or they fully let you do the coding. Lets get it merged asap so the code is accepted and part of the project whilst we have people to reply and give permission for the code to be merged. If people move away or get hit by a bus then we may loose the ability to get permission. I normally would not take this position, but I am sure you see my point with the history of this binding getting put forward and not getting merged.
@hmerk has offered to help review and check the code which is great as he does a great job. He is now aware of the delay and can keep that in mind whilst going over the code. I have done some help already but since I do not own the hardware I can not make choices like someone that does. My interest is purely because my Logitech Harmony could get killed at any moment and I would like a path to upgrade to ready to go, plus many users want this binding.

If you need help with the delay, I could spend some $$ getting one and help out, but I am going to take the stance that I want it merged first due to the history of getting it merged.

I thank you both and previous contributors for putting the time in and working towards getting it merged, appreciate the work and look forward to seeing this merged :slight_smile:

@hmerk may be able to push changes to your branch and get this done, just need people to talk and be happy if that is done. The problem gets worse if people stop responding as they have moved away. Normally we suggest a change and wait for you to approve it or to discuss why you want to go another way as your the expert that has more background. We often can push directly to your branch if you are fine with that, then you get credit instead of a whole new PR being made and reviews needing to start from scratch again. If your busy then please can we work out a way to keep it moving forwards without feeling that we are over stepping? If you will find some time soon then that is cool, we can wait no pressure, just want to help keep it moving if your happy for someone to push to your branch and get it merged?

3 Likes

Thank you guys,
I can help testing the binding.
I’m just a OH user but tell me what to do and I’ll find the time to test and give some feedback about.
Thanx again.
Best regards.

L.

Hi all,

I would like to contribute. I managed to port the work done thus far to openhab 4.1. @ricardol are you okay if I try to take over? (as you have done much of the work).

You can find my changes at: https://github.com/AntonJansen/openhab-addons/tree/broadlink-binding-4.1.x/bundles/org.openhab.binding.broadlink

I’m also happy to give you a pull request and take it from there.

P.S.
The binding works great with my RM mini 3!

3 Likes

Hi @AntonJansen ,

It does not look like i will be able to clear my schedule anytime soon, so happy for you to take over.
Thanks.

Let me know if you want me to share the storage changes i made. They compile without issue for everything except the mock tests.
Thanks

2 Likes

@ricardol it would be great if you could share the storage changes you made. Just point me to the right location / branch to get them.

Once I got those integrated, my next step would be to get everything working again under the latest main branch of openhab addons (I have it working for 4.1, not yet aligned it with the upcoming 4.2)

After that, the testing suite needs a look and the copyright needs to be updated.

I hope I can make a start coming weekend.

3 Likes

Update, got it working with 4.2 and incorporated all the openhab-addons changes:

@ricardol I still would like to have your storage changes

Next steps are to start working on the test setup.

4 Likes

Is it possible to test this binding? I’ve just gone up to 4.1.1 from 4.0.4, but could goto 4.2.0 snapshot if required/testing is possible…

Hi Vini,

You can download a openhab 4.2.0 jar file from here:
https://github.com/AntonJansen/openhab-addons/blob/broadlink-binding-4.2.0-SNAPSHOT/bundles/org.openhab.binding.broadlink/org.openhab.binding.broadlink-4.2.0-SNAPSHOT.jar?raw=true

put it in your addons folder and let me know if things work!

3 Likes

Update: pull request has been made and it now passes all the automated checks. Waiting for code review now. You can find the request here:

3 Likes

I /think/ I’m almost there, but…

I have an RMPro+ that I am trying to utilise with OpenHAB to send RF commands. I have my commands identified and working using Python-Broadlink, but struggling to bring these into OH.

My device;

broadlink.remote.rmpro(('192.168.1.124', 80), mac=b'x\x0fw\xebI\x8a', devtype=10153, timeout=10, name='智能遥控', model='RM pro+', manufacturer='Broadlink', is_locked=False)

After adding the supplied 4.2.0.jar above, I have added my device as an RM2 using the UI.

I have then updated “broadlink.map” within Transform, to read;

FIREON=b'\xb2\x00\x9e\x02\x0b\r\n\x0e\n\r\x0b\r\n\x0e\n\r\x0b\r\n\x0e\n\x0e\x17\x0e\x18\r\x18\r\n\r\x19\r\n\r\x18\r\x18\r\n\x0e\n\r\x0b\r\x18\r\x0b\r\x18\r\n\x0e\x00\x02\x9d\x00\x01N\x12\x10\x11\x11\x11\x11\x11\x11\x10\x11\x11\x11\x11\x11\x10\x11\x11\x11\x11\x11\n\r\x0b\r\n\x0e\n\x0e\x17\r\x18\r\x19\x0c\x18\x0e\x18\x0c\x0b\r\x18\r\x0b\r\n\x0e\n\r\x0b\r\x18\r\x0b\r\x18\r\n\x0e\n\r\x18\x0e\n\r\x0b\r\x18\r\n\x0e\n\r\x0b\r\x18\r\x0b\r\n\r\x19\x0c\x18\r\x0b\r\n\x0e\n\r\x18\r\x0b\r\x18\r\x0b\r\n\r\x0b\r\x0b\r\n\r\x0b\x0e\n\x0c\x0b\x0e\t\x0e\x0b\r\x0b\r\x18\r\x18\r\x18\x0e\n\r\x18\x0c\x0b\r\x19\x0c\x18\x0e\n\r\n\x0e\n\x0e\x17\x0e\n\r\x18\x0e\n\r\x00\x02\x9e\x00\x01O\x10\x11\x11\x11\x11\x10\x11\x11\x11\x11\x11\x10\x12\x10\x11\x11\x11\x11\x11\x11\t\x0e\n\x0e\n\r\x0b\r\x18\r\x18\r\x18\r\x18\x0e\x17\r\x0b\r\x18\r\x0b\r\n\x0e\n\r\x0b\r\x18\r\x0b\r\x18\r\x0b\r\n\r\x18\x0e\n\r\n\r\x18\x0e\n\r\x0b\r\n\x0e\x17\x0e\n\x0e\n\r\x18\r\x18\x0e\n\r\x0b\r\n\r\x18\x0e\t\x0e\x18\r\n\r\x0b\r\x0b\r\n\x0e\n\r\x0b\r\n\x0e\n\r\n\x0e\x0b\r\n\x0e\x17\x0e\x17\x0e\x18\r\n\x0e\x17\r\x0b\r\x18\r\x18\r\n\x0e\n\r\x0b\r\x18\r\n\x0e\x18\r\n\x0e\x00\x02\x9d\x00\x01N\x12\x10\x11\x11\x11\x10\x12\x10\x11\x11\x11\x11\x11\x11\x10\x11\x11\x11\x11\x11\n\r\x0b\r\n\x0e\n\x0e\x17\r\x18\r\x18\x0e\x17\r\x18\r\n\x0e\x18\r\n\x0e\n\r\x0b\r\n\x0e\x18\r\x0b\r\x18\r\n\x0e\n\r\x18\r\x0b\r\n\x0e\x18\r\n\x0e\n\r\x0b\r\x18\r\n\x0e\n\r\x18\r\x18\r\n\x0e\n\r\x0b\r\x18\r\x0b\r\x18\r\n\x0e\n\x0e\n\r\x0b\r\n\r\x0b\r\n\r\x0b\r\n\x0e\n\x0e\n\x0e\x18\r\x18\r\x17\x0e\n\r\x18\r\x0b\r\x18\r\x18\r\x0b\r\n\x0e\n\r\x18\x0e\n\r\x18\x0c\x0b\r\x00\x02\x9f\x00\x01N\x10\x11\x11\x11\x11\x11\x10\x11\x11\x11\x11\x10\x12\x10\x12\x10\x11\x10\x12\x10\x0b\r\n\x0e\n\r\x0b\r\x18\r\x18\r\x18\r\x18\x0e\x17\x0e\n\r\x18\r\n\r\x0b\x0e\t\x0e\n\r\x18\x0e\x0b\r\x18\r\n\r\x0b\r\x18\r\n\x0e\n\r\x18\x0e\n\r\x0b\r\n\x0e\x17\x0e\n\r\x0b\x0c\x19\r\x18\r\n\x0e\x0b\x0c\x0b\r\x17\x0e\n\x0e\x17\x0e\n\r\x0b\r\n\x0e\n\x0e\n\r\x0b\x0c\x0b\x0e\n\r\n\r\x0b\x0e\n\x0e\x17\r\x18\r\x18\x0e\t\x0e\x18\r\n\x0e\x17\x0e\x17\x0e\n\x0e\n\r\x0b\r\x18\r\n\x0e\x17\x0e\n\x0e\x00\x02\x9d\x00\x05\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
FIREOFF=b'\xb2\x00\x9c\x02\x06\r\n\x0e\t\x0f\t\x0f\t\x0e\n\r\n\x0f\n\r\n\x0e\x17\x0e\x17\x0e\n\x0e\x17\r\x0b\r\x18\x0e\x17\r\x18\x0e\n\r\n\x0e\x17\x0e\n\x0e\x17\x0e\n\r\x00\x02\x9e\x00\x01O\x11\x10\x11\x11\x11\x11\x11\x10\x11\x11\x11\x10\x12\x10\x11\x11\x11\x11\x10\x12\n\r\n\x0e\n\x0e\n\r\x18\r\x18\r\x18\x0e\x17\r\x18\x0e\t\x0e\x18\r\n\x0e\n\r\n\x0e\n\x0e\x17\x0f\t\x0e\n\x0e\n\r\n\x0e\x17\x0e\n\r\x0b\r\x18\r\x0b\r\n\x0e\n\r\x18\r\x0b\r\n\r\x18\x0e\x17\x0e\n\x0e\t\x0e\n\r\x18\x0e\n\r\x18\r\x0b\r\n\x0e\n\x0e\n\r\n\x0e\n\x0e\n\x0e\t\r\x0b\x0e\t\x0f\n\r\n\x0e\x18\r\x17\x0e\n\x0e\x17\x0e\n\r\x18\r\x18\x0e\x17\r\x0b\r\n\x0e\x17\x0e\n\x0e\x17\x0e\t\x0e\x00\x02\x9e\x00\x01N\x12\x10\x11\x11\x11\x10\x11\x11\x11\x11\x11\x10\x12\x10\x11\x11\x11\x10\x11\x11\x0b\r\n\x0e\n\x0e\n\r\x17\x0e\x18\r\x18\x0e\x17\x0e\x17\r\n\x0e\x17\x0e\n\r\x0b\r\n\x0e\n\x0e\x17\x0f\t\r\x0b\r\n\x0e\n\x0e\x17\x0e\n\r\x0b\r\x18\r\x0b\r\n\x0e\n\r\x18\r\n\x0e\n\x0e\x17\x0e\x17\r\x0b\r\x0b\r\n\x0e\x17\x0e\n\r\x18\r\x0b\r\n\x0e\n\x0e\t\x0e\x0b\r\n\r\x0b\r\x0b\r\n\x0e\t\x0f\n\r\x0b\r\x18\r\x18\r\n\x0e\x17\x0e\n\r\x18\x0e\x17\r\x18\r\x0b\r\n\x0e\x17\x0e\n\x0e\x17\x0e\n\r\x00\x02\x9e\x00\x01N\x12\x10\x12\x10\x11\x11\x11\x10\x11\x11\x11\x11\x11\x10\x11\x11\x11\x11\x10\x11\x0b\r\x0b\r\n\x0e\n\r\x18\r\x18\r\x18\r\x18\x0e\x17\x0e\n\r\x18\x0e\t\x0e\n\x0e\t\x0e\n\x0e\x17\x0e\x0b\r\n\x0e\n\r\n\x0e\x18\r\n\r\x0b\r\x18\r\x0b\r\n\x0e\n\r\x18\r\x0b\r\x0b\r\x17\r\x18\x0e\n\x0e\t\x0e\n\r\x18\x0e\n\r\x18\r\x0b\r\n\x0e\n\x0e\n\r\x0b\r\n\x0e\n\x0e\n\r\n\x0e\n\x0e\n\r\x0b\r\x18\r\x18\r\n\x0e\x18\r\n\x0e\x17\x0e\x17\x0e\x17\r\x0b\r\n\x0e\x17\x0e\n\x0e\x17\x0e\n\r\x00\x02\x9e\x00\x01O\x11\x10\x12\x10\x11\x11\x11\x10\x11\x11\x11\x11\x11\x10\x12\x10\x11\x10\x12\x10\x0b\x0e\t\x0e\n\x0e\n\r\x18\r\x18\r\x18\x0e\x17\x0e\x17\r\x0b\x0e\x17\r\n\x0e\n\r\x0b\r\n\x0e\x17\x0f\t\x0e\n\r\x0b\x0e\t\x0e\x17\x0e\n\r\x0b\r\x18\r\x0b\r\n\x0e\n\r\x18\x0e\t\x0e\n\x0e\x17\x0e\x17\r\x0b\r\n\x0e\n\x0e\x17\x0e\n\r\x18\r\x0b\r\n\x0e\n\x0e\n\r\n\x0e\n\r\x0b\r\n\r\x0b\x0e\t\x0f\t\x0e\x0b\r\x17\x0e\x17\x0e\n\x0e\x17\r\x0b\r\x18\r\x18\r\x18\r\n\x0e\n\x0e\x17\x0e\n\r\x18\x0e\t\x0e\x00\x02\x9d\x00\x05\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

These are the codes learned using Python-Broadlink, and work when used with Python-Broadlink…

I’m a little unsure about the .items, and the need to parse a string.

This is what I currently have;

Switch FIREON "Fire ON" [ "Lighting" ] { channel="broadlink:rm2:78:0f:77:eb:49:8a:command" } 
Switch FIREOFF "Fire OFF" [ "Lighting" ] { channel="broadlink:rm2:78:0f:77:eb:49:8a:command" } 

Switch FIRE "FIRE" { channel="broadlink:rm2:feca8e1f12:command" }

The last switch shown above, uses the UI generated Thing, which you can see does NOT include the MAC address in the Channel. I’m unsure if thats required, but you can see I created a separate Thing using a .things, which DID include the MAC, to no avail…

Am I missing something simple?

When following the steps in the readme, which seem to focus on IR, and not RF, I get the following when learning.

Is there a song and dance we need to perform for RF…? When learning via other means, you usually need to learn, press and hold the button… then verify with a quick press, then save.

2024-01-14 17:59:53.744 [WARN ] [handler.BroadlinkRemoteModel2Handler] - Exception while attempting to check learnt code

java.net.ProtocolException: Response from device is not valid. (0x22=0xF6,0x23=0xFF)

at org.openhab.binding.broadlink.internal.BroadlinkProtocol.decodePacket(BroadlinkProtocol.java:192) ~[bundleFile:?]

at org.openhab.binding.broadlink.handler.BroadlinkBaseThingHandler.decodeDevicePacket(BroadlinkBaseThingHandler.java:187) ~[bundleFile:?]

at org.openhab.binding.broadlink.handler.BroadlinkRemoteHandler.extractResponsePayload(BroadlinkRemoteHandler.java:104) ~[bundleFile:?]

at org.openhab.binding.broadlink.handler.BroadlinkRemoteHandler.sendCheckDataCommandAndLog(BroadlinkRemoteHandler.java:115) [bundleFile:?]

at org.openhab.binding.broadlink.handler.BroadlinkRemoteHandler.handleLearningCommand(BroadlinkRemoteHandler.java:132) [bundleFile:?]

at org.openhab.binding.broadlink.handler.BroadlinkRemoteHandler.handleCommand(BroadlinkRemoteHandler.java:171) [bundleFile:?]

at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]

at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]

at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]

at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]

at org.openhab.core.internal.common.AbstractInvocationHandler.invokeDirect(AbstractInvocationHandler.java:147) [bundleFile:?]

at org.openhab.core.internal.common.InvocationHandlerSync.invoke(InvocationHandlerSync.java:59) [bundleFile:?]

at jdk.proxy141.$Proxy253.handleCommand(Unknown Source) [?:?]

at org.openhab.core.thing.internal.profiles.ProfileCallbackImpl.handleCommand(ProfileCallbackImpl.java:95) [bundleFile:?]

at org.openhab.core.thing.internal.profiles.SystemDefaultProfile.onCommandFromItem(SystemDefaultProfile.java:49) [bundleFile:?]

at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]

at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]

at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]

at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]

at org.openhab.core.internal.common.AbstractInvocationHandler.invokeDirect(AbstractInvocationHandler.java:147) [bundleFile:?]

at org.openhab.core.internal.common.Invocation.call(Invocation.java:52) [bundleFile:?]

at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) [?:?]

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [?:?]

at java.lang.Thread.run(Thread.java:840) [?:?]

I also want to help with testing with my RM4 mini and an Climacontrol IR based remotecontrol for switch ON/OFF.

The old jar was several years now running also on 4.1.1-1 :slight_smile:
So I stoped the openhab service and the zram and copied the new jar file to the addon folder.
I also renamed the old jar file that i NOT be used so far.
ZRAM started and OH service as well.
No real error in the logfile during startup.
The new binding is there
The old RM4mini Thing is also there and online

Now comes the question:
How can I add new strings for testing for the IR controller and save the as an command:
Could some short make an step by step information, how to add new IR comands to the OH 4.1.1-1 system?

Thanks so far…

Short term, I’ve cheated by having a dummy switch run a rule which executes a python script;

#!/usr/bin/env python3
import broadlink
device = broadlink.hello('192.168.1.124')
device.auth()
fire_on = b'\xb2\x00\x9e\x02\x0b\r\n\x0e\n\r\x0b\r\n\x0e\n\r\x0b\r\n\x0e\n\x0e\x17\x0e\x18\r\x18\r\n\r\x19\r\n\r\x18\r\x18\r\n\x0e\n\r\x0b\r\x18\r\x0b\r\x18\r\n\x0e\x00\x02\x9d\x00\x01N\x12\x10\x11\x11\x11\x11\x11\x11\x10\x11\x11\x11\x11\x11\x10\x11\x11\x11\x11\x11\n\r\x0b\r\n\x0e\n\x0e\x17\r\x18\r\x19\x0c\x18\x0e\x18\x0c\x0b\r\x18\r\x0b\r\n\x0e\n\r\x0b\r\x18\r\x0b\r\x18\r\n\x0e\n\r\x18\x0e\n\r\x0b\r\x18\r\n\x0e\n\r\x0b\r\x18\r\x0b\r\n\r\x19\x0c\x18\r\x0b\r\n\x0e\n\r\x18\r\x0b\r\x18\r\x0b\r\n\r\x0b\r\x0b\r\n\r\x0b\x0e\n\x0c\x0b\x0e\t\x0e\x0b\r\x0b\r\x18\r\x18\r\x18\x0e\n\r\x18\x0c\x0b\r\x19\x0c\x18\x0e\n\r\n\x0e\n\x0e\x17\x0e\n\r\x18\x0e\n\r\x00\x02\x9e\x00\x01O\x10\x11\x11\x11\x11\x10\x11\x11\x11\x11\x11\x10\x12\x10\x11\x11\x11\x11\x11\x11\t\x0e\n\x0e\n\r\x0b\r\x18\r\x18\r\x18\r\x18\x0e\x17\r\x0b\r\x18\r\x0b\r\n\x0e\n\r\x0b\r\x18\r\x0b\r\x18\r\x0b\r\n\r\x18\x0e\n\r\n\r\x18\x0e\n\r\x0b\r\n\x0e\x17\x0e\n\x0e\n\r\x18\r\x18\x0e\n\r\x0b\r\n\r\x18\x0e\t\x0e\x18\r\n\r\x0b\r\x0b\r\n\x0e\n\r\x0b\r\n\x0e\n\r\n\x0e\x0b\r\n\x0e\x17\x0e\x17\x0e\x18\r\n\x0e\x17\r\x0b\r\x18\r\x18\r\n\x0e\n\r\x0b\r\x18\r\n\x0e\x18\r\n\x0e\x00\x02\x9d\x00\x01N\x12\x10\x11\x11\x11\x10\x12\x10\x11\x11\x11\x11\x11\x11\x10\x11\x11\x11\x11\x11\n\r\x0b\r\n\x0e\n\x0e\x17\r\x18\r\x18\x0e\x17\r\x18\r\n\x0e\x18\r\n\x0e\n\r\x0b\r\n\x0e\x18\r\x0b\r\x18\r\n\x0e\n\r\x18\r\x0b\r\n\x0e\x18\r\n\x0e\n\r\x0b\r\x18\r\n\x0e\n\r\x18\r\x18\r\n\x0e\n\r\x0b\r\x18\r\x0b\r\x18\r\n\x0e\n\x0e\n\r\x0b\r\n\r\x0b\r\n\r\x0b\r\n\x0e\n\x0e\n\x0e\x18\r\x18\r\x17\x0e\n\r\x18\r\x0b\r\x18\r\x18\r\x0b\r\n\x0e\n\r\x18\x0e\n\r\x18\x0c\x0b\r\x00\x02\x9f\x00\x01N\x10\x11\x11\x11\x11\x11\x10\x11\x11\x11\x11\x10\x12\x10\x12\x10\x11\x10\x12\x10\x0b\r\n\x0e\n\r\x0b\r\x18\r\x18\r\x18\r\x18\x0e\x17\x0e\n\r\x18\r\n\r\x0b\x0e\t\x0e\n\r\x18\x0e\x0b\r\x18\r\n\r\x0b\r\x18\r\n\x0e\n\r\x18\x0e\n\r\x0b\r\n\x0e\x17\x0e\n\r\x0b\x0c\x19\r\x18\r\n\x0e\x0b\x0c\x0b\r\x17\x0e\n\x0e\x17\x0e\n\r\x0b\r\n\x0e\n\x0e\n\r\x0b\x0c\x0b\x0e\n\r\n\r\x0b\x0e\n\x0e\x17\r\x18\r\x18\x0e\t\x0e\x18\r\n\x0e\x17\x0e\x17\x0e\n\x0e\n\r\x0b\r\x18\r\n\x0e\x17\x0e\n\x0e\x00\x02\x9d\x00\x05\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
device.send_data(fire_on)

and

#!/usr/bin/env python3
import broadlink
device = broadlink.hello('192.168.1.124')
device.auth()
fire_off = b'\xb2\x00\x9c\x02\x06\r\n\x0e\t\x0f\t\x0f\t\x0e\n\r\n\x0f\n\r\n\x0e\x17\x0e\x17\x0e\n\x0e\x17\r\x0b\r\x18\x0e\x17\r\x18\x0e\n\r\n\x0e\x17\x0e\n\x0e\x17\x0e\n\r\x00\x02\x9e\x00\x01O\x11\x10\x11\x11\x11\x11\x11\x10\x11\x11\x11\x10\x12\x10\x11\x11\x11\x11\x10\x12\n\r\n\x0e\n\x0e\n\r\x18\r\x18\r\x18\x0e\x17\r\x18\x0e\t\x0e\x18\r\n\x0e\n\r\n\x0e\n\x0e\x17\x0f\t\x0e\n\x0e\n\r\n\x0e\x17\x0e\n\r\x0b\r\x18\r\x0b\r\n\x0e\n\r\x18\r\x0b\r\n\r\x18\x0e\x17\x0e\n\x0e\t\x0e\n\r\x18\x0e\n\r\x18\r\x0b\r\n\x0e\n\x0e\n\r\n\x0e\n\x0e\n\x0e\t\r\x0b\x0e\t\x0f\n\r\n\x0e\x18\r\x17\x0e\n\x0e\x17\x0e\n\r\x18\r\x18\x0e\x17\r\x0b\r\n\x0e\x17\x0e\n\x0e\x17\x0e\t\x0e\x00\x02\x9e\x00\x01N\x12\x10\x11\x11\x11\x10\x11\x11\x11\x11\x11\x10\x12\x10\x11\x11\x11\x10\x11\x11\x0b\r\n\x0e\n\x0e\n\r\x17\x0e\x18\r\x18\x0e\x17\x0e\x17\r\n\x0e\x17\x0e\n\r\x0b\r\n\x0e\n\x0e\x17\x0f\t\r\x0b\r\n\x0e\n\x0e\x17\x0e\n\r\x0b\r\x18\r\x0b\r\n\x0e\n\r\x18\r\n\x0e\n\x0e\x17\x0e\x17\r\x0b\r\x0b\r\n\x0e\x17\x0e\n\r\x18\r\x0b\r\n\x0e\n\x0e\t\x0e\x0b\r\n\r\x0b\r\x0b\r\n\x0e\t\x0f\n\r\x0b\r\x18\r\x18\r\n\x0e\x17\x0e\n\r\x18\x0e\x17\r\x18\r\x0b\r\n\x0e\x17\x0e\n\x0e\x17\x0e\n\r\x00\x02\x9e\x00\x01N\x12\x10\x12\x10\x11\x11\x11\x10\x11\x11\x11\x11\x11\x10\x11\x11\x11\x11\x10\x11\x0b\r\x0b\r\n\x0e\n\r\x18\r\x18\r\x18\r\x18\x0e\x17\x0e\n\r\x18\x0e\t\x0e\n\x0e\t\x0e\n\x0e\x17\x0e\x0b\r\n\x0e\n\r\n\x0e\x18\r\n\r\x0b\r\x18\r\x0b\r\n\x0e\n\r\x18\r\x0b\r\x0b\r\x17\r\x18\x0e\n\x0e\t\x0e\n\r\x18\x0e\n\r\x18\r\x0b\r\n\x0e\n\x0e\n\r\x0b\r\n\x0e\n\x0e\n\r\n\x0e\n\x0e\n\r\x0b\r\x18\r\x18\r\n\x0e\x18\r\n\x0e\x17\x0e\x17\x0e\x17\r\x0b\r\n\x0e\x17\x0e\n\x0e\x17\x0e\n\r\x00\x02\x9e\x00\x01O\x11\x10\x12\x10\x11\x11\x11\x10\x11\x11\x11\x11\x11\x10\x12\x10\x11\x10\x12\x10\x0b\x0e\t\x0e\n\x0e\n\r\x18\r\x18\r\x18\x0e\x17\x0e\x17\r\x0b\x0e\x17\r\n\x0e\n\r\x0b\r\n\x0e\x17\x0f\t\x0e\n\r\x0b\x0e\t\x0e\x17\x0e\n\r\x0b\r\x18\r\x0b\r\n\x0e\n\r\x18\x0e\t\x0e\n\x0e\x17\x0e\x17\r\x0b\r\n\x0e\n\x0e\x17\x0e\n\r\x18\r\x0b\r\n\x0e\n\x0e\n\r\n\x0e\n\r\x0b\r\n\r\x0b\x0e\t\x0f\t\x0e\x0b\r\x17\x0e\x17\x0e\n\x0e\x17\r\x0b\r\x18\r\x18\r\x18\r\n\x0e\n\x0e\x17\x0e\n\r\x18\x0e\t\x0e\x00\x02\x9d\x00\x05\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
device.send_data(fire_off)