All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.mob41.blapi.MP1Device Maven / Gradle / Ivy

/*******************************************************************************
 * MIT License
 *
 * Copyright (c) 2016, 2017 Anthony Law
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 *
 * Contributors:
 *      - Anthony Law (mob41) - Initial API Implementation
 *      - bwssytems
 *      - Christian Fischer (computerlyrik)
 *******************************************************************************/

package com.github.mob41.blapi;

import java.io.IOException;
import java.net.DatagramPacket;

import javax.xml.bind.DatatypeConverter;

import com.github.mob41.blapi.mac.Mac;
import com.github.mob41.blapi.pkt.CmdPayload;
import com.github.mob41.blapi.pkt.Payload;

public class MP1Device extends BLDevice {
    /**
     * Generic way to create a MP1Device
     * @param deviceType Device Type
     * @param deviceDesc Friendly device description
     * @param host The target Broadlink hostname
     * @param mac The target Broadlink MAC address
     * @throws IOException Problems on constructing socket
     */
    protected MP1Device(short deviceType, String deviceDesc, String host, Mac mac) throws IOException{
        super(deviceType, deviceDesc, host, mac);
    }
    
    /**
     * Creates a MP1Device client instance
     * 
     * @param host
     *            The target Broadlink hostname
     * @param mac
     *            The target Broadlink MAC address
     * @throws IOException
     *             Problems on constructing socket
     */
    public MP1Device(String host, Mac mac) throws IOException {
        super(BLDevice.DEV_MP1, BLDevice.DESC_MP1, host, mac);
    }

    /**
     * Set the power state
     * @param sid The SID
     * @param state Power State
     * @throws Exception
     */
    public void setState(int sid, boolean state) throws Exception {
        int sid_mask = 0x01 << (sid - 1);
        setStateMask(sid_mask, state);
    }

    private void setStateMask(final int sid_mask, final boolean state) throws Exception {
        // """Sets the power state of the smart power strip."""
        DatagramPacket packet = sendCmdPkt(new CmdPayload() {

            @Override
            public byte getCommand() {
                return 0x6a;
            }

            @Override
            public Payload getPayload() {
                return new Payload() {

                    @Override
                    public byte[] getData() {
                        byte[] b = new byte[16];
                        b[0x00] = (byte) (0x0d);
                        b[0x02] = (byte) (0xa5);
                        b[0x03] = (byte) (0xa5);
                        b[0x04] = (byte) (0x5a);
                        b[0x05] = (byte) (0x5a);
                        b[0x06] = (byte) (0xb2 + (state ? (sid_mask << 1) : sid_mask));
                        b[0x07] = (byte) (0xc0);
                        b[0x08] = (byte) (0x02);
                        b[0x0a] = (byte) (0x03);
                        b[0x0d] = (byte) (sid_mask);
                        b[0x0e] = (byte) (state ? sid_mask : 0);
                        return b;
                    }

                };
            }

        });

        byte[] data = packet.getData();

        int err = data[0x22] | (data[0x23] << 8);

        if (err == 0) {
        	log.debug("MP1 set state mask received encrypted bytes: " + DatatypeConverter.printHexBinary(data));
        } else {
            log.warn("MP1 set state mask received returned err: " + Integer.toHexString(err) + " / " + err);        	
        }
    }
    
    public boolean getStateByIndex(int index) throws Exception{
        return getStates()[index];
    }

    public boolean[] getStates() throws Exception {
        // """Returns the power state of the smart power strip."""
        byte state = getStatesRaw();
        boolean[] data = new boolean[4];
        data[0] = ((state & 0x01) != 0) ? true : false;
        data[1] = ((state & 0x02) != 0) ? true : false;
        data[2] = ((state & 0x04) != 0) ? true : false;
        data[3] = ((state & 0x08) != 0) ? true : false;
        return data;
    }
    
    private byte getStatesRaw() throws Exception {
        // """Returns the power state of the smart power strip in raw format."""
        DatagramPacket packet = sendCmdPkt(new CmdPayload() {

            @Override
            public byte getCommand() {
                return 0x6a;
            }

            @Override
            public Payload getPayload() {
                return new Payload() {

                    @Override
                    public byte[] getData() {
                        byte[] b = new byte[16];
                        b[0x00] = (byte) (0x0a);
                        b[0x02] = (byte) (0xa5);
                        b[0x03] = (byte) (0xa5);
                        b[0x04] = (byte) (0x5a);
                        b[0x05] = (byte) (0x5a);
                        b[0x06] = (byte) (0xae);
                        b[0x07] = (byte) (0xc0);
                        b[0x08] = (byte) (0x01);
                        return b;
                    }

                };
            }

        });

        byte[] data = packet.getData();

        log.debug("MP1 get states raw received encrypted bytes: " + DatatypeConverter.printHexBinary(data));

        int err = data[0x22] | (data[0x23] << 8);

        if (err == 0) {
            byte[] pl = decryptFromDeviceMessage(data);
            log.debug("MP1 get states raw received bytes (decrypted): " + DatatypeConverter.printHexBinary(pl));
            byte state = 0;
            if (pl[0x3c] >= 48 && pl[0x3c] <= 57) {
                String decodeValue1;
                decodeValue1 = String.valueOf(pl[0x46]);
                state = Short.decode(decodeValue1).byteValue();
            } else {
                state = pl[0x46];
            }
            return state;
        } else {
            log.warn("MP1 get states raw received an error: " + Integer.toHexString(err) + " / " + err);
        }
        return 0;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy