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
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?" )
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
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)
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
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)
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
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
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
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