예제 #1
0
def Read_Level1_Packet_From_BT_Stream(btSocket, mylocalBTAddress):
    while True:
        #print "Waiting for SMA level 1 packet from Bluetooth stream"
        start = btSocket.recv(1)

        # Need to add in some timeout stuff here
        while start != '\x7e':
            start = btSocket.recv(1)

        length1 = btSocket.recv(1)
        length2 = btSocket.recv(1)
        checksum = btSocket.recv(1)
        SrcAdd = bytearray(btSocket.recv(6))
        DestAdd = bytearray(btSocket.recv(6))

        packet = SMABluetoothPacket(length1,
                                    length2, checksum, btSocket.recv(1),
                                    btSocket.recv(1), SrcAdd, DestAdd)

        # Read the whole byte stream unaltered (this contains ESCAPED characters)
        b = bytearray(btSocket.recv(packet.TotalPayloadLength()))

        # Populate the SMABluetoothPacket object with the bytes
        packet.pushEscapedByteArray(b)

        # Tidy up the packet lengths
        packet.finish()

        if DestAdd == mylocalBTAddress and packet.ValidateHeaderChecksum():
            break

    return packet
예제 #2
0
def logon(btSocket, mylocalBTAddress, MySerialNumber, packet_send_counter,
          InverterPasswordArray):
    # Logon to inverter
    pluspacket1 = SMANET2PlusPacket(0x0e, 0xa0, packet_send_counter,
                                    MySerialNumber, 0x00, 0x01, 0x01)
    pluspacket1.pushLong(0xFFFD040C)
    #0x07 = User logon, 0x0a = installer logon
    pluspacket1.pushLong(0x00000007)
    #Timeout = 900sec ?
    pluspacket1.pushLong(0x00000384)

    pluspacket1.pushLong(long(time.mktime(datetime.today().timetuple())))

    pluspacket1.pushLong(0x00000000)
    pluspacket1.pushByteArray(InverterPasswordArray)

    #Broadcast logon to all inverters
    send = SMABluetoothPacket(0x01, 0x01, 0x00, 0x01, 0x00, mylocalBTAddress)
    send.pushRawByteArray(pluspacket1.getBytesForSending())
    send.finish()
    send.sendPacket(btSocket)

    bluetoothbuffer = read_SMA_BT_Packet(btSocket, packet_send_counter, True,
                                         mylocalBTAddress)

    checkPacketReply(bluetoothbuffer, 0x0001)
    if bluetoothbuffer.leveltwo.errorCode() > 0:
        raise Exception(
            "Error code returned from inverter - during logon - wrong password?"
        )
예제 #3
0
def getInverterName(btSocket, packet_send_counter, mylocalBTAddress,
                    InverterCodeArray, AddressFFFFFFFF):
    send9 = SMABluetoothPacket(1, 1, 0x00, 0x01, 0x00, mylocalBTAddress,
                               AddressFFFFFFFF)
    pluspacket9 = SMANET2PlusPacket(0x09, 0xA0, packet_send_counter,
                                    InverterCodeArray, 0x00, 0x00, 0x00)
    pluspacket9.pushRawByteArray(
        bytearray([
            0x80, 0x00, 0x02, 0x00, 0x58, 0x00, 0x1e, 0x82, 0x00, 0xFF, 0x1e,
            0x82, 0x00
        ]))
    send9.pushRawByteArray(pluspacket9.getBytesForSending())
    send9.finish()
    send9.sendPacket(btSocket)
    bluetoothbuffer = read_SMA_BT_Packet(btSocket, packet_send_counter, True,
                                         mylocalBTAddress)
    if bluetoothbuffer.leveltwo.errorCode() > 0:
        print("Error code returned from inverter")

    valuetype = bluetoothbuffer.leveltwo.getTwoByteLong(40 + 1)
    # idate = bluetoothbuffer.leveltwo.getFourByteLong(40 + 4)
    # t = time.localtime(long(idate))
    if valuetype == 0x821e:
        value = bluetoothbuffer.leveltwo.getArray()[40 + 8:40 + 8 +
                                                    14].decode("utf-8")
    else:
        value = ""

    return value
예제 #4
0
def spotvalues_dc(btSocket, packet_send_counter, mylocalBTAddress,
                  InverterCodeArray, AddressFFFFFFFF):
    #print "Asking inverter for its DC spot value data...."
    send9 = SMABluetoothPacket(0x01, 0x01, 0x00, 0x01, 0x00, mylocalBTAddress,
                               AddressFFFFFFFF)
    pluspacket9 = SMANET2PlusPacket(0x09, 0xE0, packet_send_counter,
                                    InverterCodeArray, 0x00, 0x00, 0x00)
    pluspacket9.pushRawByteArray(
        bytearray([
            0x83, 0x00, 0x02, 0x00, 0x53, 0x00, 0x1f, 0x45, 0x00, 0xFF, 0x21,
            0x45, 0x00
        ]))

    send9.pushRawByteArray(pluspacket9.getBytesForSending())
    send9.finish()
    send9.sendPacket(btSocket)

    bluetoothbuffer = read_SMA_BT_Packet(btSocket, packet_send_counter, True,
                                         mylocalBTAddress)
    # This will be a multi packet reply so ignore this check
    checkPacketReply(bluetoothbuffer, 0x0001)

    if bluetoothbuffer.leveltwo.errorCode() > 0:
        print("Error code returned from inverter")

    return extract_spot_values(bluetoothbuffer.leveltwo, 28)
예제 #5
0
def logoff(btSocket, packet_send_counter, mylocalBTAddress, MySerialNumber):
    p1 = SMABluetoothPacket(0x01, 0x01, 0x00, 0x01, 0x00, mylocalBTAddress)
    data = SMANET2PlusPacket(0x08, 0xA0, packet_send_counter, MySerialNumber,
                             0x00, 0x03, 0x00)
    data.pushLong(0xFFFD010E)
    data.pushLong(0xFFFFFFFF)
    p1.pushRawByteArray(data.getBytesForSending())
    p1.finish()
    p1.sendPacket(btSocket)
    return
예제 #6
0
def spotvalues_dcwatts(btSocket, packet_send_counter, mylocalBTAddress,
                       InverterCodeArray, AddressFFFFFFFF):
    send9 = SMABluetoothPacket(1, 1, 0x00, 0x01, 0x00, mylocalBTAddress,
                               AddressFFFFFFFF)
    pluspacket9 = SMANET2PlusPacket(0x09, 0xE0, packet_send_counter,
                                    InverterCodeArray, 0x00, 0x00, 0x00)
    pluspacket9.pushRawByteArray(
        bytearray([
            0x83, 0x00, 0x02, 0x80, 0x53, 0x00, 0x00, 0x25, 0x00, 0xFF, 0xFF,
            0x25, 0x00
        ]))
    send9.pushRawByteArray(pluspacket9.getBytesForSending())
    send9.finish()
    send9.sendPacket(btSocket)
    bluetoothbuffer = read_SMA_BT_Packet(btSocket, packet_send_counter, True,
                                         mylocalBTAddress)
    if bluetoothbuffer.leveltwo.errorCode() > 0:
        print("Error code returned from inverter")
    return extract_spot_values(bluetoothbuffer.leveltwo, 28)
예제 #7
0
def request_data(btSocket,
                 packet_send_counter,
                 mylocalBTAddress,
                 MySerialNumber,
                 cmd,
                 first,
                 last,
                 susyid=0xFFFF,
                 destinationAddress=0xFFFFFFFF):

    send9 = SMABluetoothPacket(0x01, 0x01, 0x00, 0x01, 0x00, mylocalBTAddress)
    pluspacket9 = SMANET2PlusPacket(0x09, 0xA0, packet_send_counter,
                                    MySerialNumber, 0x00, 0x00, 0x00, susyid,
                                    destinationAddress)
    pluspacket9.pushLong(cmd)
    pluspacket9.pushLong(first)
    pluspacket9.pushLong(last)
    send9.pushRawByteArray(pluspacket9.getBytesForSending())
    send9.finish()
    send9.sendPacket(btSocket)
    bluetoothbuffer = read_SMA_BT_Packet(btSocket, packet_send_counter, True,
                                         mylocalBTAddress)

    if bluetoothbuffer.leveltwo.errorCode() > 0:
        return None

    leveltwo = bluetoothbuffer.leveltwo

    if (susyid != 0xFFFF and leveltwo.getDestinationSusyid() != susyid):
        raise Exception("request_data reply susy id mismatch")

    if (destinationAddress != 0xFFFFFFFF
            and leveltwo.getDestinationSerial() != destinationAddress):
        raise Exception("request_data reply destination address mismatch")

    if leveltwo.errorCode() != 0:
        raise Exception("request_data error in packet")

    #If no errors return packet
    return leveltwo
예제 #8
0
def Read_Level1_Packet_From_BT_Stream(btSocket,
                                      mylocalBTAddress=bytearray(
                                          [0x00, 0x00, 0x00, 0x00, 0x00,
                                           0x00])):
    while True:
        #print "Waiting for SMA level 1 packet from Bluetooth stream"
        start = btSocket.recv(1)

        # Need to add in some timeout stuff here
        while start != '\x7e':
            start = btSocket.recv(1)

        length1 = btSocket.recv(1)
        length2 = btSocket.recv(1)
        checksum = btSocket.recv(1)
        SrcAdd = bytearray(btSocket.recv(6))
        DestAdd = bytearray(btSocket.recv(6))

        packet = SMABluetoothPacket(length1,
                                    length2, checksum, btSocket.recv(1),
                                    btSocket.recv(1), SrcAdd, DestAdd)

        # Read the whole byte stream unaltered (this contains ESCAPED characters)
        b = bytearray(btSocket.recv(packet.TotalPayloadLength()))

        # Populate the SMABluetoothPacket object with the bytes
        packet.pushEscapedByteArray(b)

        # Tidy up the packet lengths
        packet.finish()

        # Output some progress indicators
        # print "Received Level 1 BT packet cmd={1:04x}h len={0:04x}h bytes".format(packet.TotalPayloadLength(), packet.CommandCode())
        #print packet.DisplayPacketDebugInfo("Received")
        #print ("*")

        if DestAdd == mylocalBTAddress and packet.ValidateHeaderChecksum():
            break

    return packet
예제 #9
0
def initaliseSMAConnection(btSocket, mylocalBTAddress, MySerialNumber,
                           packet_send_counter):
    # Wait for 1st message from inverter to arrive (should be an 0002 command)
    bluetoothbuffer = read_SMA_BT_Packet(btSocket, mylocalBTAddress)
    checkPacketReply(bluetoothbuffer, 0x0002)

    netid = bluetoothbuffer.levelone.getByte(4)
    #print "netid=%02x" % netid
    inverterAddress = bluetoothbuffer.levelone.SourceAddress

    # Reply to 0x0002 cmd with our data
    send = SMABluetoothPacket(0x1F, 0x00, 0x00, 0x02, 0x00, mylocalBTAddress,
                              inverterAddress)
    send.pushUnescapedByteArray(
        bytearray([
            0x00, 0x04, 0x70, 0x00, netid, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
            0x00, 0x00
        ]))
    send.finish()
    send.sendPacket(btSocket)

    # Receive 0x000a cmd
    bluetoothbuffer = read_SMA_BT_Packet(btSocket, mylocalBTAddress)
    checkPacketReply(bluetoothbuffer, 0x000a)

    # Receive 0x000c cmd (sometimes this doesnt turn up!)
    bluetoothbuffer = read_SMA_BT_Packet(btSocket, mylocalBTAddress)
    if bluetoothbuffer.levelone.CommandCode(
    ) != 0x0005 and bluetoothbuffer.levelone.CommandCode() != 0x000c:
        raise Exception("Expected different command 0x0005 or 0x000c")

    # Receive 0x0005 if we didnt get it above
    if bluetoothbuffer.levelone.CommandCode() != 0x0005:
        bluetoothbuffer = read_SMA_BT_Packet(btSocket, mylocalBTAddress)
        checkPacketReply(bluetoothbuffer, 0x0005)

    # Now the fun begins...

    send = SMABluetoothPacket(0x3f, 0x00, 0x00, 0x01, 0x00, mylocalBTAddress)
    pluspacket1 = SMANET2PlusPacket(0x09, 0xa0, packet_send_counter,
                                    MySerialNumber, 0, 0, 0)
    pluspacket1.pushLong(0x00000200)
    pluspacket1.pushLong(0x00000000)
    pluspacket1.pushLong(0x00000000)
    send.pushRawByteArray(pluspacket1.getBytesForSending())
    send.finish()
    send.sendPacket(btSocket)

    bluetoothbuffer = read_SMA_BT_Packet(btSocket, packet_send_counter, True,
                                         mylocalBTAddress)
    checkPacketReply(bluetoothbuffer, 0x0001)
    if bluetoothbuffer.leveltwo.errorCode() > 0:
        raise Exception("Error code returned from inverter")

    packet_send_counter += 1
예제 #10
0
def initaliseSMAConnection(btSocket, mylocalBTAddress, AddressFFFFFFFF,
                           InverterCodeArray, packet_send_counter):
    # Wait for 1st message from inverter to arrive (should be an 0002 command)
    bluetoothbuffer = read_SMA_BT_Packet(btSocket, mylocalBTAddress)
    checkPacketReply(bluetoothbuffer, 0x0002)

    netid = bluetoothbuffer.levelone.getByte(4)
    #print "netid=%02x" % netid
    inverterAddress = bluetoothbuffer.levelone.SourceAddress

    # LogMessageWithByteArray("inverterAddress", inverterAddress)

    # Reply to 0x0002 cmd with our data
    send = SMABluetoothPacket(0x1f, 0x00, 0x00, 0x02, 0x00, mylocalBTAddress,
                              inverterAddress)
    send.pushUnescapedByteArray(
        bytearray([
            0x00, 0x04, 0x70, 0x00, netid, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
            0x00, 0x00
        ]))
    send.finish()
    # print send.DisplayPacketDebugInfo("Reply to 0x02 cmd")
    send.sendPacket(btSocket)
    #pause()

    # Receive 0x000a cmd
    bluetoothbuffer = read_SMA_BT_Packet(btSocket, mylocalBTAddress)
    checkPacketReply(bluetoothbuffer, 0x000a)

    # Receive 0x000c cmd (sometimes this doesnt turn up!)
    bluetoothbuffer = read_SMA_BT_Packet(btSocket, mylocalBTAddress)
    if bluetoothbuffer.levelone.CommandCode(
    ) != 0x0005 and bluetoothbuffer.levelone.CommandCode() != 0x000c:
        print("Expected different command 0x0005 or 0x000c")

    # Receive 0x0005 if we didnt get it above
    if bluetoothbuffer.levelone.CommandCode() != 0x0005:
        bluetoothbuffer = read_SMA_BT_Packet(btSocket, mylocalBTAddress)
        checkPacketReply(bluetoothbuffer, 0x0005)

    # Now the fun begins...

    send = SMABluetoothPacket(0x3f, 0x00, 0x00, 0x01, 0x00, mylocalBTAddress,
                              AddressFFFFFFFF)
    pluspacket1 = SMANET2PlusPacket(0x09, 0xa0, packet_send_counter,
                                    InverterCodeArray, 0, 0, 0)
    pluspacket1.pushRawByteArray(
        bytearray([
            0x80, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00
        ]))
    send.pushRawByteArray(pluspacket1.getBytesForSending())
    send.finish()
    send.sendPacket(btSocket)

    bluetoothbuffer = read_SMA_BT_Packet(btSocket, packet_send_counter, True,
                                         mylocalBTAddress)
    checkPacketReply(bluetoothbuffer, 0x0001)
    if bluetoothbuffer.leveltwo.errorCode() > 0:
        print("Error code returned from inverter")

    packet_send_counter += 1

    inverterSerial = bluetoothbuffer.leveltwo.getDestinationAddress()
    #LogMessageWithByteArray("inverterSerial", inverterSerial)

    send = SMABluetoothPacket(0x3b, 0, 0x00, 0x01, 0x00, mylocalBTAddress,
                              AddressFFFFFFFF)
    pluspacket1 = SMANET2PlusPacket(0x08, 0xa0, packet_send_counter,
                                    InverterCodeArray, 0x00, 0x03, 0x03)
    pluspacket1.pushRawByteArray(
        bytearray([0x80, 0x0E, 0x01, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]))
    send.pushRawByteArray(pluspacket1.getBytesForSending())
    send.finish()
    send.sendPacket(btSocket)

    # No reply for packet 2 is received
    # bluetoothbuffer = readSMABluetoothPacket(ref level2Packet, btSocket, packet_send_counter, true,mylocalBTAddress);
    packet_send_counter += 1