Monthly Archives: June 2023

Automatic roller blinds RF 433 MHz

This post describes trying to control electric roller blinds made by Jysk using a simple RF transmitter and Raspberry Pi. It is just some quick notes, because I don’t have time to describe it in detail.
JYSK HUGLO: https://jysk.no/gardiner/rullegardiner/blackout/rullegardin-huglo-142×190-gra-elektrisk
There are some online references on how to get it to work with Homey (I think), but they didn’t give details on the RF signal.

The blinds use a simple on-off-keying protocol at 433 MHz. It is not compatible with common Arduino libraries that can receive such signals, like rc-switch, IRRemote (other libraries were tried, but I unfortunately didn’t ). It is controlled with a 15-channel battery operated remote control, with buttons for Up, Stop and Down.

The signal was captured using an RTL-SDR dongle and Universal Radio Hacker (https://github.com/jopohl/urh).

The signal for up or down is repeated 12 times over almost a second, but the last 6 pulses have a slightly different code.

Each transmission packet lasts about 57.8 ms including a pause between packets. The picture above shows the demodulated view. The packet can be described as a series of 350 μs intervals. Everything is aligned to 350 μs. One pulse highlighted below.

One raw RF data file here; Sorry – I can’t upload this in wordpress.

  • ch2 up
  • ch2 stop
  • ch2 down
  • ch1 up
  • ch1 stop
  • ch1 down
  • other unknown

The signals are encoded, but for the purpose of reproduction, it’s fine to set each 350 μs block as one bit, receiving=1 and off=0. Then the signals for channel 1 are:

up_command=”fffc349b6d36d369369269a49249a49a498″
stop_command=”fffc349b6d36d369369269a49249a69a698″
down_command=”fffc349b6d36d369369269a49249a4da4d8″

This includes a sync pulse at the start of the signal.

The can be sent using a Raspberry Pi (and an RF transmitter module) using the pigpio library. The following python script is custom made only for my purposes, but the make_wave and send_wave functions could be useful for someone trying to do the same. Control code: https://github.com/famake3/controllers/blob/master/mqtt-pi-node/vindu.py#L38. The code uses pigpio in order to better control the timing of the output. pigpio handles GPIO in its own daemon process.

    def make_wave(self, pi, rf_pin, rf_pulse_time, hex_string):
        bin_string = bin(int(hex_string, 16))[2:].zfill(len(hex_string)*4)
        waves = []
        pin_mask = 1<<rf_pin
        for bit in bin_string:
            wave = []
            # Set the pin high or low depending on the bit value
            wave = [
                    pigpio.pulse(
                            pin_mask if bit == '1' else 0,
                            pin_mask if bit == '0' else 0,
                            rf_pulse_time*1e6
                            )
                    ]
            waves.extend(wave)
        # Always return to zero
        waves.append(pigpio.pulse(0, pin_mask, rf_pulse_time*1e6))
        pi.wave_add_generic(waves)
        return pi.wave_create()


    def send_wave(self, wave_id):
        #print("SENDING WAVE", wave_id)
        for _ in range(self.num_repeat_packets):
            self.pi.wave_send_once(wave_id)
            time.sleep(self.packet_unit_time)

To send, wire up a transmitter module to a pin on Raspberry Pi.