// // DetailBLEWorkUtil.swift // SolarBT // // Created by weclouds on 2019/11/4. // Copyright © 2019 weclouds. All rights reserved. // import UIKit struct Pool { var count : Int var container : [String:String] init() { self.container = [String:String]() self.count = 0 } //判断是否为空 func isEmpty() -> Bool { return container.keys.count == 0 } //判断池子是否已经满了 达到一定的数量就满了 func size() -> Int { return container.keys.count } //清空池子 mutating func clear() { container.removeAll() } //往池子里添加元素 mutating func add(_ key :String,_ value : String) { container[key] = value count += 1 } } class PoolWork : NSObject { /* 输入 :读取回来一次数据 Pool1 输出 :输出pool2的数据 */ var pool1 : Pool! var pool2 : Pool! var maxSize : Int //最大长度 override init() { pool1 = Pool() pool2 = Pool() maxSize = 0 } func run() { pool2.clear() //记录pool1 的数量 maxSize = pool1.count pool2 = pool1 } func getData() -> Pool { //断言 assert(pool2.count < maxSize, "数据不足 ,无法提供数据") return pool2 } /*1 Start 2 Pause */ } class DetailBLEWorkUtil: NSObject { var pool1 : Pool! var pool2 : Pool! var isOld : Bool? = false var cumulativeDict : [String: Any] = [String: Any]() var deviceDetailData: [String: Any] = [String: Any]() var dataDict : [String: Any] = [String: Any]() var paramDataDict : [String: Any] = [String: Any]() var realDataDict : [String:Any] = [String:Any]() var cumulativeDataDict : [String :Any] = [String: Any]() /// 累计数据 let key: DeviceDictKey = DeviceDictKey() var historyDataArr: [[String: String]] = [[String: String]]() static var share : DetailBLEWorkUtil = { let tool = DetailBLEWorkUtil() return tool }() override init() { pool1 = Pool() pool2 = Pool() } func sendRealStatusCMD() {//0.850956+0800 0.513711+0800 if self.isOld == true { let arr = ["FF03000A0001","FF03E0030001","FF03E0080001","FF030100000A","FF0301200003"] BabyBluetoothSwift.shareInstance()?.loopWriteDataWite(arr, type: "RealStatus", completionHandler: { (result) in log.debug("返回数据 --- \(ReceiveData)") self.realdata_000A(result!["FF03000A0001"] as! String) self.realdata_E003(result!["FF03E0030001"] as! String) self.realdata_E008(result!["FF03E0080001"] as!String) self.realdata_0100(result!["FF030100000A"] as! String) self.realdata_0120(result!["FF0301200003"] as! String) }) }else{ let arr = ["FF03000A0001","FF03E0030001","FF03E0080001","FF0300FD000D"] BabyBluetoothSwift.shareInstance()?.loopWriteDataWite(arr,type: "RealStatus", completionHandler: { (result) in log.debug("返回数据 --- \(result)") self.realdata_000A(result!["FF03000A0001"] as! String) self.realdata_00FD(result!["FF0300FD000D"] as! String) self.realdata_E003(result!["FF03E0030001"] as! String) self.realdata_E008(result!["FF03E0080001"] as!String) }) } } } extension DetailBLEWorkUtil{ //实时数据 func realdata_000A(_ reciveData : String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") //系统支持的最高电压 let num00 = UUUtils.numberHexString(str0.subString(start: 7 , length: 2)) log.debug("额定充电电流: \(num00!)") realDataDict[key.MaxVolt] = "\(num00!)" pool1.add(key.MaxVolt, "\(num00!)") deviceDetailData[key.MaxVolt] = "\(num00!)" let num0 = UUUtils.numberHexString(str0.subString(start: 7 + 2, length: 2)) log.debug("额定充电电流: \(num0!)") // dataDict[key.IchageRage] = "\(num0!)" realDataDict[key.IchageRage] = "\(num0!)" pool1.add(key.IchageRage, "\(num0!)") deviceDetailData[key.IchageRage] = "\(num0!)" } func realdata_E003(_ reciveData : String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") //e003 // FF let FF = str0.subString(start: 7 , length: 2) if FF == "FF"{ // dataDict[key.autoRecognition] = "1" realDataDict[key.autoRecognition] = "1" pool1.add(key.autoRecognition, "1") deviceDetailData[key.autoRecognition] = "1" }else{ // dataDict[key.autoRecognition] = "0" realDataDict[key.autoRecognition] = "0" pool1.add(key.autoRecognition, "0") deviceDetailData[key.autoRecognition] = "0" } // 判断是否自动识别 let num0 = UUUtils.numberHexString(str0.subString(start: 7 + 2 , length: 2)) log.debug("系统电压设置 - \(num0!)") deviceDetailData[key.BatRateVolt] = "\(num0!)" realDataDict[key.BatRateVolt] = "\(num0!)" pool1.add(key.BatRateVolt, "\(num0!)") } func realdata_E008(_ reciveData : String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") //e003 //e008 let num5 = UUUtils.numberHexString(str0.subString(start: 7 , length: 4)) log.debug("提升充电电压/过充返回电压\(num5!.floatValue * 0.1)") deviceDetailData[key.BatImprovChgVolt] = "\(String(format: "%.1f", num5!.floatValue * 0.1))" realDataDict[key.BatImprovChgVolt] = "\(String(format: "%.1f", num5!.floatValue * 0.1))" } //读取名称 func readdata_0049(_ reciveData : String){ let str0 = reciveData log.debug("处理真实数据 - \(str0)") var productNameDict : [String:String] = [String:String]() if self.isOld == true { productNameDict[key.productName] = "" deviceDetailData[key.productName] = "" }else{ var num5 = UUUtils.string(fromHexString: str0.subString(start: 7 , length: str0.count - 12)) log.debug("要解析的十六进制 \( str0.subString(start: 7 , length: str0.count - 12))") num5 = num5?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白 log.debug("设备名称 \(num5)") //f16d33 575578 e565b 065fd8 0906ed179 if num5 == nil || num5 == "" { let ChineseString = UUUtils.deUnicodeString(fromHexString: str0.subString(start: 7 , length: str0.count - 12)) productNameDict[key.productName] = ChineseString deviceDetailData[key.productName] = ChineseString log.debug("设备中文名称 \(ChineseString!)") }else{ productNameDict[key.productName] = num5 deviceDetailData[key.productName] = num5 } } } func real_000B000F(_ reciveData : String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") //1400 //额定放电电流 let num00 = UUUtils.numberHexString(str0.subString(start: 7, length: 2)) log.debug("额定放电电流:\(num00!)") deviceDetailData[key.idischagRate] = "\(num00!)" //产品类型 let num0 = UUUtils.numberHexString(str0.subString(start: 9, length: 2)) log.debug("产品类型:\(num0)") var device_type = "" switch num0?.intValue { case 0: device_type = "Controller_household".da_localizedStr() case 1: device_type = "Controller_street_light".da_localizedStr() case 3: device_type = "Inverter".da_localizedStr() case 4: device_type = "All-in-one_inverter".da_localizedStr() default: break } deviceDetailData[key.device_type] = device_type var num1 = UUUtils.string(fromHexString: str0.subString(start: 11, length: 32)) num1 = num1?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白 log.debug("产品型号\(num1)") deviceDetailData[key.product_type] = num1! //软件版本 // let num2 = UUUtils.numberHexString(str0.subString(start: 11 + 32, length: 8)) let a = UUUtils.numberHexString(str0.subString(start: 11 + 32, length: 2)) let b = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2, length: 2)) let c = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2 + 2, length: 2)) let d = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2 + 2 + 2, length: 2)) log.debug("软件版本 : V \(b!).\(c!).\(d!)") deviceDetailData[key.softWareCersion] = "V\(b!).\(c!).\(d!)" //硬件版本 let m1 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8, length: 2)) let m2 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2, length: 2)) let m3 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2 + 2, length: 2)) let m4 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2 + 2 + 2, length: 2)) log.debug("硬件版本 : V\(m2!).\(m3!).\(m4!)") // 序列号 deviceDetailData[key.hardWareCersion] = "V \(m2!).\(m3!).\(m4!)" // let num4 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 , length: 8)) let num41 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 , length: 2)) let num42 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 2 , length: 2)) let num43 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 4 , length: 4)) //补足5位 log.debug("\( String(format: "%05d", num43!.intValue))") // 年月(低十六位) deviceDetailData[key.productSN] = "\(num41!)\(num42!)\( String(format: "%05d", num43!.intValue))" } func realdata_000B(_ reciveData : String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") //1400 //额定放电电流 let num00 = UUUtils.numberHexString(str0.subString(start: 7, length: 2)) log.debug("额定放电电流:\(num00!)") deviceDetailData[key.idischagRate] = "\(num00!)" //产品类型 let num0 = UUUtils.numberHexString(str0.subString(start: 9, length: 2)) log.debug("产品类型:\(num0)") var device_type = "" switch num0?.intValue { case 0: device_type = "Controller_household".da_localizedStr() case 1: device_type = "Controller_street_light".da_localizedStr() case 3: device_type = "Inverter".da_localizedStr() case 4: device_type = "All-in-one_inverter".da_localizedStr() default: break } deviceDetailData[key.device_type] = device_type var num1 = UUUtils.string(fromHexString: str0.subString(start: 11, length: 32)) num1 = num1?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白 log.debug("产品型号\(num1)") deviceDetailData[key.product_type] = num1! //软件版本 // let num2 = UUUtils.numberHexString(str0.subString(start: 11 + 32, length: 8)) let a = UUUtils.numberHexString(str0.subString(start: 11 + 32, length: 2)) let b = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2, length: 2)) let c = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2 + 2, length: 2)) let d = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2 + 2 + 2, length: 2)) log.debug("软件版本 : V \(b!).\(c!).\(d!)") deviceDetailData[key.softWareCersion] = "V\(b!).\(c!).\(d!)" //硬件版本 let m1 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8, length: 2)) let m2 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2, length: 2)) let m3 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2 + 2, length: 2)) let m4 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2 + 2 + 2, length: 2)) log.debug("硬件版本 : V\(m2!).\(m3!).\(m4!)") // 序列号 deviceDetailData[key.hardWareCersion] = "V \(m2!).\(m3!).\(m4!)" // let num4 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 , length: 8)) let num41 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 , length: 2)) let num42 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 2 , length: 2)) let num43 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 4 , length: 4)) //补足5位 log.debug("\( String(format: "%05d", num43!.intValue))") // 年月(低十六位) deviceDetailData[key.productSN] = "\(num41!)\(num42!)\( String(format: "%05d", num43!.intValue))" // var num5 = UUUtils.string(fromHexString: str0.subString(start: 255 , length: 32)) // 最大32字节 12568哦哦哦泈色系儿子儿媳妇 var num5 = UUUtils.string(fromHexString: str0.subString(start: 255 , length: 64)) log.debug("要解析的十六进制 \( str0.subString(start: 255 , length: 64))") num5 = num5?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白 log.debug("设备名称 \(num5)") //f16d33 575578 e565b 065fd8 0906ed179 if num5 == nil || num5 == "" { let ChineseString = UUUtils.deUnicodeString(fromHexString: str0.subString(start: 255 , length: 64)) // ff ff deviceDetailData[key.productName] = ChineseString log.debug("设备中文名称 \(ChineseString!)") }else{ deviceDetailData[key.productName] = num5 } let year = UUUtils.numberHexString(str0.subString(start: 75, length: 2)) let mouth = UUUtils.numberHexString(str0.subString(start: 75 + 2, length: 2)) let day = UUUtils.numberHexString(str0.subString(start: 75 + 2, length: 2)) log.debug("生产日期 : \(year!)-\(mouth!)-\(day!)") } //温度处理 func temp(with num:NSNumber)-> String{ let numInt = num.intValue // let q1 = UUUtils.numberHexString(q)?.intValue let q2 = numInt & 128 print("判断正负\(q2)") if q2 != 128 { log.debug("温度\(num.floatValue )") return "\(num.intValue )" }else{ log.debug("温度: -\(numInt & 127 )") return "-\(numInt & 127 )" } } //1s刷新一次 //实时数据 func realdata_00FD(_ reciveData : String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") var num0A = UUUtils.getBinaryByHex(str0.subString(start: 11 , length: 8)) let num0A_1 = num0A?.subString(start: 0, length: 16) let num0A_2 = num0A?.subString(start: 16, length: 16) let num0A_II = num0A_2! + num0A_1! num0A = num0A_II log.debug("太阳能板状态\(num0A!)") var solarStatusStr = "" let B30 = num0A?.subString(start: 1, length: 1) let B29 = num0A?.subString(start: 2, length: 1) let B28 = num0A?.subString(start: 3, length: 1) let B27 = num0A?.subString(start: 4, length: 1) let B26 = num0A?.subString(start: 5, length: 1) let B25 = num0A?.subString(start: 6, length: 1) let B24 = num0A?.subString(start: 7, length: 1) let B23 = num0A?.subString(start: 8, length: 1) //负载 let B20 = num0A?.subString(start: 11, length: 1) let B19 = num0A?.subString(start: 12, length: 1) let B15 = num0A?.subString(start: 16, length: 1) //系统 let B21 = num0A?.subString(start: 10, length: 1) let B14 = num0A?.subString(start: 17, length: 1) let B13 = num0A?.subString(start: 18, length: 1) //蓄电池状态 let B22 = num0A?.subString(start: 9, length: 1) let B18 = num0A?.subString(start: 13, length: 1) let B17 = num0A?.subString(start: 14, length: 1) let B16 = num0A?.subString(start: 15, length: 1) let B12 = num0A?.subString(start: 19, length: 1) let B11 = num0A?.subString(start: 20, length: 1) let B10 = num0A?.subString(start: 21, length: 1) var batteryStatusStr = "" if B10 == "1" { batteryStatusStr = "BMS_overcharge_protection".da_localizedStr() } if B11 == "1" { batteryStatusStr = "Battery_low_temperature_protection,_stop_charging".da_localizedStr() } if B12 == "1" { batteryStatusStr = "Battery_reverse_polarity".da_localizedStr() } if B16 == "1" { batteryStatusStr = "Battery_over_discharge".da_localizedStr() } if B17 == "1" { batteryStatusStr = "Battery_overvoltage".da_localizedStr() } if B18 == "1" { batteryStatusStr = "Undervoltage_warning".da_localizedStr() } if B22 == "1" { batteryStatusStr = "External_ambient_temperature_is_too_high".da_localizedStr() } if B10 == "0" && B11 == "0" && B12 == "0" && B16 == "0" && B17 == "0" && B18 == "0" && B22 == "0"{ batteryStatusStr = "Normal".da_localizedStr() } deviceDetailData[key.batteryStatus] = batteryStatusStr realDataDict[key.batteryStatus] = batteryStatusStr //太阳能状态 if B23 == "1" { solarStatusStr = "PV_input_power_is_too_large".da_localizedStr() } if B24 == "1" { solarStatusStr = "Short_circuit_of_photovoltaic_input".da_localizedStr() } if B25 == "1" { solarStatusStr = "Overvoltage_at_the_photovoltaic_input".da_localizedStr() } if B26 == "1" { solarStatusStr = "Solar_panel_countercurrent".da_localizedStr() } if B27 == "1" { solarStatusStr = "Solar_panel_working_point_overpressure".da_localizedStr() } if B28 == "1" { solarStatusStr = "Solar_panel_reverse_connection".da_localizedStr() } deviceDetailData[key.solarStatus] = solarStatusStr realDataDict[key.solarStatus] = solarStatusStr let num0 = UUUtils.getBinaryByHex(str0.subString(start: 7, length: 4)) log.debug("00FD \(num0!)") let low_8_bit = UUUtils.numberHexString(str0.subString(start: 9, length: 2)) log.debug("low_8_bit - \(low_8_bit)") //1000000000000000 var changeStatus = "" if low_8_bit == 0 { changeStatus = "Charging_is_not_turned_on".da_localizedStr() }else if low_8_bit == 1 { changeStatus = "Start_charging_mode".da_localizedStr() }else if low_8_bit == 2 { changeStatus = "MPPT_charge_mode".da_localizedStr() }else if low_8_bit == 3 { changeStatus = "Equalizing_charge_mode".da_localizedStr() }else if low_8_bit == 4 { changeStatus = "Floating_charge_mode".da_localizedStr() }else if low_8_bit == 5 { changeStatus = "Boost_charge_mode".da_localizedStr() }else if low_8_bit == 6 { changeStatus = "Current_limiting_(super_power)".da_localizedStr() }else if low_8_bit == 7 { changeStatus = "Fully_charged".da_localizedStr() } if B23 == "0" && B24 == "0" && B25 == "0" && B26 == "0" && B27 == "0" && B28 == "0" { dataDict[key.solarStatus] = changeStatus realDataDict[key.solarStatus] = changeStatus } //0000 0000 0000 0000 从后往前数 let loadStatus = "\(num0?.subString(start: 0, length: 1) ?? "")" var loadStatusStr = "" if B15 == "1" { loadStatusStr = "Open_load".da_localizedStr() } if B19 == "1" { loadStatusStr = "Load_short_circuit".da_localizedStr() } if B20 == "1" { loadStatusStr = "Excessive_load_power_or_overload".da_localizedStr() } if B15 == "0" && B19 == "0" && B20 == "0" { if loadStatus == "0" { loadStatusStr = "Load_is_off".da_localizedStr() }else if loadStatus == "1" { loadStatusStr = "Load_is_on".da_localizedStr() } } log.debug("负载状态 :\(num0?.subString(start: 7, length: 1))") // 低八位 deviceDetailData[key.loadStatus] = loadStatusStr realDataDict[key.loadStatus] = loadStatusStr //太阳能电压 0107 let num1 = UUUtils.numberHexString(str0.subString(start: 47, length: 4)) print("太阳能电压 \(num1!.floatValue * 0.1)" ) let solarV = String(format: "%.1f", num1!.floatValue * 0.1) deviceDetailData[key.solarVoltage] = "\(solarV)" realDataDict[key.solarVoltage] = "\(solarV)" // 太阳能电流 0108 let num2 = UUUtils.numberHexString(str0.subString(start: 47 + 4, length: 4)) print("太阳能电流 \(num2!.floatValue * 0.01)") deviceDetailData[key.solarCurrent] = String(format: "%.2f", num2!.floatValue * 0.01) realDataDict[key.solarCurrent] = String(format: "%.2f", num2!.floatValue * 0.01) // 太阳能功率 0109 let num2_1 = UUUtils.numberHexString(str0.subString(start: 47 + 4 + 4, length: 4)) print("太阳能功率 \(num2_1!)") deviceDetailData[key.solarPower] = "\(num2_1!)" realDataDict[key.solarPower] = "\(num2_1!)" //蓄电池 电压 let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4)) print("蓄电池电压 \(num3!.floatValue * 0.1)") deviceDetailData[key.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1) realDataDict[key.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1) let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5, length: 4)) print("蓄电池电流\(num4!.floatValue * 0.01)") deviceDetailData[key.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01) realDataDict[key.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01) let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6 + 2 , length: 2)) print("温度 \(temp(with: num5!))") deviceDetailData[key.batteryTemp] = "\(temp(with: num5!))" realDataDict[key.batteryTemp] = "\(temp(with: num5!))" //负载 let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7, length: 4)) print("负载电压\(num6!.floatValue * 0.1)") deviceDetailData[key.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1) realDataDict[key.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1) let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4)) print("负载电流\(num7!.floatValue * 0.01)") deviceDetailData[key.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01) realDataDict[key.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01) let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 9, length: 4)) print("功率 \(num8! )") realDataDict[key.loadPower] = "\(num8!)" deviceDetailData[key.loadPower] = "\(num8!)" } //FF030115000B //ff031400000000000000000000000000 0000 0000 0000 0064 0b《》 //13 * 4 //处理历史数据 func hisData(_ reciveData:String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") if str0.count != 13 * 4 { return } var F000Dict = [String: String]() //蓄电池当天最低电压 let num0 = UUUtils.numberHexString(str0.subString(start: 7, length: 4)) log.debug("蓄电池当天最低电压: \( String(format: "%.1f", num0!.floatValue * 0.1))") F000Dict[key.his_batteryVoltageMin] = String(format: "%.1f", num0!.floatValue * 0.1) //蓄电池当天最高电压 let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4, length: 4)) log.debug("蓄电池当天最高电压\(String(format: "%.1f", num1!.floatValue * 0.1))") F000Dict[key.his_batteryVoltageMax] = String(format: "%.1f", num1!.floatValue * 0.1) let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 2, length: 4)) log.debug("当天充电最大电流\(String(format: "%.2f", num2!.floatValue * 0.01))") F000Dict[key.his_chargingCurrentMax] = String(format: "%.2f", num2!.floatValue * 0.01) let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 3, length: 4)) log.debug("当天放电最大电流\(String(format: "%.2f", num3!.floatValue * 0.01))") F000Dict[key.his_dischargeCurrentmax] = String(format: "%.2f", num3!.floatValue * 0.01) let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4)) log.debug("当天充电最大功率\(num4!)" ) F000Dict[key.his_chargingPowerMax] = "\(num4!)" let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5 , length: 4)) log.debug("当天放电最大功率\(num5!)") F000Dict[key.his_dischargePowerMax] = "\(num5!)" let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6, length: 4)) log.debug("充电安时数 \(num6!)") F000Dict[key.his_chargingAmpereHour] = "\(num6!)" let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7 , length: 4)) log.debug("放电安时数 \(num7!)") F000Dict[key.his_dischargeAmpereHour] = "\(num7!)" let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4)) log.debug("当天发电量 \(num8!)") F000Dict[key.his_generationCapacity] = "\(num8!)" let num9 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 9, length: 4)) log.debug("充电量 \(num9!)") F000Dict[key.his_dischargeCapacity] = "\(num9!)" historyDataArr.append(F000Dict) } func realdata_F000(_ reciveData : String) { hisData(reciveData) } func realdata_F001(_ reciveData : String) { hisData(reciveData) } func realdata_F002(_ reciveData : String) { hisData(reciveData) } func realdata_F003(_ reciveData : String) { hisData(reciveData) } func realdata_F004(_ reciveData : String) { hisData(reciveData) } func realdata_F005(_ reciveData : String) { hisData(reciveData) } func realdata_F006(_ reciveData : String) { hisData(reciveData) } func realdata_F007(_ reciveData : String) { hisData(reciveData) deviceDetailData[key.historydatas] = historyDataArr cumulativeDict[key.historydatas] = historyDataArr } func realdata_0115(_ reciveData :String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") // let num0 = UUUtils.numberHexString(str0.subString(start: 7 , length: 4)) log.debug("总运行天数 - \(num0!)") cumulativeDict[key.runTime] = ("\(num0!)") deviceDetailData[key.runTime] = ("\(num0!)") let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4 , length: 4)) log.debug("蓄电池总过放次数 - \(num1!)") cumulativeDict[key.overTimes] = "\(num1!)" deviceDetailData[key.overTimes] = "\(num1!)" let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 8 , length: 4)) log.debug("蓄电池总充满次数 - \(num2!)") cumulativeDict[key.fullTimes] = "\(num2!)" deviceDetailData[key.fullTimes] = "\(num2!)" let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 12 , length: 8)) log.debug("蓄电池总充电安时数 - \(num3!)") cumulativeDict[key.chargingAmpereHour] = "\(num3!)" deviceDetailData[key.chargingAmpereHour] = "\(num3!)" let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 , length: 8)) log.debug("蓄电池总放电安时数 - \(num4!)") cumulativeDict[key.dischargeAmpereHour] = "\(num4!)" deviceDetailData[key.dischargeAmpereHour] = "\(num4!)" let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 * 2 , length: 8)) // let num5 = UUUtils.numberHexString("ffffffff") log.debug("累计发电量 - \(num5!)") cumulativeDict[key.generatEnergyTotal] = "\(num5!)" let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 * 3, length: 8)) log.debug("累计用电量 - \(num6!)") cumulativeDict[key.usedEnergyTotal] = "\(num6!)" deviceDetailData[key.usedEnergyTotal] = "\(num6!)" NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifisionDeviceDatailDataHistoryDataRecieve), object: nil, userInfo: cumulativeDict) } func realdata_DF0D(_ reciveData : String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") // let num0 = UUUtils.numberHexString(str0.subString(start: 7, length: 4)) log.debug("手动均衡 —— \(num0)") var canhandle = "" if num0?.intValue == 0 { canhandle = "Prohibited".da_localizedStr() }else if num0?.intValue == 1{ canhandle = "Enable".da_localizedStr() } deviceDetailData[key.BattEqualChgImmediate] = canhandle paramDataDict[key.BattEqualChgImmediate] = canhandle log.debug(" kNotifisionDeviceDatailDataBaseInfoRecieve \(deviceDetailData)") } func realdata_0100(_ reciveData : String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") //太阳能电压 0107 let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7, length: 4)) print("太阳能电压 \(num1!.floatValue * 0.1)" ) let solarV = String(format: "%.1f", num1!.floatValue * 0.1) deviceDetailData[key.solarVoltage] = "\(solarV)" realDataDict[key.solarVoltage] = "\(solarV)" // 太阳能电流 0108 let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4)) print("太阳能电流 \(num2!.floatValue * 0.01)") deviceDetailData[key.solarCurrent] = String(format: "%.2f", num2!.floatValue * 0.01) realDataDict[key.solarCurrent] = String(format: "%.2f", num2!.floatValue * 0.01) // 太阳能功率 0109 let num2_1 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 9, length: 4)) print("太阳能功率 \(num2_1!)") deviceDetailData[key.solarPower] = "\(num2_1!)" realDataDict[key.solarPower] = "\(num2_1!)" //蓄电池 电压 101 let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 1, length: 4)) print("蓄电池电压 \(num3!.floatValue * 0.1)") deviceDetailData[key.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1) realDataDict[key.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1) //蓄电池电流 102 let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 2, length: 4)) print("蓄电池电流\(num4!.floatValue * 0.01)") deviceDetailData[key.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01) realDataDict[key.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01) //蓄电池温度 0103 let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 3 , length: 2)) print("温度 \(temp(with: num5!))") deviceDetailData[key.batteryTemp] = "\(temp(with: num5!))" realDataDict[key.batteryTemp] = "\(temp(with: num5!))" //负载电压 0104 let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4)) print("负载电压\(num6!.floatValue * 0.1)") deviceDetailData[key.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1) realDataDict[key.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1) //负载电流 0105 let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5, length: 4)) print("负载电流\(num7!.floatValue * 0.01)") deviceDetailData[key.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01) realDataDict[key.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01) //负载功率 0106 let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6, length: 4)) print("功率 \(num8! )") realDataDict[key.loadPower] = "\(num8!)" deviceDetailData[key.loadPower] = "\(num8!)" } func realdata_0120(_ reciveData : String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") var num0A = UUUtils.getBinaryByHex(str0.subString(start: 11 , length: 8)) let num0A_1 = num0A?.subString(start: 0, length: 16) let num0A_2 = num0A?.subString(start: 16, length: 16) let num0A_II = num0A_2! + num0A_1! num0A = num0A_II log.debug("太阳能板状态\(num0A!)") var solarStatusStr = "" let B30 = num0A?.subString(start: 1, length: 1) let B29 = num0A?.subString(start: 2, length: 1) let B28 = num0A?.subString(start: 3, length: 1) let B27 = num0A?.subString(start: 4, length: 1) let B26 = num0A?.subString(start: 5, length: 1) let B25 = num0A?.subString(start: 6, length: 1) let B24 = num0A?.subString(start: 7, length: 1) let B23 = num0A?.subString(start: 8, length: 1) //负载 let B20 = num0A?.subString(start: 11, length: 1) let B19 = num0A?.subString(start: 12, length: 1) let B15 = num0A?.subString(start: 16, length: 1) //系统 let B21 = num0A?.subString(start: 10, length: 1) let B14 = num0A?.subString(start: 17, length: 1) let B13 = num0A?.subString(start: 18, length: 1) //蓄电池状态 let B22 = num0A?.subString(start: 9, length: 1) let B18 = num0A?.subString(start: 13, length: 1) let B17 = num0A?.subString(start: 14, length: 1) let B16 = num0A?.subString(start: 15, length: 1) let B12 = num0A?.subString(start: 19, length: 1) let B11 = num0A?.subString(start: 20, length: 1) let B10 = num0A?.subString(start: 21, length: 1) var batteryStatusStr = "" if B10 == "1" { batteryStatusStr = "BMS_overcharge_protection".da_localizedStr() } if B11 == "1" { batteryStatusStr = "Battery_low_temperature_protection,_stop_charging".da_localizedStr() } if B12 == "1" { batteryStatusStr = "Battery_reverse_polarity".da_localizedStr() } if B16 == "1" { batteryStatusStr = "Battery_over_discharge".da_localizedStr() } if B17 == "1" { batteryStatusStr = "Battery_overvoltage".da_localizedStr() } if B18 == "1" { batteryStatusStr = "Undervoltage_warning".da_localizedStr() } if B22 == "1" { batteryStatusStr = "External_ambient_temperature_is_too_high".da_localizedStr() } if B10 == "0" && B11 == "0" && B12 == "0" && B16 == "0" && B17 == "0" && B18 == "0" && B22 == "0"{ batteryStatusStr = "Normal".da_localizedStr() } deviceDetailData[key.batteryStatus] = batteryStatusStr realDataDict[key.batteryStatus] = batteryStatusStr //太阳能状态 if B23 == "1" { solarStatusStr = "PV_input_power_is_too_large".da_localizedStr() } if B24 == "1" { solarStatusStr = "Short_circuit_of_photovoltaic_input".da_localizedStr() } if B25 == "1" { solarStatusStr = "Overvoltage_at_the_photovoltaic_input".da_localizedStr() } if B26 == "1" { solarStatusStr = "Solar_panel_countercurrent".da_localizedStr() } if B27 == "1" { solarStatusStr = "Solar_panel_working_point_overpressure".da_localizedStr() } if B28 == "1" { solarStatusStr = "Solar_panel_reverse_connection".da_localizedStr() } deviceDetailData[key.solarStatus] = solarStatusStr realDataDict[key.solarStatus] = solarStatusStr //0120 let num0 = UUUtils.getBinaryByHex(str0.subString(start: 7, length: 4)) log.debug("00FD \(num0!)") let low_8_bit = UUUtils.numberHexString(str0.subString(start: 9, length: 2)) log.debug("low_8_bit - \(low_8_bit)") //1000000000000000 var changeStatus = "" if low_8_bit == 0 { changeStatus = "Charging_is_not_turned_on".da_localizedStr() }else if low_8_bit == 1 { changeStatus = "Start_charging_mode".da_localizedStr() }else if low_8_bit == 2 { changeStatus = "MPPT_charge_mode".da_localizedStr() }else if low_8_bit == 3 { changeStatus = "Equalizing_charge_mode".da_localizedStr() }else if low_8_bit == 4 { changeStatus = "Floating_charge_mode".da_localizedStr() }else if low_8_bit == 5 { changeStatus = "Boost_charge_mode".da_localizedStr() }else if low_8_bit == 6 { changeStatus = "Current_limiting_(super_power)".da_localizedStr() }else if low_8_bit == 7 { changeStatus = "Fully_charged".da_localizedStr() } // realDataDict[key.solarStatus] = solarStatusStr if B23 == "0" && B24 == "0" && B25 == "0" && B26 == "0" && B27 == "0" && B28 == "0" { dataDict[key.solarStatus] = changeStatus realDataDict[key.solarStatus] = changeStatus } //0000 0000 0000 0000 从后往前数 let loadStatus = "\(num0?.subString(start: 0, length: 1) ?? "")" var loadStatusStr = "" if B15 == "1" { loadStatusStr = "Open_load".da_localizedStr() } if B19 == "1" { loadStatusStr = "Load_short_circuit".da_localizedStr() } if B20 == "1" { loadStatusStr = "Excessive_load_power_or_overload".da_localizedStr() } if B15 == "0" && B19 == "0" && B20 == "0" { if loadStatus == "0" { loadStatusStr = "Load_is_off".da_localizedStr() }else if loadStatus == "1" { loadStatusStr = "Load_is_on".da_localizedStr() } } log.debug("负载状态 :\(num0?.subString(start: 7, length: 1))") // 低八位 deviceDetailData[key.loadStatus] = loadStatusStr realDataDict[key.loadStatus] = loadStatusStr } } /* let solarVoltage = Float(dataDict[key.solarVoltage] as! String) let solarCurrent = Float(dataDict[key.solarCurrent] as! String) let solarPower = String(format: "%.0f", solarVoltage! * solarCurrent!) self.solarPowerValue = (dataDict[key.solarPower] as! String) let solarStatusStr = dataDict[key.solarStatus] as? String let value1 = RealTimeValue(itemValue: "\(dataDict[key.solarVoltage]!)V", itemValue2: "\(dataDict[key.solarCurrent]!)A" , itemValue3: "\(solarPower)W", status: solarStatusStr == "" ? "Normal".da_localizedStr() : solarStatusStr, switchValue: "-") let batteryTemp1 = dataDict[key.batteryTemp]! var batterTempStr = "" let userDef = UserDefaults.standard let isCentigrade = userDef.value(forKey: TEMPISCENTIGRADE) as? String if isCentigrade != nil{ if isCentigrade == "1"{ batterTempStr = "\(batteryTemp1)℃" }else if isCentigrade == "0"{ let fahrenhit = (batteryTemp1 as! String).centigradeToFahrenheit() batterTempStr = "\(fahrenhit)℉" } }else{ batterTempStr = "\(batteryTemp1)℃" } let value2 = RealTimeValue(itemValue: "\(dataDict[key.batteryVoltage]!)V" , itemValue2: "\(dataDict[key.batteryCurrent]!)A", itemValue3: batterTempStr, status: dataDict[key.batteryStatus]as? String, switchValue: "-") let loadStatusStr = dataDict[key.loadStatus]as? String var loadSwitchValue = "1" if loadStatusStr == "Load_is_on".da_localizedStr() { loadSwitchValue = "1" }else{ loadSwitchValue = "0" } var value3 = RealTimeValue(itemValue: "\(dataDict[key.loadVoltage]!)V", itemValue2: "\(dataDict[key.loadCurrent]!)A", itemValue3: "\(dataDict[key.loadPower]!)W", status: dataDict[key.loadStatus]as? String, switchValue: loadSwitchValue) if self.isDemo == true{ value3 = RealTimeValue(itemValue: "\(dataDict[key.loadVoltage]!)V", itemValue2: "\(dataDict[key.loadCurrent]!)A", itemValue3: "\(dataDict[key.loadPower]!)W", status: dataDict[key.loadStatus]as? String, switchValue: "1") } dataSource?.append(value1) dataSource?.append(value2) dataSource?.append(value3) if self.isDemo == false { let allDataDict = AppShare.dataDict let BatImprovChgVolt = allDataDict[key.BatImprovChgVolt] as! String //提升充电电压 let IchageRage = allDataDict[key.IchageRage] as! String // 额定充电电流 let batRateVolt = allDataDict[key.BatRateVolt] as! String //系统电压 let a = Float(BatImprovChgVolt) let b = Float(batRateVolt) let c = Float(IchageRage) let solarPowerMaxFloat = a! * (b! / 12) * c! log.debug("表盘最大值 \(solarPowerMaxFloat)") let solarPowerFloat = Float(solarPower) var curentSolarPower = Float(0.0) if solarPowerFloat != 0.0 { curentSolarPower = solarPowerFloat! / solarPowerMaxFloat }else{ curentSolarPower = 0.0 } log.debug("当前功率-- \(curentSolarPower)") self.solarPower = CGFloat(curentSolarPower) let LoadMode = allDataDict[key.DcLoadMode] as! String // if LoadMode == "手动模式"{ self.isManual = true // } }else{ let demoeData = SBTData().DemoData let BatImprovChgVolt = demoeData[key.BatImprovChgVolt] as! String //提升充电电压 let IchageRage = demoeData[key.IchageRage] as! String // 额定充电电流 let batRateVolt = demoeData[key.BatRateVolt] as! String //系统电压 let a = Float(BatImprovChgVolt) let b = Float(batRateVolt) let c = Float(IchageRage) let solarPowerMaxFloat = a! * (b! / 12) * c! log.debug("表盘最大值 \(solarPowerMaxFloat)") let solarPowerFloat = Float(solarPower) var curentSolarPower = Float(0.0) if solarPowerFloat != 0.0 { curentSolarPower = solarPowerFloat! / solarPowerMaxFloat }else{ curentSolarPower = 0.0 } log.debug("当前功率-- \(curentSolarPower)") self.solarPower = CGFloat(curentSolarPower) let LoadMode = demoeData[key.DcLoadMode] as! String // if LoadMode == "手动模式"{ self.isManual = true // } } isSwitchHiddenArr = [true,true,false] } } */