DeviceData.swift 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203
  1. //
  2. // DeviceData.swift
  3. // SolarBT
  4. //
  5. // Created by weclouds on 2019/4/28.
  6. // Copyright © 2019 weclouds. All rights reserved.
  7. //
  8. /*
  9. 类型 + 序列号 + 名称
  10. 1 8 7
  11. 序列号:
  12. 实时状态1s刷新一次
  13. 字体大小 固定 不跟随系统
  14. 电压电流单位 小数
  15. 0
  16. */
  17. /*
  18. 功能
  19. 1、数据保存
  20. 2、数据读取
  21. 3、数据刷新
  22. 1、分4个
  23. 1、设备信息 (存储 - 读取- 更新) 3、历史数据 (存储 - 读取 - 更新)
  24. 2、实时数据 (存储-读取-更新)
  25. 4、数据设置 (存储 读取 更新)
  26. */
  27. import Foundation
  28. class DeviceData: NSObject {
  29. var dataDict : [String: Any] = [String: Any]()
  30. var paramDataDict : [String: Any] = [String: Any]()
  31. var realDataDict : [String:Any] = [String:Any]()
  32. var cumulativeDataDict : [String :Any] = [String: Any]() /// 累计数据
  33. let key: DeviceDictKey = DeviceDictKey()
  34. var historyDataArr: [[String: String]] = [[String: String]]()
  35. override init() {
  36. super.init()
  37. }
  38. //真实数据
  39. func realdata(_ reciveData : String) {
  40. let str0 = reciveData.replacingOccurrences(of: " ", with: "")
  41. log.debug("处理真实数据 - \(str0)")
  42. }
  43. //实时数据
  44. func realdata_000A(_ reciveData : String) {
  45. let str0 = reciveData.replacingOccurrences(of: " ", with: "")
  46. log.debug("处理真实数据 - \(str0)")
  47. //系统支持的最高电压
  48. let num00 = UUUtils.numberHexString(str0.subString(start: 7 , length: 2))
  49. log.debug("额定充电电流: \(num00!)")
  50. dataDict[key.MaxVolt] = "\(num00!)"
  51. paramDataDict[key.MaxVolt] = "\(num00!)"
  52. let num0 = UUUtils.numberHexString(str0.subString(start: 7 + 2, length: 2))
  53. log.debug("额定充电电流: \(num0!)")
  54. dataDict[key.IchageRage] = "\(num0!)"
  55. paramDataDict[key.IchageRage] = "\(num0!)"
  56. }
  57. //读取名称
  58. func readdata_0049(_ reciveData : String){
  59. let str0 = reciveData.replacingOccurrences(of: " ", with: "")
  60. log.debug("处理真实数据 - \(str0)")
  61. var num5 = UUUtils.string(fromHexString: str0.subString(start: 7 , length: str0.count - 12))
  62. log.debug("要解析的十六进制 \( str0.subString(start: 7 , length: str0.count - 12))")
  63. num5 = num5?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白
  64. log.debug("设备名称 \(num5)")
  65. if num5 == nil || num5 == ""{
  66. let ChineseString = UUUtils.deUnicodeString(fromHexString: str0.subString(start: 7 , length: str0.count - 12))
  67. log.debug("设备中文名称 \(ChineseString!)")
  68. }
  69. }
  70. func realdata_000B(_ reciveData : String) {
  71. let str0 = reciveData.replacingOccurrences(of: " ", with: "")
  72. log.debug("处理真实数据 - \(str0)")
  73. //1400
  74. //额定放电电流
  75. let num00 = UUUtils.numberHexString(str0.subString(start: 7, length: 2))
  76. log.debug("额定放电电流:\(num00!)")
  77. dataDict[key.idischagRate] = "\(num00!)"
  78. //产品类型
  79. let num0 = UUUtils.numberHexString(str0.subString(start: 9, length: 2))
  80. log.debug("产品类型:\(num0)")
  81. var device_type = ""
  82. switch num0?.intValue {
  83. case 0:
  84. device_type = "控制器,家用"
  85. case 1:
  86. device_type = "控制器,路灯"
  87. case 3:
  88. device_type = "逆变器"
  89. case 4:
  90. device_type = "控逆一体机"
  91. default:
  92. break
  93. }
  94. dataDict[key.device_type] = device_type
  95. var num1 = UUUtils.string(fromHexString: str0.subString(start: 11, length: 32))
  96. num1 = num1?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白
  97. log.debug("产品型号\(num1)")
  98. dataDict[key.product_type] = num1!
  99. //软件版本
  100. // let num2 = UUUtils.numberHexString(str0.subString(start: 11 + 32, length: 8))
  101. let a = UUUtils.numberHexString(str0.subString(start: 11 + 32, length: 2))
  102. let b = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2, length: 2))
  103. let c = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2 + 2, length: 2))
  104. let d = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2 + 2 + 2, length: 2))
  105. log.debug("软件版本 : V \(b!).\(c!).\(d!)")
  106. dataDict[key.softWareCersion] = "V\(b!).\(c!).\(d!)"
  107. //硬件版本
  108. // let num3 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8, length: 8))
  109. let m1 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8, length: 2))
  110. let m2 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2, length: 2))
  111. let m3 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2 + 2, length: 2))
  112. let m4 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2 + 2 + 2, length: 2))
  113. log.debug("硬件版本 : V\(m2!).\(m3!).\(m4!)")
  114. // 序列号
  115. dataDict[key.hardWareCersion] = "V \(m2!).\(m3!).\(m4!)"
  116. // let num4 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 , length: 8))
  117. let num41 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 , length: 2))
  118. let num42 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 2 , length: 2))
  119. let num43 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 4 , length: 4)) //补足5位
  120. log.debug("\( String(format: "%05d", num43!.intValue))") // 年月(低十六位)
  121. dataDict[key.productSN] = "\(num41!)\(num42!)\( String(format: "%05d", num43!.intValue))"
  122. // var num5 = UUUtils.string(fromHexString: str0.subString(start: 255 , length: 32)) // 最大32字节 12568哦哦哦泈色系儿子儿媳妇
  123. var num5 = UUUtils.string(fromHexString: str0.subString(start: 255 , length: 64))
  124. log.debug("要解析的十六进制 \( str0.subString(start: 255 , length: 64))")
  125. num5 = num5?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白
  126. log.debug("设备名称 \(num5)")
  127. //f16d33 575578 e565b 065fd8 0906ed179
  128. if num5 == nil || num5 == "" {
  129. let ChineseString = UUUtils.deUnicodeString(fromHexString: str0.subString(start: 255 , length: 64))
  130. // ff ff
  131. dataDict[key.productName] = ChineseString
  132. log.debug("设备中文名称 \(ChineseString!)")
  133. }else{
  134. dataDict[key.productName] = num5
  135. }
  136. // dataDict[key.productName] = "测试名称"
  137. //生产日期
  138. // let num6 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 4 * 4, length: 8))
  139. let year = UUUtils.numberHexString(str0.subString(start: 75, length: 2))
  140. let mouth = UUUtils.numberHexString(str0.subString(start: 75 + 2, length: 2))
  141. let day = UUUtils.numberHexString(str0.subString(start: 75 + 2, length: 2))
  142. log.debug("生产日期 : \(year!)-\(mouth!)-\(day!)")
  143. //mac地址
  144. // let num7 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 8 , length: 4))
  145. // log.debug("设备地址 \(num7)")
  146. //生产批次
  147. // var num5 = UUUtils.string(fromHexString: str0.subString(start: 255 , length: 64))
  148. // num5 = num5?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白
  149. // log.debug("设备名称 \(num5)")
  150. }
  151. //温度处理
  152. func temp(with num:NSNumber)-> String{
  153. let numInt = num.intValue
  154. // let q1 = UUUtils.numberHexString(q)?.intValue
  155. let q2 = numInt & 128
  156. print("判断正负\(q2)")
  157. if q2 != 128 {
  158. log.debug("温度\(num.floatValue )")
  159. return "\(num.intValue )"
  160. }else{
  161. log.debug("温度: -\(numInt & 127 )")
  162. return "-\(numInt & 127 )"
  163. }
  164. }
  165. //1s刷新一次
  166. //实时数据
  167. func realdata_00FD(_ reciveData : String) {
  168. let str0 = reciveData.replacingOccurrences(of: " ", with: "")
  169. log.debug("处理真实数据 - \(str0)")
  170. //太阳能板状态 0 000 0000 0000 0000 0000 0000 0000 0010
  171. // 31
  172. let num0A = UUUtils.getBinaryByHex(str0.subString(start: 11 , length: 8))
  173. log.debug("太阳能板状态\(num0A!)")
  174. var solarStatusStr = ""
  175. let B30 = num0A?.subString(start: 1, length: 1)
  176. let B29 = num0A?.subString(start: 2, length: 1)
  177. let B28 = num0A?.subString(start: 3, length: 1)
  178. let B27 = num0A?.subString(start: 4, length: 1)
  179. let B26 = num0A?.subString(start: 5, length: 1)
  180. let B25 = num0A?.subString(start: 6, length: 1)
  181. let B24 = num0A?.subString(start: 7, length: 1)
  182. let B23 = num0A?.subString(start: 8, length: 1)
  183. //负载
  184. let B20 = num0A?.subString(start: 11, length: 1)
  185. let B19 = num0A?.subString(start: 12, length: 1)
  186. let B15 = num0A?.subString(start: 16, length: 1)
  187. //系统
  188. let B21 = num0A?.subString(start: 10, length: 1)
  189. let B14 = num0A?.subString(start: 17, length: 1)
  190. let B13 = num0A?.subString(start: 18, length: 1)
  191. //蓄电池状态
  192. let B22 = num0A?.subString(start: 9, length: 1)
  193. let B18 = num0A?.subString(start: 13, length: 1)
  194. let B17 = num0A?.subString(start: 14, length: 1)
  195. let B16 = num0A?.subString(start: 15, length: 1)
  196. let B12 = num0A?.subString(start: 19, length: 1)
  197. let B11 = num0A?.subString(start: 20, length: 1)
  198. let B10 = num0A?.subString(start: 21, length: 1)
  199. var batteryStatusStr = ""
  200. if B10 == "1" {
  201. batteryStatusStr = "BMS过充保护"
  202. }
  203. if B11 == "1" {
  204. batteryStatusStr = "电池低温保护,停止充电"
  205. }
  206. if B12 == "1" {
  207. batteryStatusStr = "电池反接"
  208. }
  209. if B16 == "1" {
  210. batteryStatusStr = "蓄电池过放"
  211. }
  212. if B17 == "1" {
  213. batteryStatusStr = "蓄电池超压"
  214. }
  215. if B18 == "1" {
  216. batteryStatusStr = "欠压警告"
  217. }
  218. if B22 == "1" {
  219. batteryStatusStr = "外部坏境温度过高"
  220. }
  221. if B10 == "0" && B11 == "0" && B12 == "0" && B16 == "0" && B17 == "0" && B18 == "0" && B22 == "0"{
  222. batteryStatusStr = "正常"
  223. }
  224. dataDict[key.batteryStatus] = batteryStatusStr
  225. realDataDict[key.batteryStatus] = batteryStatusStr
  226. //太阳能状态
  227. if B23 == "1" {
  228. solarStatusStr = "光伏输入功率过大"
  229. }
  230. if B24 == "1" {
  231. solarStatusStr = "光伏输入端短路"
  232. }
  233. if B25 == "1" {
  234. solarStatusStr = "光伏输入端超压"
  235. }
  236. if B26 == "1" {
  237. solarStatusStr = "太阳板逆流"
  238. }
  239. if B27 == "1" {
  240. solarStatusStr = "太阳板工作点超压"
  241. }
  242. if B28 == "1" {
  243. solarStatusStr = "太阳板反接"
  244. }
  245. dataDict[key.solarStatus] = solarStatusStr
  246. realDataDict[key.solarStatus] = solarStatusStr
  247. if B23 == "0" && B24 == "0" && B25 == "0" && B26 == "0" && B27 == "0" && B28 == "0" {
  248. dataDict[key.solarStatus] = batteryStatusStr
  249. realDataDict[key.solarStatus] = batteryStatusStr
  250. }
  251. let num0 = UUUtils.getBinaryByHex(str0.subString(start: 7, length: 4))
  252. log.debug("00FD \(num0!)")
  253. //0000 0000 0000 0000 从后往前数
  254. let loadStatus = "\(num0?.subString(start: 0, length: 1) ?? "")"
  255. var loadStatusStr = ""
  256. if B15 == "1" {
  257. loadStatusStr = "负载开路"
  258. }
  259. if B19 == "1" {
  260. loadStatusStr = "负载短路"
  261. }
  262. if B20 == "1" {
  263. loadStatusStr = "负载功率过大或负载过流"
  264. }
  265. if B15 == "0" && B19 == "0" && B20 == "0" {
  266. if loadStatus == "0" {
  267. loadStatusStr = "负载已关"
  268. }else if loadStatus == "1" {
  269. loadStatusStr = "负载已开"
  270. }
  271. }
  272. log.debug("负载状态 :\(num0?.subString(start: 7, length: 1))") // 低八位
  273. dataDict[key.loadStatus] = loadStatusStr
  274. realDataDict[key.loadStatus] = loadStatusStr
  275. //蓄电池状态
  276. // let batteryStatus = "\(num0?.subString(start: 8, length: 8) ?? "")"
  277. //太阳能电压 0107
  278. let num1 = UUUtils.numberHexString(str0.subString(start: 47, length: 4))
  279. print("太阳能电压 \(num1!.floatValue * 0.1)" )
  280. let solarV = String(format: "%.1f", num1!.floatValue * 0.1)
  281. dataDict[key.solarVoltage] = "\(solarV)"
  282. realDataDict[key.solarVoltage] = "\(solarV)"
  283. // 太阳能电流 0108
  284. let num2 = UUUtils.numberHexString(str0.subString(start: 47 + 4, length: 4))
  285. print("太阳能电流 \(num2!.floatValue * 0.01)")
  286. dataDict[key.solarCurrent] = String(format: "%.2f", num2!.floatValue * 0.01)
  287. realDataDict[key.solarCurrent] = String(format: "%.2f", num2!.floatValue * 0.01)
  288. // 太阳能功率 0109
  289. let num2_1 = UUUtils.numberHexString(str0.subString(start: 47 + 4 + 4, length: 4))
  290. print("太阳能功率 \(num2_1!)")
  291. dataDict[key.solarPower] = "\(num2_1!)"
  292. realDataDict[key.solarPower] = "\(num2_1!)"
  293. //蓄电池 电压
  294. let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4))
  295. print("蓄电池电压 \(num3!.floatValue * 0.1)")
  296. dataDict[key.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1)
  297. realDataDict[key.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1)
  298. let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5, length: 4))
  299. print("蓄电池电流\(num4!.floatValue * 0.01)")
  300. dataDict[key.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01)
  301. realDataDict[key.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01)
  302. let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6 + 2 , length: 2))
  303. print("温度 \(temp(with: num5!))")
  304. dataDict[key.batteryTemp] = "\(temp(with: num5!))"
  305. realDataDict[key.batteryTemp] = "\(temp(with: num5!))"
  306. //负载
  307. let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7, length: 4))
  308. print("负载电压\(num6!.floatValue * 0.1)")
  309. dataDict[key.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1)
  310. realDataDict[key.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1)
  311. let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4))
  312. print("负载电流\(num7!.floatValue * 0.01)")
  313. dataDict[key.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01)
  314. realDataDict[key.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01)
  315. let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 9, length: 4))
  316. print("功率 \(num8! )")
  317. dataDict[key.loadPower] = "\(num8!)"
  318. realDataDict[key.loadPower] = "\(num8!)"
  319. //
  320. // log.debug("实时数据 === \(dataDict)")
  321. //log.debug("返回数据实时数据-- \(self.realDataDict)")
  322. }
  323. //处理历史数据
  324. func hisData(_ reciveData:String) {
  325. let str0 = reciveData.replacingOccurrences(of: " ", with: "")
  326. log.debug("处理真实数据 - \(str0)")
  327. var F000Dict = [String: String]()
  328. //蓄电池当天最低电压
  329. let num0 = UUUtils.numberHexString(str0.subString(start: 7, length: 4))
  330. log.debug("蓄电池当天最低电压: \( String(format: "%.1f", num0!.floatValue * 0.1))")
  331. F000Dict[key.his_batteryVoltageMin] = String(format: "%.1f", num0!.floatValue * 0.1)
  332. //蓄电池当天最高电压
  333. let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4, length: 4))
  334. log.debug("蓄电池当天最高电压\(String(format: "%.1f", num1!.floatValue * 0.1))")
  335. F000Dict[key.his_batteryVoltageMax] = String(format: "%.1f", num1!.floatValue * 0.1)
  336. let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 2, length: 4))
  337. log.debug("当天充电最大电流\(String(format: "%.2f", num2!.floatValue * 0.01))")
  338. F000Dict[key.his_chargingCurrentMax] = String(format: "%.2f", num2!.floatValue * 0.01)
  339. let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 3, length: 4))
  340. log.debug("当天放电最大电流\(String(format: "%.2f", num3!.floatValue * 0.01))")
  341. F000Dict[key.his_dischargeCurrentmax] = String(format: "%.2f", num3!.floatValue * 0.01)
  342. let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4))
  343. log.debug("当天充电最大功率\(num4!)" )
  344. F000Dict[key.his_chargingPowerMax] = "\(num4!)"
  345. let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5 , length: 4))
  346. log.debug("当天放电最大功率\(num5!)")
  347. F000Dict[key.his_dischargePowerMax] = "\(num5!)"
  348. let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6, length: 4))
  349. log.debug("充电安时数 \(num6!)")
  350. F000Dict[key.his_chargingAmpereHour] = "\(num6!)"
  351. let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7 , length: 4))
  352. log.debug("放电安时数 \(num7!)")
  353. F000Dict[key.his_dischargeAmpereHour] = "\(num7!)"
  354. let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4))
  355. log.debug("当天发电量 \(num8!)")
  356. F000Dict[key.his_generationCapacity] = "\(num8!)"
  357. let num9 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 9, length: 4))
  358. log.debug("充电量 \(num9!)")
  359. F000Dict[key.his_dischargeCapacity] = "\(num9!)"
  360. historyDataArr.append(F000Dict)
  361. }
  362. func realdata_F000(_ reciveData : String) {
  363. hisData(reciveData)
  364. }
  365. func realdata_F001(_ reciveData : String) {
  366. hisData(reciveData)
  367. }
  368. func realdata_F002(_ reciveData : String) {
  369. hisData(reciveData)
  370. }
  371. func realdata_F003(_ reciveData : String) {
  372. hisData(reciveData)
  373. }
  374. func realdata_F004(_ reciveData : String) {
  375. hisData(reciveData)
  376. }
  377. func realdata_F005(_ reciveData : String) {
  378. hisData(reciveData)
  379. }
  380. func realdata_F006(_ reciveData : String) {
  381. hisData(reciveData)
  382. dataDict[key.historydatas] = historyDataArr
  383. }
  384. // func realdata_F007(_ reciveData : String) {
  385. // hisData(reciveData)
  386. //
  387. // dataDict[key.historydatas] = historyDataArr
  388. // }
  389. //
  390. func realdata_0115(_ reciveData :String) {
  391. let str0 = reciveData.replacingOccurrences(of: " ", with: "")
  392. log.debug("处理真实数据 - \(str0)")
  393. //
  394. let num0 = UUUtils.numberHexString(str0.subString(start: 7 , length: 4))
  395. log.debug("总运行天数 - \(num0!)")
  396. dataDict[key.runTime] = ("\(num0!)")
  397. // cumulativeDataDict[key.runTime] = ("\(num0!)")
  398. let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4 , length: 4))
  399. log.debug("蓄电池总过放次数 - \(num1!)")
  400. dataDict[key.overTimes] = "\(num1!)"
  401. // cumulativeDataDict[key.overTimes] = "\(num1!)"
  402. let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 8 , length: 4))
  403. log.debug("蓄电池总充满次数 - \(num2!)")
  404. dataDict[key.fullTimes] = "\(num2!)"
  405. // cumulativeDataDict[key.fullTimes] = "\(num2!)"
  406. let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 12 , length: 8))
  407. log.debug("蓄电池总充电安时数 - \(num3!)")
  408. dataDict[key.chargingAmpereHour] = "\(num3!)"
  409. // cumulativeDataDict[key.chargingAmpereHour] = "\(num3!)"
  410. let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 , length: 8))
  411. log.debug("蓄电池总放电安时数 - \(num4!)")
  412. dataDict[key.dischargeAmpereHour] = "\(num4!)"
  413. // cumulativeDataDict[key.dischargeAmpereHour] = "\(num4!)"
  414. let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 * 2 , length: 8))
  415. log.debug("累计发电量 - \(num5!)")
  416. dataDict[key.generatEnergyTotal] = "\(num5!)"
  417. // cumulativeDataDict[key.generatEnergyTotal] = "\(num5!)"
  418. let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 * 3, length: 8))
  419. log.debug("累计用电量 - \(num6!)")
  420. dataDict[key.usedEnergyTotal] = "\(num6!)"
  421. // cumulativeDataDict[key.usedEnergyTotal] = "\(num6!)"
  422. // log.debug("、统计数据 == \(cumulativeDataDict)")
  423. // AppShare.cumulativeDataDict = cumulativeDataDict
  424. // NotificationCenter.default.post(name: NSNotification.Name(kBabyBluetoothNotificationCumulativeDataRecieve), object: nil)
  425. }
  426. func realdata_E003(_ reciveData : String) {
  427. let str0 = reciveData.replacingOccurrences(of: " ", with: "")
  428. log.debug("处理真实数据 - \(str0)")
  429. //e003
  430. // FF
  431. let FF = str0.subString(start: 7 , length: 2)
  432. if FF == "FF"{
  433. dataDict[key.autoRecognition] = "1"
  434. paramDataDict[key.autoRecognition] = "1"
  435. }else{
  436. dataDict[key.autoRecognition] = "0"
  437. paramDataDict[key.autoRecognition] = "0"
  438. }
  439. // 判断是否自动识别
  440. let num0 = UUUtils.numberHexString(str0.subString(start: 7 + 2 , length: 2))
  441. log.debug("系统电压设置 - \(num0!)")
  442. dataDict[key.BatRateVolt] = "\(num0!)"
  443. paramDataDict[key.BatRateVolt] = "\(num0!)"
  444. //e004
  445. let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4 , length: 4))
  446. var batterytype = ""
  447. switch num1?.intValue {
  448. case 0:
  449. batterytype = "自定义"
  450. case 1:
  451. batterytype = "开口铅酸FLD"
  452. case 2:
  453. batterytype = "密封铅酸SLD"
  454. case 3:
  455. batterytype = "胶体铅酸GEL"
  456. case 4:
  457. batterytype = "锂LI"
  458. case 5:
  459. batterytype = "三元锂电池"
  460. case 6:
  461. batterytype = "磷酸铁锂LI"
  462. case 7:
  463. batterytype = "超级电容"
  464. case 10:
  465. batterytype = "自定义(铅酸专用)"
  466. default: break
  467. }
  468. log.debug("电池类型: \(batterytype)")
  469. dataDict[key.BatTypeSet] = "\(batterytype)"
  470. paramDataDict[key.BatTypeSet] = "\(batterytype)"
  471. //e005
  472. let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 2 , length: 4))
  473. log.debug("超压电压: \(num2!.floatValue * 0.1)")
  474. dataDict[key.BatOverVolt] = "\(num2!.floatValue * 0.1)"
  475. paramDataDict[key.BatOverVolt] = "\(num2!.floatValue * 0.1)"
  476. //e006
  477. let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 3, length: 4))
  478. //BatChgLimitVolt
  479. log.debug("充电限制电压:\(num3!.floatValue * 0.1)")
  480. dataDict[key.BatChgLimitVolt] = "\(num3!.floatValue * 0.1)"
  481. paramDataDict[key.BatChgLimitVolt] = "\(num3!.floatValue * 0.1)"
  482. //e007
  483. let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4))
  484. log.debug("均衡充电电压\(num4!.floatValue * 0.1)")
  485. dataDict[key.BatConstChgVolt] = String(format: "%.1f", num4!.floatValue * 0.1)
  486. paramDataDict[key.BatConstChgVolt] = String(format: "%.1f", num4!.floatValue * 0.1)
  487. //e008
  488. let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5, length: 4))
  489. log.debug("提升充电电压/过充返回电压\(num5!.floatValue * 0.1)")
  490. dataDict[key.BatImprovChgVolt] = "\(String(format: "%.1f", num5!.floatValue * 0.1))"
  491. paramDataDict[key.BatImprovChgVolt] = "\(String(format: "%.1f", num5!.floatValue * 0.1))"
  492. //e009
  493. let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6, length: 4))
  494. log.debug("浮充充电电压/过充返回电压\(num6!.floatValue * 0.1)")
  495. dataDict[key.BatFloatChgVolt] = "\(num6!.floatValue * 0.1)"
  496. paramDataDict[key.BatFloatChgVolt] = "\(num6!.floatValue * 0.1)"
  497. //e00a
  498. let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7, length: 4))
  499. log.debug("提升充电返回电压\(num7!.floatValue * 0.1)")
  500. dataDict[key.BatImprovChgBackVolt] = String(format: "%.1f", num7!.floatValue * 0.1)
  501. paramDataDict[key.BatImprovChgBackVolt] = String(format: "%.1f", num7!.floatValue * 0.1)
  502. //e00b
  503. let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4))
  504. log.debug("过放返回电压\(num8!.floatValue * 0.1)")
  505. dataDict[key.BatOverDischgBackVolt] = "\(num8!.floatValue * 0.1)"
  506. paramDataDict[key.BatOverDischgBackVolt] = "\(num8!.floatValue * 0.1)"
  507. //e00c
  508. let num9 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 9, length: 4))
  509. log.debug("欠压警告电压\(num9!.floatValue * 0.1)")
  510. dataDict[key.BatUnderVolt] = "\(num9!.floatValue * 0.1)"
  511. paramDataDict[key.BatUnderVolt] = "\(num9!.floatValue * 0.1)"
  512. //e00d
  513. let num10 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 10, length: 4))
  514. log.debug("过放电压\(num10!.floatValue * 0.1)")
  515. dataDict[key.BatOverDischgVolt] = "\(num10!.floatValue * 0.1)"
  516. paramDataDict[key.BatOverDischgVolt] = "\(num10!.floatValue * 0.1)"
  517. //e00e
  518. let num11 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 11, length: 4))
  519. log.debug("放电限制电压\(num11!.floatValue * 0.1)")
  520. dataDict[key.BatDischgLimitVolt] = "\(num11!.floatValue * 0.1)"
  521. paramDataDict[key.BatDischgLimitVolt] = "\(num11!.floatValue * 0.1)"
  522. // //e00f
  523. // let num12 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 12, length: 4))
  524. // log.debug("充电截止SOC,放点截止SOC\(num12!)")
  525. //e010
  526. let num13 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 13, length: 4))
  527. log.debug("过放延时时间\(num13!)")
  528. dataDict[key.BatOverDischgDelayTime] = "\(num13!)"
  529. paramDataDict[key.BatOverDischgDelayTime] = "\(num13!)"
  530. //e011
  531. let num14 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 14, length: 4))
  532. log.debug("均衡充电时间\(num14!)")
  533. dataDict[key.BatConstChgTime] = "\(num14!)"
  534. paramDataDict[key.BatConstChgTime] = "\(num14!)"
  535. //e012
  536. let num15 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 15, length: 4))
  537. log.debug("提升充电时间 \(num15!)")
  538. dataDict[key.BatImprovChgTime] = "\(num15!)"
  539. paramDataDict[key.BatImprovChgTime] = "\(num15!)"
  540. //e013
  541. let num16 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 16, length: 4))
  542. log.debug("均衡充电间隔\(num16!)")
  543. dataDict[key.BatConstChgGapTime] = "\(num16!)"
  544. paramDataDict[key.BatConstChgGapTime] = "\(num16!)"
  545. //e014
  546. let num17 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 17, length: 4))
  547. log.debug("温度补偿系数\(num17!)")
  548. dataDict[key.CoeffTemperCompen] = "\(num17!)"
  549. paramDataDict[key.CoeffTemperCompen] = "\(num17!)"
  550. //e015
  551. let num18 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 18, length: 4))
  552. log.debug("充电上限温度\(temp(with: num18!))")
  553. dataDict[key.ChgMaxTemper] = "\(temp(with: num18!))"
  554. paramDataDict[key.ChgMaxTemper] = "\(temp(with: num18!))"
  555. //e016
  556. let num19 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 19, length: 4))
  557. log.debug("充电下限温度\(temp(with: num19!))")
  558. dataDict[key.ChgMinTemper] = "\(temp(with: num19!))"
  559. paramDataDict[key.ChgMinTemper] = "\(temp(with: num19!))"
  560. //e017
  561. let num20 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 20, length: 4))
  562. log.debug("放电上限温度\(temp(with: num20!))")
  563. dataDict[key.DisChagMaxTemper] = "\(temp(with: num20!))"
  564. paramDataDict[key.DisChagMaxTemper] = "\(temp(with: num20!))"
  565. //e018
  566. let num21 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 21, length: 4))
  567. log.debug("放电下限温度\(temp(with: num21!))")
  568. dataDict[key.DisChaMinTemper] = "\(temp(with: num21!))"
  569. paramDataDict[key.DisChaMinTemper] = "\(temp(with: num21!))"
  570. //e01d
  571. let num26 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 26, length: 4))
  572. var loadwordmode = ""
  573. switch num26?.intValue {
  574. case 0:
  575. loadwordmode = "Light_control".da_localizedStr()
  576. case 1:
  577. loadwordmode = "Light_control,_delay_1_hour".da_localizedStr()
  578. case 2:
  579. loadwordmode = "Light_control,_delay_2_hours".da_localizedStr()
  580. case 3:
  581. loadwordmode = "Light_control,_delay_3_hours".da_localizedStr()
  582. case 4:
  583. loadwordmode = "Light_control,_delay_4_hours".da_localizedStr()
  584. case 5:
  585. loadwordmode = "Light_control,_delay_5_hours".da_localizedStr()
  586. case 6:
  587. loadwordmode = "Light_control,_delay_6_hours".da_localizedStr()
  588. case 7:
  589. loadwordmode = "Light_control,_delay_7_hours".da_localizedStr()
  590. case 8:
  591. loadwordmode = "Light_control,_delay_8_hours".da_localizedStr()
  592. case 9:
  593. loadwordmode = "Light_control,_delay_9_hours".da_localizedStr()
  594. case 10:
  595. loadwordmode = "Light_control,_delay_10_hours".da_localizedStr()
  596. case 11:
  597. loadwordmode = "Light_control,_delay_11_hours".da_localizedStr()
  598. case 12:
  599. loadwordmode = "Light_control,_delay_12_hours".da_localizedStr()
  600. case 13:
  601. loadwordmode = "Light_control,_delay_13_hours".da_localizedStr()
  602. case 14:
  603. loadwordmode = "Light_control,_delay_14_hours".da_localizedStr()
  604. case 15:
  605. loadwordmode = "Manual_mode".da_localizedStr()
  606. case 16:
  607. loadwordmode = "Debug_mode".da_localizedStr()
  608. case 17:
  609. loadwordmode = "Normal-on_mode".da_localizedStr()
  610. case 18:
  611. loadwordmode = "Timed_mode".da_localizedStr()
  612. default:
  613. break
  614. }
  615. log.debug("直流负载工作模式\(loadwordmode)")
  616. dataDict[key.DcLoadMode] = "\(loadwordmode)"
  617. paramDataDict[key.DcLoadMode] = "\(loadwordmode)"
  618. //e01e
  619. let num27 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 27, length: 4))
  620. log.debug("光控延时时间\(num27!)")
  621. dataDict[key.LightCtrlDelayTime] = "\(num27!)"
  622. paramDataDict[key.LightCtrlDelayTime] = "\(num27!)"
  623. //d01f
  624. let num28 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 28, length: 4))
  625. log.debug("光控电压\(num28!)")
  626. dataDict[key.LightCtrlVolt] = "\(num28!)"
  627. paramDataDict[key.LightCtrlVolt] = "\(num28!)"
  628. }
  629. func realdata_DF00(_ reciveData : String) {
  630. let str0 = reciveData.replacingOccurrences(of: " ", with: "")
  631. log.debug("处理真实数据 - \(str0)")
  632. // <ff030200009190>
  633. let num0 = UUUtils.numberHexString(str0.subString(start: 7, length: 4))
  634. log.debug("开关控制 —— \(num0)")
  635. var cmd = ""
  636. if num0?.intValue == 0 {
  637. cmd = "Off".da_localizedStr()
  638. }else if num0?.intValue == 1{
  639. cmd = "On".da_localizedStr()
  640. }
  641. dataDict[key.CmdPowerOnOff] = cmd
  642. paramDataDict[key.CmdPowerOnOff] = cmd
  643. }
  644. func realdata_DF0D(_ reciveData : String) {
  645. let str0 = reciveData.replacingOccurrences(of: " ", with: "")
  646. log.debug("处理真实数据 - \(str0)")
  647. // <ff030200 009190>
  648. let num0 = UUUtils.numberHexString(str0.subString(start: 7, length: 4))
  649. log.debug("手动均衡 —— \(num0)")
  650. var canhandle = ""
  651. if num0?.intValue == 0 {
  652. canhandle = "Prohibited".da_localizedStr()
  653. }else if num0?.intValue == 1{
  654. canhandle = "Enable".da_localizedStr()
  655. }
  656. dataDict[key.BattEqualChgImmediate] = canhandle
  657. paramDataDict[key.BattEqualChgImmediate] = canhandle
  658. // let year = UUUtils.numberHexString(str0.subString(start: 7, length: 2))
  659. // let mouth = UUUtils.numberHexString(str0.subString(start: 7 + 2, length: 2))
  660. // let day = UUUtils.numberHexString(str0.subString(start: 7 + 2 + 2, length: 2))
  661. // log.debug("生产日期 : \(year!)-\(mouth!)-\(day!)")
  662. }
  663. func realdata_E021(_ reciveData : String) {
  664. let str0 = reciveData.replacingOccurrences(of: " ", with: "")
  665. log.debug("处理真实数据 - \(str0)")
  666. // <ff030201009000> str0.subString(start: 7, length: 4)
  667. let num0 = UUUtils.getBinaryByHex(str0.subString(start: 7, length: 4))
  668. //("0000000100000000")
  669. //00 000 001 00000000
  670. log.debug("E021 —— \(num0)")
  671. //RX
  672. let rx = num0?.subString(start: 2, length: 3)
  673. var rx_function = ""
  674. if rx == "000"{
  675. rx_function = "Normal_communication".da_localizedStr()
  676. }
  677. // else if rx == "001"{
  678. // rx_function = "远程开关"
  679. //
  680. // }else if rx == "010"{
  681. // rx_function = "负载输出设置"
  682. //
  683. // }else if rx == "011"{
  684. // rx_function = "负载输出开/关 反相"
  685. //
  686. // }else if rx == "100"{
  687. // rx_function = "负载输出开/关 正常"
  688. // }
  689. log.debug("Rx端口 \(rx_function)")
  690. dataDict[key.rx] = "\(rx_function)"
  691. paramDataDict[key.rx] = "\(rx_function)"
  692. let tx = num0?.subString(start: 5, length: 3)
  693. log.debug("")
  694. var tx_function = ""
  695. if tx == "000" {
  696. tx_function = "Normal_communication".da_localizedStr()
  697. }
  698. // else if tx == "001"{
  699. // tx_function = "虚拟负载输出"
  700. // }else if tx == "010"{
  701. // tx_function = "每0.01kwh脉冲"
  702. // }else if tx == "011"{
  703. // tx_function = "灯光调暗(pwm正常)"
  704. // }else if tx == "100"{
  705. // tx_function = "灯光调暗(pwm反相)"
  706. // }
  707. log.debug("tx端口 \(tx_function)")
  708. dataDict[key.tx] = "\(tx_function)"
  709. paramDataDict[key.tx] = "\(tx_function)"
  710. log.debug("返回数据paramDataDict-- \(self.paramDataDict)")
  711. AppShare.paramDataDict = self.paramDataDict
  712. NotificationCenter.default.post(name: NSNotification.Name(kNotifionCationBatParam), object: nil)
  713. }
  714. //获取设备数据
  715. func getDevieData(){
  716. BabyBluetoothSwift.shareInstance()?.testBlock2 = {[weak self](deviceData) in
  717. let a = deviceData?.value(forKey: ReceiveData) as! String
  718. let str0 = a.subString(start: 0, length: 6)
  719. log.debug("返回的数据 -- \(a)")
  720. if str0.subString(start: 1, length: 4) == "ff03" {
  721. let dataTagValue : String = deviceData?.value(forKey: DataTag) as! String
  722. if dataTagValue == "FF03000A0001"{
  723. self!.realdata_000A(a)
  724. }
  725. if dataTagValue == "FF03000B004E" {
  726. self!.realdata_000B(a)
  727. }
  728. if dataTagValue == "FF0300FD000D" {
  729. self!.realdata_00FD(a)
  730. }
  731. if dataTagValue == "FF03F000000A" {
  732. self!.historyDataArr.removeAll()
  733. self!.realdata_F000(a)
  734. }
  735. if dataTagValue == "FF03F001000A" {
  736. self!.realdata_F001(a)
  737. }
  738. if dataTagValue == "FF03F002000A" {
  739. self!.realdata_F002(a)
  740. }
  741. if dataTagValue == "FF03F003000A" {
  742. self!.realdata_F003(a)
  743. }
  744. if dataTagValue == "FF03F004000A" {
  745. self!.realdata_F004(a);
  746. }
  747. if dataTagValue == "FF03F005000A" {
  748. self!.realdata_F005(a);
  749. }
  750. if dataTagValue == "FF03F006000A" {
  751. self!.realdata_F006(a);
  752. }
  753. // if dataTagValue == "FF03F007000A" {
  754. // self!.realdata_F007(a);
  755. // }
  756. if dataTagValue == "FF030115000B"{
  757. self!.realdata_0115(a)
  758. }
  759. if dataTagValue == "FF03E003001E" {
  760. self!.realdata_E003(a);
  761. }
  762. if dataTagValue == "FF03DF000001" {
  763. self!.realdata_DF00(a);
  764. }
  765. if dataTagValue == "FF03DF0D0001" {
  766. self!.realdata_DF0D(a)
  767. }
  768. if dataTagValue == "FF03E0210001"{
  769. self!.realdata_E021(a)
  770. }
  771. if dataTagValue == "FF0300490020"{
  772. self!.readdata_0049(a)
  773. }
  774. }
  775. // log.debug("返回数据dataDict-- \(self!.dataDict)")
  776. AppShare.dataDict = self!.dataDict
  777. //kBabyBluetoothNotificationAllDataRecieve
  778. if AppShare.isRefresh == true {
  779. NotificationCenter.default.post(name: NSNotification.Name(kBabyBluetoothNotificationAllDataRecieve), object: nil)
  780. }
  781. }
  782. }
  783. //获取设备数据
  784. func getParamData(){
  785. // ["FF03000A0001","FF03E003001E","FF03DF000001","FF03DF0D0001","FF03E0210001"]
  786. BabyBluetoothSwift.shareInstance()?.testBlock2 = {[weak self](deviceData) in
  787. let a = deviceData?.value(forKey: ReceiveData) as! String
  788. let str0 = a.subString(start: 0, length: 6)
  789. log.debug("返回的数据 -- \(a)")
  790. if str0.subString(start: 1, length: 4) == "ff03" {
  791. let dataTagValue : String = deviceData?.value(forKey: DataTag) as! String
  792. if dataTagValue == "FF03000A0001"{
  793. self!.realdata_000A(a)
  794. }
  795. if dataTagValue == "FF03E003001E" {
  796. self!.realdata_E003(a);
  797. }
  798. if dataTagValue == "FF03DF000001" {
  799. self!.realdata_DF00(a);
  800. }
  801. if dataTagValue == "FF03DF0D0001" {
  802. self!.realdata_DF0D(a)
  803. }
  804. if dataTagValue == "FF03E0210001"{
  805. self!.realdata_E021(a)
  806. }
  807. }
  808. }
  809. }
  810. //获取实时数据
  811. func getRealData(){
  812. BabyBluetoothSwift.shareInstance()?.testBlock2 = {[weak self](deviceData) in
  813. let a = deviceData?.value(forKey: ReceiveData) as! String
  814. let str0 = a.subString(start: 0, length: 6)
  815. log.debug(" ------------ ======== ----返回的数据 -- \(a)")
  816. if str0.subString(start: 1, length: 4) == "ff03" {
  817. let dataTagValue : String = deviceData?.value(forKey: DataTag) as! String
  818. if dataTagValue == "FF0300FD000D" {
  819. let str0 = a.replacingOccurrences(of: " ", with: "")
  820. log.debug("处理真实数据 - \(str0)")
  821. var realDataDict2 : [String:Any] = [String:Any]()
  822. let key2: DeviceDictKey = DeviceDictKey()
  823. //太阳能板状态 0 000 0000 0000 0000 0000 0000 0000 0010
  824. // 31
  825. let num0A = UUUtils.getBinaryByHex(str0.subString(start: 11 , length: 8))
  826. log.debug("太阳能板状态\(num0A!)")
  827. var solarStatusStr = ""
  828. let B28 = num0A?.subString(start: 3, length: 1)
  829. let B27 = num0A?.subString(start: 4, length: 1)
  830. let B26 = num0A?.subString(start: 5, length: 1)
  831. let B25 = num0A?.subString(start: 6, length: 1)
  832. let B24 = num0A?.subString(start: 7, length: 1)
  833. let B23 = num0A?.subString(start: 8, length: 1)
  834. //负载
  835. let B20 = num0A?.subString(start: 11, length: 1)
  836. let B19 = num0A?.subString(start: 12, length: 1)
  837. let B15 = num0A?.subString(start: 16, length: 1)
  838. //系统
  839. //蓄电池状态
  840. let B22 = num0A?.subString(start: 9, length: 1)
  841. let B18 = num0A?.subString(start: 13, length: 1)
  842. let B17 = num0A?.subString(start: 14, length: 1)
  843. let B16 = num0A?.subString(start: 15, length: 1)
  844. let B12 = num0A?.subString(start: 19, length: 1)
  845. let B11 = num0A?.subString(start: 20, length: 1)
  846. let B10 = num0A?.subString(start: 21, length: 1)
  847. var batteryStatusStr = ""
  848. if B10 == "1" {
  849. batteryStatusStr = "BMS过充保护"
  850. }
  851. if B11 == "1" {
  852. batteryStatusStr = "电池低温保护,停止充电"
  853. }
  854. if B12 == "1" {
  855. batteryStatusStr = "电池反接"
  856. }
  857. if B16 == "1" {
  858. batteryStatusStr = "蓄电池过放"
  859. }
  860. if B17 == "1" {
  861. batteryStatusStr = "蓄电池超压"
  862. }
  863. if B18 == "1" {
  864. batteryStatusStr = "欠压警告"
  865. }
  866. if B22 == "1" {
  867. batteryStatusStr = "外部坏境温度过高"
  868. }
  869. if B10 == "0" && B11 == "0" && B12 == "0" && B16 == "0" && B17 == "0" && B18 == "0" && B22 == "0"{
  870. batteryStatusStr = "正常"
  871. }
  872. realDataDict2[key2.batteryStatus] = batteryStatusStr
  873. //太阳能状态
  874. if B23 == "1" {
  875. solarStatusStr = "光伏输入功率过大"
  876. }
  877. if B24 == "1" {
  878. solarStatusStr = "光伏输入端短路"
  879. }
  880. if B25 == "1" {
  881. solarStatusStr = "光伏输入端超压"
  882. }
  883. if B26 == "1" {
  884. solarStatusStr = "太阳板逆流"
  885. }
  886. if B27 == "1" {
  887. solarStatusStr = "太阳板工作点超压"
  888. }
  889. if B28 == "1" {
  890. solarStatusStr = "太阳板反接"
  891. }
  892. realDataDict2[key2.solarStatus] = solarStatusStr
  893. if B23 == "0" && B24 == "0" && B25 == "0" && B26 == "0" && B27 == "0" && B28 == "0" {
  894. realDataDict2[key2.solarStatus] = batteryStatusStr
  895. }
  896. let num0 = UUUtils.getBinaryByHex(str0.subString(start: 7, length: 4))
  897. log.debug("00FD \(num0!)")
  898. //0000 0000 0000 0000 从后往前数
  899. let loadStatus = "\(num0?.subString(start: 0, length: 1) ?? "")"
  900. var loadStatusStr = ""
  901. if B15 == "1" {
  902. loadStatusStr = "负载开路"
  903. }
  904. if B19 == "1" {
  905. loadStatusStr = "负载短路"
  906. }
  907. if B20 == "1" {
  908. loadStatusStr = "负载功率过大或负载过流"
  909. }
  910. if B15 == "0" && B19 == "0" && B20 == "0" {
  911. if loadStatus == "0" {
  912. loadStatusStr = "负载已关"
  913. }else if loadStatus == "1" {
  914. loadStatusStr = "负载已开"
  915. }
  916. }
  917. log.debug("负载状态 :\(num0?.subString(start: 7, length: 1) ?? "")") // 低八位
  918. realDataDict2[key2.loadStatus] = loadStatusStr
  919. //蓄电池状态
  920. //太阳能电压 0107
  921. let num1 = UUUtils.numberHexString(str0.subString(start: 47, length: 4))
  922. print("太阳能电压 \(num1!.floatValue * 0.1)" )
  923. let solarV = String(format: "%.1f", num1!.floatValue * 0.1)
  924. realDataDict2[key2.solarVoltage] = "\(solarV)"
  925. // 太阳能电流 0108
  926. let num2 = UUUtils.numberHexString(str0.subString(start: 47 + 4, length: 4))
  927. log.debug("太阳能电流 \(num2!.floatValue * 0.01)")
  928. realDataDict2[key2.solarCurrent] = String(format: "%.2f", num2!.floatValue * 0.01)
  929. // 太阳能功率 0109
  930. let num2_1 = UUUtils.numberHexString(str0.subString(start: 47 + 4 + 4, length: 4))
  931. log.debug("太阳能功率 \(num2_1!)")
  932. realDataDict2[key2.solarPower] = "\(num2_1!)"
  933. //蓄电池 电压
  934. let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4))
  935. log.debug("蓄电池电压 \(num3!.floatValue * 0.1)")
  936. realDataDict2[key2.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1)
  937. let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5, length: 4))
  938. log.debug("蓄电池电流\(num4!.floatValue * 0.01)")
  939. realDataDict2[key2.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01)
  940. let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6 + 2 , length: 2))
  941. log.debug("温度、 \(num5!)")
  942. let numInt = num5!.intValue
  943. let q2 = numInt & 128
  944. var temp = ""
  945. print("判断正负\(q2)")
  946. if q2 != 128 {
  947. log.debug("温度\(num5!.intValue )")
  948. temp = "\(num5!.intValue )"
  949. }else{
  950. log.debug("温度: -\(numInt & 127 )")
  951. temp = "-\(numInt & 127 )"
  952. }
  953. //log.debug("温度 \(self!.temp(with: num5!))")
  954. realDataDict2[key2.batteryTemp] = temp
  955. //负载
  956. let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7, length: 4))
  957. log.debug("负载电压\(num6!.floatValue * 0.1)")
  958. realDataDict2[key2.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1)
  959. let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4))
  960. log.debug("负载电流\(num7!.floatValue * 0.01)")
  961. realDataDict2[key2.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01)
  962. let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 9, length: 4))
  963. log.debug("功率 \(num8! )")
  964. realDataDict2[key2.loadPower] = "\(num8!)"
  965. AppShare.realDataDict = realDataDict2
  966. log.debug("返回数据实时数据-- \(AppShare.realDataDict)")
  967. NotificationCenter.default.post(name: NSNotification.Name(kBabyBluetoothNotificationUartDataRecieve), object: nil)
  968. }
  969. }
  970. }
  971. }
  972. //统计数据
  973. func getCumulativeData(){
  974. BabyBluetoothSwift.shareInstance()?.testBlock2 = {[weak self](deviceData) in
  975. let a = deviceData?.value(forKey: ReceiveData) as! String
  976. let str0 = a.subString(start: 0, length: 6)
  977. log.debug(" ------------ ======== ----返回的数据 -- \(a)")
  978. if str0.subString(start: 1, length: 4) == "ff03" {
  979. let dataTagValue : String = deviceData?.value(forKey: DataTag) as! String
  980. if dataTagValue == "FF030115000B" {
  981. let str0 = a.replacingOccurrences(of: " ", with: "")
  982. log.debug("处理真实数据 - \(str0)")
  983. //
  984. var cumulativeDataDict2 : [String :Any] = [String: Any]() /// 累计数据
  985. let key2: DeviceDictKey = DeviceDictKey()
  986. let num0 = UUUtils.numberHexString(str0.subString(start: 7 , length: 4))
  987. log.debug("总运行天数 - \(num0!)")
  988. cumulativeDataDict2[key2.runTime] = ("\(num0!)")
  989. let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4 , length: 4))
  990. log.debug("蓄电池总过放次数 - \(num1!)")
  991. cumulativeDataDict2[key2.overTimes] = "\(num1!)"
  992. let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 8 , length: 4))
  993. log.debug("蓄电池总充满次数 - \(num2!)")
  994. cumulativeDataDict2[key2.fullTimes] = "\(num2!)"
  995. let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 12 , length: 8))
  996. log.debug("蓄电池总充电安时数 - \(num3!)")
  997. cumulativeDataDict2[key2.chargingAmpereHour] = "\(num3!)"
  998. let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 , length: 8))
  999. log.debug("蓄电池总放电安时数 - \(num4!)")
  1000. cumulativeDataDict2[key2.dischargeAmpereHour] = "\(num4!)"
  1001. let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 * 2 , length: 8))
  1002. log.debug("累计发电量 - \(num5!)")
  1003. cumulativeDataDict2[key2.generatEnergyTotal] = "\(num5!)"
  1004. let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 * 3, length: 8))
  1005. log.debug("累计用电量 - \(num6!)")
  1006. cumulativeDataDict2[key2.usedEnergyTotal] = "\(num6!)"
  1007. log.debug("、统计数据 == \(cumulativeDataDict2)")
  1008. AppShare.cumulativeDataDict = cumulativeDataDict2
  1009. NotificationCenter.default.post(name: NSNotification.Name(kBabyBluetoothNotificationCumulativeDataRecieve), object: nil)
  1010. }
  1011. }
  1012. }
  1013. }
  1014. }