SBTDeviceDetaiVCtr.swift 62 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469
  1. //
  2. // SBTDeviceDetaiVCtr.swift
  3. // SolarBT
  4. //
  5. // Created by weclouds on 2019/1/28.
  6. // Copyright © 2019 weclouds. All rights reserved.
  7. //
  8. /*
  9. 进入设备信息页面
  10. 检测 本地是否保存有该设备的数据
  11. 否 || 是
  12. 读取一遍所有数据 || 从本地获取
  13. 保存到本地 ||
  14. (在这个页面结束的时候保存就好了)
  15. 循环刷新数据
  16. 实时数据 统计数据
  17. */
  18. import UIKit
  19. import JXCategoryView
  20. import PKHUD
  21. class SBTDeviceDetaiVCtr: BaseViewController {
  22. var checkUartCommandTimerEnd :(()->Void)?
  23. var checkHistoryCommandTimerEnd :(()->Void)?
  24. var isUartCommandTimerEnd : Bool? = false
  25. var isHistoryCommandTimerEnd : Bool? = false
  26. var peripheralName :String?
  27. var isOld :Bool?
  28. var categoryViewTimer : Timer?
  29. lazy var historyCommandTimer: Timer? = { // 定时器 历史数据定时器
  30. let historyCommandTimer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(historyCommandTimerCallback), userInfo: nil, repeats: true)
  31. return historyCommandTimer
  32. }()
  33. lazy var uartCommandTimer: Timer? = { // 定时器 实时数据定时器
  34. let uartCommandTimer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(uartCommandTimerCallback), userInfo: nil, repeats: true)
  35. return uartCommandTimer
  36. }()
  37. var solarPower : CGFloat?
  38. var solarPowerValue :String?
  39. var isManual:Bool? = false // 是否手动模式
  40. var isRealTime = false // 是否是实时数据
  41. var cumulativeDict : [String: Any] = [String: Any]()
  42. var deviceDetailData: [String: Any] = [String: Any]()
  43. var dataDict : [String: Any] = [String: Any]()
  44. var paramDataDict : [String: Any] = [String: Any]()
  45. var realDataDict : [String:Any] = [String:Any]()
  46. var cumulativeDataDict : [String :Any] = [String: Any]() /// 累计数据
  47. let key: DeviceDictKey = DeviceDictKey()
  48. var historyDataArr: [[String: String]] = [[String: String]]()
  49. var currentIndex : Int? = 0
  50. var isDemo:Bool? = false
  51. var isHistoryTimerFire :Bool? = false // 是否开启历史数据定时器
  52. var isSetAction : Bool? = false // 是否点击了设置
  53. var plist_node:String? // plist的子节点
  54. var deviceName:String? // 设备名称
  55. let titles = ["Real-time_status".da_localizedStr(),"Historical_data".da_localizedStr(),"Basic_information".da_localizedStr()]
  56. lazy var device = DeviceData()
  57. lazy var categoryView: JXCategoryTitleImageView = {
  58. let imageNames = ["no","no","no"]
  59. let selectedImageNames = ["标签箭头","标签箭头","标签箭头"]
  60. let categoryView = JXCategoryTitleImageView()
  61. categoryView.titles = titles
  62. categoryView.imageNames = imageNames
  63. categoryView.selectedImageNames = selectedImageNames
  64. categoryView.isImageZoomEnabled = true
  65. categoryView.imageZoomScale = 1.1// 图片放大
  66. categoryView.isAverageCellSpacingEnabled = true
  67. return categoryView
  68. }()
  69. let scrollView = UIScrollView()
  70. let shouldHandleScreenEdgeGesture : Bool = true
  71. }
  72. //MARK:lifeCycle
  73. extension SBTDeviceDetaiVCtr{
  74. override func viewDidLoad() {
  75. super.viewDidLoad()
  76. checkTheBlueToothWasActivity()
  77. if self.isDemo == false {
  78. self.sbtTitle = "Device_details".da_localizedStr()
  79. }else{
  80. self.sbtTitle = "Device_details".da_localizedStr() + "(" + "demo_data".da_localizedStr() + ")"
  81. }
  82. createUI()
  83. if self.isDemo == false {
  84. // HUD.flash(.progress, delay: 2)
  85. // readDeviceName()
  86. if self.isOld == false{
  87. delay(0.5) {
  88. BabyBluetoothSwift.shareInstance()?.writeData2222(["FF0300490020"], completionHandler: { (result) in
  89. let a = result!["FF0300490020"] as! String
  90. self.readdata_0049(a)
  91. delay(3, closure: {
  92. self.uartCommandTimerStart()
  93. })
  94. })
  95. }
  96. }else{
  97. delay(3) {
  98. self.uartCommandTimerStart()
  99. }
  100. }
  101. }
  102. }
  103. override func viewWillAppear(_ animated: Bool) {
  104. super.viewWillAppear(animated)
  105. if AppShare.reloadDeviceReciveData == true{
  106. }
  107. NotificationCenter.default.addObserver(self, selector: #selector(sendHistoryCmd), name: NSNotification.Name(kNotifitionSBTDeviceDetaiVCtrSendHistory), object: nil)
  108. NotificationCenter.default.addObserver(self, selector:#selector(uartCommandTimerPause), name: NSNotification.Name(kNotifitionSBTDeviceDetaiVCtrRealTimerStop), object: nil)
  109. NotificationCenter.default.addObserver(self, selector:#selector(uartCommandTimerContinue), name: NSNotification.Name(kNotifitionSBTDeviceDetaiVCtrRealTimerStart), object: nil)
  110. NotificationCenter.default.addObserver(self, selector: #selector(historyCommandTimerPause)
  111. , name: NSNotification.Name(rawValue: kNotifitionSBTDeviceDetaiVCtrHistoryTimerStop), object: nil)
  112. NotificationCenter.default.addObserver(self, selector: #selector(historyCommandTimerContinue)
  113. , name: NSNotification.Name(rawValue: kNotifitionSBTDeviceDetaiVCtrHistoryTimerStart), object: nil)
  114. }
  115. override func viewWillDisappear(_ animated: Bool) {
  116. super.viewWillDisappear(animated)
  117. if self.isDemo == false {
  118. uartCommandTimerPause()
  119. historyCommandTimerPause()
  120. }
  121. }
  122. override func viewDidDisappear(_ animated: Bool) {
  123. super.viewDidDisappear(animated)
  124. if self.isDemo == false {
  125. uartCommandTimerPause()
  126. historyCommandTimerPause()
  127. }
  128. }
  129. override func viewDidAppear(_ animated: Bool) {
  130. super.viewDidAppear(animated)
  131. //当前事第一个页面的时候
  132. navigationController?.interactivePopGestureRecognizer?.isEnabled = false
  133. // navigationController?.interactivePopGestureRecognizer?.isEnabled = (categoryView.selectedIndex == 0)
  134. log.debug("viewDidAppear")
  135. if self.isSetAction == true && self.isDemo == false{
  136. let index = self.currentIndex
  137. self.historyCommandTimerPause()
  138. self.uartCommandTimerPause()
  139. if index == 0 {
  140. delay(2) {
  141. self.uartCommandTimerContinue()
  142. }
  143. }else if index == 1{
  144. //判断历史数据定时器是否已经开启。如果没有开启,则开启
  145. delay(5) {
  146. if self.isHistoryTimerFire == false{
  147. self.historyCommandTimerStart()
  148. }else{
  149. self.historyCommandTimerContinue()
  150. }
  151. }
  152. }
  153. }
  154. }
  155. }
  156. extension SBTDeviceDetaiVCtr{
  157. @objc func refreshAction () {
  158. if self.isDemo == true {
  159. g_toast("Current_demo_data".da_localizedStr())
  160. return
  161. }
  162. if self.currentIndex == 0 {
  163. uartCommandTimerPauseCheckEnd { () in
  164. log.debug("当前下标 -- \(self.currentIndex)")
  165. log.debug("检查是否已经结束--- \(self.isUartCommandTimerEnd)")
  166. self.aRefreshData()
  167. }
  168. }else if self.currentIndex == 1 {
  169. historyCommandTimerPauseCheckEnd {
  170. log.debug("当前下标 -- \(self.currentIndex)")
  171. self.aRefreshData()
  172. }
  173. }else{ // index= 3
  174. historyCommandTimerPause()
  175. uartCommandTimerPause()
  176. }
  177. //循环执行
  178. categoryViewTimer?.invalidate()
  179. log.debug("刷新数据")
  180. let alert = SBTReadLoadingVCtr(nibName: "SBTReadLoadingVCtr", bundle: nil)
  181. let plist = CLDeviceDataPlist()
  182. let dataDict1 = plist.findData(deviceDetailPlist, key: self.plist_node!)
  183. var productName = ""
  184. if self.isOld == true {
  185. productName = " "
  186. }else{
  187. productName = dataDict1![key.productName] as! String
  188. }
  189. alert.deviceName = productName
  190. alert.message = "Data_refreshing...".da_localizedStr()
  191. alert.show()
  192. alert.dismiss(10)
  193. }
  194. func aRefreshData() {
  195. if self.isOld == false{
  196. BabyBluetoothSwift.shareInstance()?.writeData2222(["FF0300490020"], completionHandler: { (result) in
  197. let a = result!["FF0300490020"] as! String
  198. self.readdata_0049(a)
  199. })
  200. }
  201. delay(3) {
  202. self.refreshData()
  203. }
  204. }
  205. //
  206. func refreshData() {
  207. if self.isOld == true {
  208. let arr = ["FF03000A0001","FF03E0030001","FF03E0080001","FF030100000A","FF0301200003","FF03F000000A","FF03F001000A","FF03F002000A","FF03F003000A","FF03F004000A","FF03F005000A","FF03F006000A","FF03F007000A","FF030115000B"]
  209. BabyBluetoothSwift.shareInstance()?.writeData2222(arr, completionHandler: { (result) in
  210. log.debug("返回数据 --- \(ReceiveData)")
  211. //实时数据
  212. self.realdata_000A(result!["FF03000A0001"] as! String)
  213. self.realdata_E003(result!["FF03E0030001"] as! String)
  214. self.realdata_E008(result!["FF03E0080001"] as!String)
  215. self.realdata_0100(result!["FF030100000A"] as! String)
  216. self.realdata_0120(result!["FF0301200003"] as! String)
  217. NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifisionDeviceDatailDataRealDataRecieve), object: nil, userInfo: self.realDataDict)
  218. self.historyDataArr.removeAll()
  219. //历史数据
  220. self.realdata_F000(result!["FF03F000000A"] as! String)
  221. self.realdata_F001(result!["FF03F001000A"] as! String)
  222. self.realdata_F002(result!["FF03F002000A"] as! String)
  223. self.realdata_F003(result!["FF03F003000A"] as! String)
  224. self.realdata_F004(result!["FF03F004000A"] as! String)
  225. self.realdata_F005(result!["FF03F005000A"] as! String)
  226. self.realdata_F006(result!["FF03F006000A"] as! String)
  227. self.realdata_F007(result!["FF03F007000A"] as! String)
  228. self.realdata_0115(result!["FF030115000B"] as! String)
  229. self.perform(#selector(self.timerStar), with: nil, afterDelay: 1)
  230. self.timeChange()
  231. log.debug("加载结束 -- old")
  232. })
  233. }else{
  234. let arr = ["FF03000A0001","FF03E0030001","FF03E0080001","FF0300FD000D","FF03F000000A","FF03F001000A","FF03F002000A","FF03F003000A","FF03F004000A","FF03F005000A","FF03F006000A","FF03F007000A","FF030115000B"]
  235. BabyBluetoothSwift.shareInstance()?.writeData2222(arr, completionHandler: { (result) in
  236. log.debug("返回数据 --- \(result)")
  237. //实时数据
  238. self.realdata_000A(result!["FF03000A0001"] as! String)
  239. self.realdata_00FD(result!["FF0300FD000D"] as! String)
  240. self.realdata_E003(result!["FF03E0030001"] as! String)
  241. self.realdata_E008(result!["FF03E0080001"] as!String)
  242. NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifisionDeviceDatailDataRealDataRecieve), object: nil, userInfo: self.realDataDict)
  243. //历史数据
  244. self.historyDataArr.removeAll()
  245. self.realdata_F000(result!["FF03F000000A"] as! String)
  246. self.realdata_F001(result!["FF03F001000A"] as! String)
  247. self.realdata_F002(result!["FF03F002000A"] as! String)
  248. self.realdata_F003(result!["FF03F003000A"] as! String)
  249. self.realdata_F004(result!["FF03F004000A"] as! String)
  250. self.realdata_F005(result!["FF03F005000A"] as! String)
  251. self.realdata_F006(result!["FF03F006000A"] as! String)
  252. self.realdata_F007(result!["FF03F007000A"] as! String)
  253. self.realdata_0115(result!["FF030115000B"] as! String)
  254. // self.perform(#selector(self.timerStar), with: nil, afterDelay: 1)
  255. // self.timeChange()
  256. log.debug("加载结束 -- new")
  257. })
  258. }
  259. }
  260. func timeChange() {
  261. var time = 5
  262. let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (timer) in
  263. time = time - 1
  264. log.debug("计时 -- \(time)")
  265. //处理事件
  266. NotificationCenter.default.post(name: NSNotification.Name(kNotifitionSBTDeviceDetailVCtrRefreshStatus), object: nil, userInfo: ["countdown":"\(time)"])
  267. if time < 0 {
  268. timer.invalidate()
  269. }
  270. }
  271. timer.fire()
  272. }
  273. @objc func timerStar() {
  274. let index = self.currentIndex
  275. if index == 0 {
  276. uartCommandTimerContinue()
  277. }else if index == 1{
  278. historyCommandTimerContinue()
  279. }
  280. }
  281. @objc func setAction () {
  282. self.isSetAction = true
  283. log.debug("设置")
  284. AppShare.reloadDeviceReciveData = true
  285. if self.isDemo == true {
  286. g_toast("Current_demo_data".da_localizedStr())
  287. }
  288. if self.isDemo == false {
  289. categoryViewTimer?.invalidate()
  290. uartCommandTimerPause()
  291. historyCommandTimerPause()
  292. }
  293. let vc = SBTPramSettingVCtr()
  294. vc.bleKey = self.plist_node
  295. vc.isDemo = self.isDemo
  296. vc.isOld = self.isOld
  297. delay(0.25) {
  298. self.navigationController?.pushViewController(vc, animated: true)
  299. }
  300. }
  301. func createUI() {
  302. setNavgationBar()
  303. let refreshbtn = UIBarButtonItem.createBarbuttonItem(image: "刷新", highImage: "刷新", target: self, action: #selector(refreshAction))
  304. let setbtn = UIBarButtonItem.createBarbuttonItem(image: "参数设置", highImage: "参数设置", target: self, action: #selector(setAction))
  305. //设置空白展位bar
  306. let spaceItem = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
  307. spaceItem.width = 20
  308. self.navigationItem.rightBarButtonItems = [setbtn,spaceItem,refreshbtn]
  309. //滚动视图
  310. let count = preferredListViewCount()
  311. let categoryViewHeight = preferredCategoryViewHeight()
  312. let width = KSCREENWIDTH
  313. let height = KSCREENHEIGHT - KNavBarHeight - categoryViewHeight
  314. scrollView.frame = CGRect(x: 0, y: categoryViewHeight, width: width, height: height)
  315. scrollView.showsVerticalScrollIndicator = false
  316. scrollView.showsHorizontalScrollIndicator = false
  317. scrollView.delegate = self
  318. scrollView.isPagingEnabled = true
  319. scrollView.contentSize = CGSize(width: width * CGFloat(count), height: height)
  320. scrollView.bounces = false
  321. // scrollView.isScrollEnabled = false
  322. view.addSubview(scrollView)
  323. let realtimeVc = SBTRealTimeStatusVCtr()
  324. realtimeVc.preVC = self
  325. realtimeVc.isOld = self.isOld
  326. realtimeVc.bleKey = self.plist_node
  327. realtimeVc.isDemo = self.isDemo
  328. addChild(realtimeVc)
  329. realtimeVc.view.frame = CGRect(x: 0, y: 0, width: width, height: height)
  330. scrollView.addSubview(realtimeVc.view)
  331. let historyVC = SBTHistoryDataVCtr()
  332. historyVC.isOld = self.isOld
  333. historyVC.belKey = self.plist_node
  334. historyVC.isDemo = self.isDemo
  335. addChild(historyVC)
  336. historyVC.view.frame = CGRect(x: width, y: 0, width: width, height: height)
  337. scrollView.addSubview(historyVC.view)
  338. let baseInfoVc = SBTBaseInfoVCtr()
  339. baseInfoVc.isOld = self.isOld
  340. baseInfoVc.belKey = self.plist_node
  341. baseInfoVc.isDemo = self.isDemo
  342. addChild(baseInfoVc)
  343. baseInfoVc.view.frame = CGRect(x: width * 2, y: 0, width: width, height: height)
  344. scrollView.addSubview(baseInfoVc.view)
  345. categoryView.frame = CGRect(x: 0, y: 0, width: KSCREENWIDTH, height: categoryViewHeight)
  346. categoryView.delegate = self
  347. categoryView.contentScrollView = scrollView
  348. view.addSubview(categoryView)
  349. categoryView.titleColor = UIColor(hexString: "222222")
  350. categoryView.titleSelectedColor
  351. = UIColor(hexString: "FD8B23")
  352. }
  353. func preferredListViewCount() -> Int {
  354. return 3
  355. }
  356. func preferredCategoryViewHeight() -> CGFloat {
  357. return 49
  358. }
  359. }
  360. extension SBTDeviceDetaiVCtr :UIScrollViewDelegate,JXCategoryViewDelegate{
  361. func categoryView(_ categoryView: JXCategoryBaseView!, didScrollSelectedItemAt index: Int) {
  362. }
  363. func categoryView(_ categoryView: JXCategoryBaseView!, didClickSelectedItemAt index: Int) {
  364. }
  365. func categoryView(_ categoryView: JXCategoryBaseView!, canClickItemAt index: Int) -> Bool {
  366. return true
  367. }
  368. func categoryView(_ categoryView: JXCategoryBaseView!, scrollingFromLeftIndex leftIndex: Int, toRightIndex rightIndex: Int, ratio: CGFloat) {
  369. // log.debug("leftIndex -- \(leftIndex) rightIndext---\(rightIndex) --- ratio - \(ratio)")
  370. /*
  371. 正在滚动中的回调
  372. @param categoryView categoryView对象
  373. @param leftIndex 正在滚动中,相对位置处于左边的index
  374. @param rightIndex 正在滚动中,相对位置处于右边的index
  375. @param ratio 从左往右计算的百分比
  376. */
  377. }
  378. func categoryView(_ categoryView: JXCategoryBaseView!, didSelectedItemAt index: Int) {
  379. if shouldHandleScreenEdgeGesture {
  380. // navigationController?.interactivePopGestureRecognizer?.isEnabled = (index == 0)
  381. navigationController?.interactivePopGestureRecognizer?.isEnabled = false
  382. }
  383. self.currentIndex = index
  384. log.debug("当前控制器 \(index)")
  385. if self.isDemo == false {
  386. uartCommandTimerPause()
  387. historyCommandTimerPause()
  388. }
  389. if index != 2 {
  390. var flag = 0 // 标记 进来就是0
  391. //创建一个定时器
  392. let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (timer) in
  393. flag = flag + 1
  394. log.debug("当前计数: index -\(index) - flag-\(flag)")
  395. if flag == 5 {
  396. self.changeItem(index)
  397. timer.invalidate()
  398. }
  399. }
  400. timer.fire()
  401. categoryViewTimer = timer
  402. }
  403. }
  404. func changeItem(_ index:Int) {
  405. if self.isDemo == false {
  406. if index == 0 {
  407. self.uartCommandTimerContinue()
  408. }else if index == 1{
  409. if self.isHistoryTimerFire == false{
  410. self.historyCommandTimerStart()
  411. }else{
  412. self.historyCommandTimerContinue()
  413. }
  414. }else{
  415. uartCommandTimerPause()
  416. historyCommandTimerPause()
  417. }
  418. }
  419. NotificationCenter.default.post(name: NSNotification.Name(rawValue: kCheckCurrenVC), object: nil)
  420. }
  421. }
  422. extension SBTDeviceDetaiVCtr{
  423. //实时数据
  424. func realdata_000A(_ reciveData : String) {
  425. let str0 = reciveData
  426. log.debug("处理真实数据 - \(str0)")
  427. //系统支持的最高电压
  428. let num00 = UUUtils.numberHexString(str0.subString(start: 7 , length: 2))
  429. log.debug("额定充电电流: \(num00!)")
  430. realDataDict[key.MaxVolt] = "\(num00!)"
  431. deviceDetailData[key.MaxVolt] = "\(num00!)"
  432. let num0 = UUUtils.numberHexString(str0.subString(start: 7 + 2, length: 2))
  433. log.debug("额定充电电流: \(num0!)")
  434. // dataDict[key.IchageRage] = "\(num0!)"
  435. realDataDict[key.IchageRage] = "\(num0!)"
  436. deviceDetailData[key.IchageRage] = "\(num0!)"
  437. }
  438. func realdata_E003(_ reciveData : String) {
  439. let str0 = reciveData
  440. log.debug("处理真实数据 - \(str0)")
  441. //e003
  442. // FF
  443. let FF = str0.subString(start: 7 , length: 2)
  444. if FF == "FF"{
  445. // dataDict[key.autoRecognition] = "1"
  446. realDataDict[key.autoRecognition] = "1"
  447. deviceDetailData[key.autoRecognition] = "1"
  448. }else{
  449. // dataDict[key.autoRecognition] = "0"
  450. realDataDict[key.autoRecognition] = "0"
  451. deviceDetailData[key.autoRecognition] = "0"
  452. }
  453. // 判断是否自动识别
  454. let num0 = UUUtils.numberHexString(str0.subString(start: 7 + 2 , length: 2))
  455. log.debug("系统电压设置 - \(num0!)")
  456. deviceDetailData[key.BatRateVolt] = "\(num0!)"
  457. realDataDict[key.BatRateVolt] = "\(num0!)"
  458. }
  459. func realdata_E008(_ reciveData : String) {
  460. let str0 = reciveData
  461. log.debug("处理真实数据 - \(str0)")
  462. //e003
  463. //e008
  464. let num5 = UUUtils.numberHexString(str0.subString(start: 7 , length: 4))
  465. log.debug("提升充电电压/过充返回电压\(num5!.floatValue * 0.1)")
  466. deviceDetailData[key.BatImprovChgVolt] = "\(String(format: "%.1f", num5!.floatValue * 0.1))"
  467. realDataDict[key.BatImprovChgVolt] = "\(String(format: "%.1f", num5!.floatValue * 0.1))"
  468. }
  469. //读取名称
  470. func readdata_0049(_ reciveData : String){
  471. let str0 = reciveData
  472. log.debug("处理真实数据 - \(str0)")
  473. var productNameDict : [String:String] = [String:String]()
  474. if self.isOld == true {
  475. productNameDict[key.productName] = ""
  476. deviceDetailData[key.productName] = ""
  477. }else{
  478. var num5 = UUUtils.string(fromHexString: str0.subString(start: 7 , length: str0.count - 12))
  479. log.debug("要解析的十六进制 \( str0.subString(start: 7 , length: str0.count - 12))")
  480. num5 = num5?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白
  481. log.debug("设备名称 \(num5)")
  482. //f16d33 575578 e565b 065fd8 0906ed179
  483. if num5 == nil || num5 == "" {
  484. let ChineseString = UUUtils.deUnicodeString(fromHexString: str0.subString(start: 7 , length: str0.count - 12))
  485. // ff ff
  486. productNameDict[key.productName] = ChineseString
  487. deviceDetailData[key.productName] = ChineseString
  488. log.debug("设备中文名称 \(ChineseString!)")
  489. }else{
  490. productNameDict[key.productName] = num5
  491. deviceDetailData[key.productName] = num5
  492. }
  493. }
  494. }
  495. func real_000B000F(_ reciveData : String) {
  496. let str0 = reciveData
  497. log.debug("处理真实数据 - \(str0)")
  498. //1400
  499. //额定放电电流
  500. let num00 = UUUtils.numberHexString(str0.subString(start: 7, length: 2))
  501. log.debug("额定放电电流:\(num00!)")
  502. deviceDetailData[key.idischagRate] = "\(num00!)"
  503. //产品类型
  504. let num0 = UUUtils.numberHexString(str0.subString(start: 9, length: 2))
  505. log.debug("产品类型:\(num0)")
  506. var device_type = ""
  507. switch num0?.intValue {
  508. case 0:
  509. device_type = "Controller_household".da_localizedStr()
  510. case 1:
  511. device_type = "Controller_street_light".da_localizedStr()
  512. case 3:
  513. device_type = "Inverter".da_localizedStr()
  514. case 4:
  515. device_type = "All-in-one_inverter".da_localizedStr()
  516. default:
  517. break
  518. }
  519. deviceDetailData[key.device_type] = device_type
  520. var num1 = UUUtils.string(fromHexString: str0.subString(start: 11, length: 32))
  521. num1 = num1?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白
  522. log.debug("产品型号\(num1)")
  523. deviceDetailData[key.product_type] = num1!
  524. //软件版本
  525. // let num2 = UUUtils.numberHexString(str0.subString(start: 11 + 32, length: 8))
  526. let a = UUUtils.numberHexString(str0.subString(start: 11 + 32, length: 2))
  527. let b = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2, length: 2))
  528. let c = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2 + 2, length: 2))
  529. let d = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2 + 2 + 2, length: 2))
  530. log.debug("软件版本 : V \(b!).\(c!).\(d!)")
  531. deviceDetailData[key.softWareCersion] = "V\(b!).\(c!).\(d!)"
  532. //硬件版本
  533. let m1 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8, length: 2))
  534. let m2 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2, length: 2))
  535. let m3 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2 + 2, length: 2))
  536. let m4 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2 + 2 + 2, length: 2))
  537. log.debug("硬件版本 : V\(m2!).\(m3!).\(m4!)")
  538. // 序列号
  539. deviceDetailData[key.hardWareCersion] = "V \(m2!).\(m3!).\(m4!)"
  540. // let num4 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 , length: 8))
  541. let num41 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 , length: 2))
  542. let num42 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 2 , length: 2))
  543. let num43 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 4 , length: 4)) //补足5位
  544. log.debug("\( String(format: "%05d", num43!.intValue))") // 年月(低十六位)
  545. deviceDetailData[key.productSN] = "\(num41!)\(num42!)\( String(format: "%05d", num43!.intValue))"
  546. }
  547. func realdata_000B(_ reciveData : String) {
  548. let str0 = reciveData
  549. log.debug("处理真实数据 - \(str0)")
  550. //1400
  551. //额定放电电流
  552. let num00 = UUUtils.numberHexString(str0.subString(start: 7, length: 2))
  553. log.debug("额定放电电流:\(num00!)")
  554. deviceDetailData[key.idischagRate] = "\(num00!)"
  555. //产品类型
  556. let num0 = UUUtils.numberHexString(str0.subString(start: 9, length: 2))
  557. log.debug("产品类型:\(num0)")
  558. var device_type = ""
  559. switch num0?.intValue {
  560. case 0:
  561. device_type = "Controller_household".da_localizedStr()
  562. case 1:
  563. device_type = "Controller_street_light".da_localizedStr()
  564. case 3:
  565. device_type = "Inverter".da_localizedStr()
  566. case 4:
  567. device_type = "All-in-one_inverter".da_localizedStr()
  568. default:
  569. break
  570. }
  571. deviceDetailData[key.device_type] = device_type
  572. var num1 = UUUtils.string(fromHexString: str0.subString(start: 11, length: 32))
  573. num1 = num1?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白
  574. log.debug("产品型号\(num1)")
  575. deviceDetailData[key.product_type] = num1!
  576. //软件版本
  577. // let num2 = UUUtils.numberHexString(str0.subString(start: 11 + 32, length: 8))
  578. let a = UUUtils.numberHexString(str0.subString(start: 11 + 32, length: 2))
  579. let b = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2, length: 2))
  580. let c = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2 + 2, length: 2))
  581. let d = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2 + 2 + 2, length: 2))
  582. log.debug("软件版本 : V \(b!).\(c!).\(d!)")
  583. deviceDetailData[key.softWareCersion] = "V\(b!).\(c!).\(d!)"
  584. //硬件版本
  585. let m1 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8, length: 2))
  586. let m2 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2, length: 2))
  587. let m3 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2 + 2, length: 2))
  588. let m4 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2 + 2 + 2, length: 2))
  589. log.debug("硬件版本 : V\(m2!).\(m3!).\(m4!)")
  590. // 序列号
  591. deviceDetailData[key.hardWareCersion] = "V \(m2!).\(m3!).\(m4!)"
  592. // let num4 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 , length: 8))
  593. let num41 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 , length: 2))
  594. let num42 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 2 , length: 2))
  595. let num43 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 4 , length: 4)) //补足5位
  596. log.debug("\( String(format: "%05d", num43!.intValue))") // 年月(低十六位)
  597. deviceDetailData[key.productSN] = "\(num41!)\(num42!)\( String(format: "%05d", num43!.intValue))"
  598. // var num5 = UUUtils.string(fromHexString: str0.subString(start: 255 , length: 32)) // 最大32字节 12568哦哦哦泈色系儿子儿媳妇
  599. var num5 = UUUtils.string(fromHexString: str0.subString(start: 255 , length: 64))
  600. log.debug("要解析的十六进制 \( str0.subString(start: 255 , length: 64))")
  601. num5 = num5?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白
  602. log.debug("设备名称 \(num5)")
  603. //f16d33 575578 e565b 065fd8 0906ed179
  604. if num5 == nil || num5 == "" {
  605. let ChineseString = UUUtils.deUnicodeString(fromHexString: str0.subString(start: 255 , length: 64))
  606. // ff ff
  607. deviceDetailData[key.productName] = ChineseString
  608. log.debug("设备中文名称 \(ChineseString!)")
  609. }else{
  610. deviceDetailData[key.productName] = num5
  611. }
  612. let year = UUUtils.numberHexString(str0.subString(start: 75, length: 2))
  613. let mouth = UUUtils.numberHexString(str0.subString(start: 75 + 2, length: 2))
  614. let day = UUUtils.numberHexString(str0.subString(start: 75 + 2, length: 2))
  615. log.debug("生产日期 : \(year!)-\(mouth!)-\(day!)")
  616. }
  617. //温度处理
  618. func temp(with num:NSNumber)-> String{
  619. let numInt = num.intValue
  620. // let q1 = UUUtils.numberHexString(q)?.intValue
  621. let q2 = numInt & 128
  622. print("判断正负\(q2)")
  623. if q2 != 128 {
  624. log.debug("温度\(num.floatValue )")
  625. return "\(num.intValue )"
  626. }else{
  627. log.debug("温度: -\(numInt & 127 )")
  628. return "-\(numInt & 127 )"
  629. }
  630. }
  631. //1s刷新一次
  632. //实时数据
  633. func realdata_00FD(_ reciveData : String) {
  634. let str0 = reciveData
  635. log.debug("处理真实数据 - \(str0)")
  636. var num0A = UUUtils.getBinaryByHex(str0.subString(start: 11 , length: 8))
  637. let num0A_1 = num0A?.subString(start: 0, length: 16)
  638. let num0A_2 = num0A?.subString(start: 16, length: 16)
  639. let num0A_II = num0A_2! + num0A_1!
  640. num0A = num0A_II
  641. log.debug("太阳能板状态\(num0A!)")
  642. /*
  643. 00001101 00011100 00000000 00000000
  644. 30 ----
  645. 19 20 21 22 23 24 25 26 27 28 29 30 31
  646. */
  647. var solarStatusStr = ""
  648. let B30 = num0A?.subString(start: 1, length: 1)
  649. let B29 = num0A?.subString(start: 2, length: 1)
  650. let B28 = num0A?.subString(start: 3, length: 1)
  651. let B27 = num0A?.subString(start: 4, length: 1)
  652. let B26 = num0A?.subString(start: 5, length: 1)
  653. let B25 = num0A?.subString(start: 6, length: 1)
  654. let B24 = num0A?.subString(start: 7, length: 1)
  655. let B23 = num0A?.subString(start: 8, length: 1)
  656. //负载
  657. let B20 = num0A?.subString(start: 11, length: 1)
  658. let B19 = num0A?.subString(start: 12, length: 1)
  659. let B15 = num0A?.subString(start: 16, length: 1)
  660. //系统
  661. let B21 = num0A?.subString(start: 10, length: 1)
  662. let B14 = num0A?.subString(start: 17, length: 1)
  663. let B13 = num0A?.subString(start: 18, length: 1)
  664. //蓄电池状态
  665. let B22 = num0A?.subString(start: 9, length: 1)
  666. let B18 = num0A?.subString(start: 13, length: 1)
  667. let B17 = num0A?.subString(start: 14, length: 1)
  668. let B16 = num0A?.subString(start: 15, length: 1)
  669. let B12 = num0A?.subString(start: 19, length: 1)
  670. let B11 = num0A?.subString(start: 20, length: 1)
  671. let B10 = num0A?.subString(start: 21, length: 1)
  672. var batteryStatusStr = ""
  673. if B10 == "1" {
  674. batteryStatusStr = "BMS_overcharge_protection".da_localizedStr()
  675. }
  676. if B11 == "1" {
  677. batteryStatusStr = "Battery_low_temperature_protection,_stop_charging".da_localizedStr()
  678. }
  679. if B12 == "1" {
  680. batteryStatusStr = "Battery_reverse_polarity".da_localizedStr()
  681. }
  682. if B16 == "1" {
  683. batteryStatusStr = "Battery_over_discharge".da_localizedStr()
  684. }
  685. if B17 == "1" {
  686. batteryStatusStr = "Battery_overvoltage".da_localizedStr()
  687. }
  688. if B18 == "1" {
  689. batteryStatusStr = "Undervoltage_warning".da_localizedStr()
  690. }
  691. if B22 == "1" {
  692. batteryStatusStr = "External_ambient_temperature_is_too_high".da_localizedStr()
  693. }
  694. if B10 == "0" && B11 == "0" && B12 == "0" && B16 == "0" && B17 == "0" && B18 == "0" && B22 == "0"{
  695. batteryStatusStr = "Normal".da_localizedStr()
  696. }
  697. deviceDetailData[key.batteryStatus] = batteryStatusStr
  698. realDataDict[key.batteryStatus] = batteryStatusStr
  699. //太阳能状态
  700. if B23 == "1" {
  701. solarStatusStr = "PV_input_power_is_too_large".da_localizedStr()
  702. }
  703. if B24 == "1" {
  704. solarStatusStr = "Short_circuit_of_photovoltaic_input".da_localizedStr()
  705. }
  706. if B25 == "1" {
  707. solarStatusStr = "Overvoltage_at_the_photovoltaic_input".da_localizedStr()
  708. }
  709. if B26 == "1" {
  710. solarStatusStr = "Solar_panel_countercurrent".da_localizedStr()
  711. }
  712. if B27 == "1" {
  713. solarStatusStr = "Solar_panel_working_point_overpressure".da_localizedStr()
  714. }
  715. if B28 == "1" {
  716. solarStatusStr = "Solar_panel_reverse_connection".da_localizedStr()
  717. }
  718. deviceDetailData[key.solarStatus] = solarStatusStr
  719. realDataDict[key.solarStatus] = solarStatusStr
  720. let num0 = UUUtils.getBinaryByHex(str0.subString(start: 7, length: 4))
  721. log.debug("00FD \(num0!)")
  722. let low_8_bit = UUUtils.numberHexString(str0.subString(start: 9, length: 2))
  723. log.debug("low_8_bit - \(low_8_bit)")
  724. //1000000000000000
  725. var changeStatus = ""
  726. if low_8_bit == 0 {
  727. changeStatus = "Charging_is_not_turned_on".da_localizedStr()
  728. }else if low_8_bit == 1 {
  729. changeStatus = "Start_charging_mode".da_localizedStr()
  730. }else if low_8_bit == 2 {
  731. changeStatus = "MPPT_charge_mode".da_localizedStr()
  732. }else if low_8_bit == 3 {
  733. changeStatus = "Equalizing_charge_mode".da_localizedStr()
  734. }else if low_8_bit == 4 {
  735. changeStatus = "Floating_charge_mode".da_localizedStr()
  736. }else if low_8_bit == 5 {
  737. changeStatus = "Boost_charge_mode".da_localizedStr()
  738. }else if low_8_bit == 6 {
  739. changeStatus = "Current_limiting_(super_power)".da_localizedStr()
  740. }else if low_8_bit == 7 {
  741. changeStatus = "Fully_charged".da_localizedStr()
  742. }
  743. // if B23 == "0" && B24 == "0" && B25 == "0" && B26 == "0" && B27 == "0" && B28 == "0" {
  744. // dataDict[key.solarStatus] = batteryStatusStr
  745. // realDataDict[key.solarStatus] = batteryStatusStr
  746. // }
  747. // realDataDict[key.solarStatus] = solarStatusStr
  748. if B23 == "0" && B24 == "0" && B25 == "0" && B26 == "0" && B27 == "0" && B28 == "0" {
  749. dataDict[key.solarStatus] = changeStatus
  750. realDataDict[key.solarStatus] = changeStatus
  751. }
  752. //0000 0000 0000 0000 从后往前数
  753. let loadStatus = "\(num0?.subString(start: 0, length: 1) ?? "")"
  754. var loadStatusStr = ""
  755. if B15 == "1" {
  756. loadStatusStr = "Open_load".da_localizedStr()
  757. }
  758. if B19 == "1" {
  759. loadStatusStr = "Load_short_circuit".da_localizedStr()
  760. }
  761. if B20 == "1" {
  762. loadStatusStr = "Excessive_load_power_or_overload".da_localizedStr()
  763. }
  764. if B15 == "0" && B19 == "0" && B20 == "0" {
  765. if loadStatus == "0" {
  766. loadStatusStr = "Load_is_off".da_localizedStr()
  767. }else if loadStatus == "1" {
  768. loadStatusStr = "Load_is_on".da_localizedStr()
  769. }
  770. }
  771. log.debug("负载状态 :\(num0?.subString(start: 7, length: 1))") // 低八位
  772. deviceDetailData[key.loadStatus] = loadStatusStr
  773. realDataDict[key.loadStatus] = loadStatusStr
  774. //太阳能电压 0107
  775. let num1 = UUUtils.numberHexString(str0.subString(start: 47, length: 4))
  776. print("太阳能电压 \(num1!.floatValue * 0.1)" )
  777. let solarV = String(format: "%.1f", num1!.floatValue * 0.1)
  778. deviceDetailData[key.solarVoltage] = "\(solarV)"
  779. realDataDict[key.solarVoltage] = "\(solarV)"
  780. // 太阳能电流 0108
  781. let num2 = UUUtils.numberHexString(str0.subString(start: 47 + 4, length: 4))
  782. print("太阳能电流 \(num2!.floatValue * 0.01)")
  783. deviceDetailData[key.solarCurrent] = String(format: "%.2f", num2!.floatValue * 0.01)
  784. realDataDict[key.solarCurrent] = String(format: "%.2f", num2!.floatValue * 0.01)
  785. // 太阳能功率 0109
  786. let num2_1 = UUUtils.numberHexString(str0.subString(start: 47 + 4 + 4, length: 4))
  787. print("太阳能功率 \(num2_1!)")
  788. deviceDetailData[key.solarPower] = "\(num2_1!)"
  789. realDataDict[key.solarPower] = "\(num2_1!)"
  790. //蓄电池 电压
  791. let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4))
  792. print("蓄电池电压 \(num3!.floatValue * 0.1)")
  793. deviceDetailData[key.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1)
  794. realDataDict[key.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1)
  795. let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5, length: 4))
  796. print("蓄电池电流\(num4!.floatValue * 0.01)")
  797. deviceDetailData[key.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01)
  798. realDataDict[key.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01)
  799. let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6 + 2 , length: 2))
  800. print("温度 \(temp(with: num5!))")
  801. deviceDetailData[key.batteryTemp] = "\(temp(with: num5!))"
  802. realDataDict[key.batteryTemp] = "\(temp(with: num5!))"
  803. //负载
  804. let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7, length: 4))
  805. print("负载电压\(num6!.floatValue * 0.1)")
  806. deviceDetailData[key.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1)
  807. realDataDict[key.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1)
  808. let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4))
  809. print("负载电流\(num7!.floatValue * 0.01)")
  810. deviceDetailData[key.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01)
  811. realDataDict[key.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01)
  812. let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 9, length: 4))
  813. print("功率 \(num8! )")
  814. realDataDict[key.loadPower] = "\(num8!)"
  815. deviceDetailData[key.loadPower] = "\(num8!)"
  816. }
  817. //FF030115000B
  818. //ff031400000000000000000000000000 0000 0000 0000 0064 0b《》
  819. //13 * 4
  820. //处理历史数据
  821. func hisData(_ reciveData:String) {
  822. let str0 = reciveData
  823. log.debug("处理真实数据 - \(str0)")
  824. if str0.count != 13 * 4 {
  825. return
  826. }
  827. var F000Dict = [String: String]()
  828. //蓄电池当天最低电压
  829. let num0 = UUUtils.numberHexString(str0.subString(start: 7, length: 4))
  830. log.debug("蓄电池当天最低电压: \( String(format: "%.1f", num0!.floatValue * 0.1))")
  831. F000Dict[key.his_batteryVoltageMin] = String(format: "%.1f", num0!.floatValue * 0.1)
  832. //蓄电池当天最高电压
  833. let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4, length: 4))
  834. log.debug("蓄电池当天最高电压\(String(format: "%.1f", num1!.floatValue * 0.1))")
  835. F000Dict[key.his_batteryVoltageMax] = String(format: "%.1f", num1!.floatValue * 0.1)
  836. let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 2, length: 4))
  837. log.debug("当天充电最大电流\(String(format: "%.2f", num2!.floatValue * 0.01))")
  838. F000Dict[key.his_chargingCurrentMax] = String(format: "%.2f", num2!.floatValue * 0.01)
  839. let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 3, length: 4))
  840. log.debug("当天放电最大电流\(String(format: "%.2f", num3!.floatValue * 0.01))")
  841. F000Dict[key.his_dischargeCurrentmax] = String(format: "%.2f", num3!.floatValue * 0.01)
  842. let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4))
  843. log.debug("当天充电最大功率\(num4!)" )
  844. F000Dict[key.his_chargingPowerMax] = "\(num4!)"
  845. let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5 , length: 4))
  846. log.debug("当天放电最大功率\(num5!)")
  847. F000Dict[key.his_dischargePowerMax] = "\(num5!)"
  848. let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6, length: 4))
  849. log.debug("充电安时数 \(num6!)")
  850. F000Dict[key.his_chargingAmpereHour] = "\(num6!)"
  851. let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7 , length: 4))
  852. log.debug("放电安时数 \(num7!)")
  853. F000Dict[key.his_dischargeAmpereHour] = "\(num7!)"
  854. let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4))
  855. log.debug("当天发电量 \(num8!)")
  856. F000Dict[key.his_generationCapacity] = "\(num8!)"
  857. let num9 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 9, length: 4))
  858. log.debug("充电量 \(num9!)")
  859. F000Dict[key.his_dischargeCapacity] = "\(num9!)"
  860. historyDataArr.append(F000Dict)
  861. }
  862. func realdata_F000(_ reciveData : String) {
  863. hisData(reciveData)
  864. }
  865. func realdata_F001(_ reciveData : String) {
  866. hisData(reciveData)
  867. }
  868. func realdata_F002(_ reciveData : String) {
  869. hisData(reciveData)
  870. }
  871. func realdata_F003(_ reciveData : String) {
  872. hisData(reciveData)
  873. }
  874. func realdata_F004(_ reciveData : String) {
  875. hisData(reciveData)
  876. }
  877. func realdata_F005(_ reciveData : String) {
  878. hisData(reciveData)
  879. }
  880. func realdata_F006(_ reciveData : String) {
  881. hisData(reciveData)
  882. }
  883. func realdata_F007(_ reciveData : String) {
  884. hisData(reciveData)
  885. deviceDetailData[key.historydatas] = historyDataArr
  886. cumulativeDict[key.historydatas] = historyDataArr
  887. }
  888. func realdata_0115(_ reciveData :String) {
  889. let str0 = reciveData
  890. log.debug("处理真实数据 - \(str0)")
  891. //
  892. let num0 = UUUtils.numberHexString(str0.subString(start: 7 , length: 4))
  893. log.debug("总运行天数 - \(num0!)")
  894. cumulativeDict[key.runTime] = ("\(num0!)")
  895. deviceDetailData[key.runTime] = ("\(num0!)")
  896. let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4 , length: 4))
  897. log.debug("蓄电池总过放次数 - \(num1!)")
  898. cumulativeDict[key.overTimes] = "\(num1!)"
  899. deviceDetailData[key.overTimes] = "\(num1!)"
  900. let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 8 , length: 4))
  901. log.debug("蓄电池总充满次数 - \(num2!)")
  902. cumulativeDict[key.fullTimes] = "\(num2!)"
  903. deviceDetailData[key.fullTimes] = "\(num2!)"
  904. let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 12 , length: 8))
  905. log.debug("蓄电池总充电安时数 - \(num3!)")
  906. cumulativeDict[key.chargingAmpereHour] = "\(num3!)"
  907. deviceDetailData[key.chargingAmpereHour] = "\(num3!)"
  908. let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 , length: 8))
  909. log.debug("蓄电池总放电安时数 - \(num4!)")
  910. cumulativeDict[key.dischargeAmpereHour] = "\(num4!)"
  911. deviceDetailData[key.dischargeAmpereHour] = "\(num4!)"
  912. let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 * 2 , length: 8))
  913. // let num5 = UUUtils.numberHexString("ffffffff")
  914. log.debug("累计发电量 - \(num5!)")
  915. cumulativeDict[key.generatEnergyTotal] = "\(num5!)"
  916. let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 * 3, length: 8))
  917. log.debug("累计用电量 - \(num6!)")
  918. cumulativeDict[key.usedEnergyTotal] = "\(num6!)"
  919. deviceDetailData[key.usedEnergyTotal] = "\(num6!)"
  920. NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifisionDeviceDatailDataHistoryDataRecieve), object: nil, userInfo: cumulativeDict)
  921. }
  922. func realdata_DF0D(_ reciveData : String) {
  923. let str0 = reciveData
  924. log.debug("处理真实数据 - \(str0)")
  925. // <ff030200 009190>
  926. let num0 = UUUtils.numberHexString(str0.subString(start: 7, length: 4))
  927. log.debug("手动均衡 —— \(num0)")
  928. var canhandle = ""
  929. if num0?.intValue == 0 {
  930. canhandle = "Prohibited".da_localizedStr()
  931. }else if num0?.intValue == 1{
  932. canhandle = "Enable".da_localizedStr()
  933. }
  934. deviceDetailData[key.BattEqualChgImmediate] = canhandle
  935. paramDataDict[key.BattEqualChgImmediate] = canhandle
  936. log.debug(" kNotifisionDeviceDatailDataBaseInfoRecieve \(deviceDetailData)")
  937. NotificationCenter.default.post(name: NSNotification.Name(kNotifisionDeviceDatailDataBaseInfoRecieve), object: nil, userInfo: deviceDetailData)
  938. }
  939. func realdata_0100(_ reciveData : String) {
  940. let str0 = reciveData
  941. log.debug("处理真实数据 - \(str0)")
  942. //太阳能电压 0107
  943. let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7, length: 4))
  944. print("太阳能电压 \(num1!.floatValue * 0.1)" )
  945. let solarV = String(format: "%.1f", num1!.floatValue * 0.1)
  946. deviceDetailData[key.solarVoltage] = "\(solarV)"
  947. realDataDict[key.solarVoltage] = "\(solarV)"
  948. // 太阳能电流 0108
  949. let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4))
  950. print("太阳能电流 \(num2!.floatValue * 0.01)")
  951. deviceDetailData[key.solarCurrent] = String(format: "%.2f", num2!.floatValue * 0.01)
  952. realDataDict[key.solarCurrent] = String(format: "%.2f", num2!.floatValue * 0.01)
  953. // 太阳能功率 0109
  954. let num2_1 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 9, length: 4))
  955. print("太阳能功率 \(num2_1!)")
  956. deviceDetailData[key.solarPower] = "\(num2_1!)"
  957. realDataDict[key.solarPower] = "\(num2_1!)"
  958. //蓄电池 电压 101
  959. let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 1, length: 4))
  960. print("蓄电池电压 \(num3!.floatValue * 0.1)")
  961. deviceDetailData[key.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1)
  962. realDataDict[key.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1)
  963. //蓄电池电流 102
  964. let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 2, length: 4))
  965. print("蓄电池电流\(num4!.floatValue * 0.01)")
  966. deviceDetailData[key.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01)
  967. realDataDict[key.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01)
  968. //蓄电池温度 0103
  969. let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 3 , length: 2))
  970. print("温度 \(temp(with: num5!))")
  971. deviceDetailData[key.batteryTemp] = "\(temp(with: num5!))"
  972. realDataDict[key.batteryTemp] = "\(temp(with: num5!))"
  973. //负载电压 0104
  974. let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4))
  975. print("负载电压\(num6!.floatValue * 0.1)")
  976. deviceDetailData[key.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1)
  977. realDataDict[key.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1)
  978. //负载电流 0105
  979. let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5, length: 4))
  980. print("负载电流\(num7!.floatValue * 0.01)")
  981. deviceDetailData[key.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01)
  982. realDataDict[key.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01)
  983. //负载功率 0106
  984. let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6, length: 4))
  985. print("功率 \(num8! )")
  986. realDataDict[key.loadPower] = "\(num8!)"
  987. deviceDetailData[key.loadPower] = "\(num8!)"
  988. }
  989. func realdata_0120(_ reciveData : String) {
  990. let str0 = reciveData
  991. log.debug("处理真实数据 - \(str0)")
  992. var num0A = UUUtils.getBinaryByHex(str0.subString(start: 11 , length: 8))
  993. let num0A_1 = num0A?.subString(start: 0, length: 16)
  994. let num0A_2 = num0A?.subString(start: 16, length: 16)
  995. let num0A_II = num0A_2! + num0A_1!
  996. num0A = num0A_II
  997. log.debug("太阳能板状态\(num0A!)")
  998. var solarStatusStr = ""
  999. let B30 = num0A?.subString(start: 1, length: 1)
  1000. let B29 = num0A?.subString(start: 2, length: 1)
  1001. let B28 = num0A?.subString(start: 3, length: 1)
  1002. let B27 = num0A?.subString(start: 4, length: 1)
  1003. let B26 = num0A?.subString(start: 5, length: 1)
  1004. let B25 = num0A?.subString(start: 6, length: 1)
  1005. let B24 = num0A?.subString(start: 7, length: 1)
  1006. let B23 = num0A?.subString(start: 8, length: 1)
  1007. //负载
  1008. let B20 = num0A?.subString(start: 11, length: 1)
  1009. let B19 = num0A?.subString(start: 12, length: 1)
  1010. let B15 = num0A?.subString(start: 16, length: 1)
  1011. //系统
  1012. let B21 = num0A?.subString(start: 10, length: 1)
  1013. let B14 = num0A?.subString(start: 17, length: 1)
  1014. let B13 = num0A?.subString(start: 18, length: 1)
  1015. //蓄电池状态
  1016. let B22 = num0A?.subString(start: 9, length: 1)
  1017. let B18 = num0A?.subString(start: 13, length: 1)
  1018. let B17 = num0A?.subString(start: 14, length: 1)
  1019. let B16 = num0A?.subString(start: 15, length: 1)
  1020. let B12 = num0A?.subString(start: 19, length: 1)
  1021. let B11 = num0A?.subString(start: 20, length: 1)
  1022. let B10 = num0A?.subString(start: 21, length: 1)
  1023. var batteryStatusStr = ""
  1024. if B10 == "1" {
  1025. batteryStatusStr = "BMS_overcharge_protection".da_localizedStr()
  1026. }
  1027. if B11 == "1" {
  1028. batteryStatusStr = "Battery_low_temperature_protection,_stop_charging".da_localizedStr()
  1029. }
  1030. if B12 == "1" {
  1031. batteryStatusStr = "Battery_reverse_polarity".da_localizedStr()
  1032. }
  1033. if B16 == "1" {
  1034. batteryStatusStr = "Battery_over_discharge".da_localizedStr()
  1035. }
  1036. if B17 == "1" {
  1037. batteryStatusStr = "Battery_overvoltage".da_localizedStr()
  1038. }
  1039. if B18 == "1" {
  1040. batteryStatusStr = "Undervoltage_warning".da_localizedStr()
  1041. }
  1042. if B22 == "1" {
  1043. batteryStatusStr = "External_ambient_temperature_is_too_high".da_localizedStr()
  1044. }
  1045. if B10 == "0" && B11 == "0" && B12 == "0" && B16 == "0" && B17 == "0" && B18 == "0" && B22 == "0"{
  1046. batteryStatusStr = "Normal".da_localizedStr()
  1047. }
  1048. deviceDetailData[key.batteryStatus] = batteryStatusStr
  1049. realDataDict[key.batteryStatus] = batteryStatusStr
  1050. //太阳能状态
  1051. if B23 == "1" {
  1052. solarStatusStr = "PV_input_power_is_too_large".da_localizedStr()
  1053. }
  1054. if B24 == "1" {
  1055. solarStatusStr = "Short_circuit_of_photovoltaic_input".da_localizedStr()
  1056. }
  1057. if B25 == "1" {
  1058. solarStatusStr = "Overvoltage_at_the_photovoltaic_input".da_localizedStr()
  1059. }
  1060. if B26 == "1" {
  1061. solarStatusStr = "Solar_panel_countercurrent".da_localizedStr()
  1062. }
  1063. if B27 == "1" {
  1064. solarStatusStr = "Solar_panel_working_point_overpressure".da_localizedStr()
  1065. }
  1066. if B28 == "1" {
  1067. solarStatusStr = "Solar_panel_reverse_connection".da_localizedStr()
  1068. }
  1069. deviceDetailData[key.solarStatus] = solarStatusStr
  1070. realDataDict[key.solarStatus] = solarStatusStr
  1071. // if B23 == "0" && B24 == "0" && B25 == "0" && B26 == "0" && B27 == "0" && B28 == "0" {
  1072. // dataDict[key.solarStatus] = batteryStatusStr
  1073. // realDataDict[key.solarStatus] = batteryStatusStr
  1074. // }
  1075. //0120
  1076. let num0 = UUUtils.getBinaryByHex(str0.subString(start: 7, length: 4))
  1077. log.debug("00FD \(num0!)")
  1078. let low_8_bit = UUUtils.numberHexString(str0.subString(start: 9, length: 2))
  1079. log.debug("low_8_bit - \(low_8_bit)")
  1080. //1000000000000000
  1081. var changeStatus = ""
  1082. if low_8_bit == 0 {
  1083. changeStatus = "Charging_is_not_turned_on".da_localizedStr()
  1084. }else if low_8_bit == 1 {
  1085. changeStatus = "Start_charging_mode".da_localizedStr()
  1086. }else if low_8_bit == 2 {
  1087. changeStatus = "MPPT_charge_mode".da_localizedStr()
  1088. }else if low_8_bit == 3 {
  1089. changeStatus = "Equalizing_charge_mode".da_localizedStr()
  1090. }else if low_8_bit == 4 {
  1091. changeStatus = "Floating_charge_mode".da_localizedStr()
  1092. }else if low_8_bit == 5 {
  1093. changeStatus = "Boost_charge_mode".da_localizedStr()
  1094. }else if low_8_bit == 6 {
  1095. changeStatus = "Current_limiting_(super_power)".da_localizedStr()
  1096. }else if low_8_bit == 7 {
  1097. changeStatus = "Fully_charged".da_localizedStr()
  1098. }
  1099. // realDataDict[key.solarStatus] = solarStatusStr
  1100. if B23 == "0" && B24 == "0" && B25 == "0" && B26 == "0" && B27 == "0" && B28 == "0" {
  1101. dataDict[key.solarStatus] = changeStatus
  1102. realDataDict[key.solarStatus] = changeStatus
  1103. }
  1104. //0000 0000 0000 0000 从后往前数
  1105. let loadStatus = "\(num0?.subString(start: 0, length: 1) ?? "")"
  1106. var loadStatusStr = ""
  1107. if B15 == "1" {
  1108. loadStatusStr = "Open_load".da_localizedStr()
  1109. }
  1110. if B19 == "1" {
  1111. loadStatusStr = "Load_short_circuit".da_localizedStr()
  1112. }
  1113. if B20 == "1" {
  1114. loadStatusStr = "Excessive_load_power_or_overload".da_localizedStr()
  1115. }
  1116. if B15 == "0" && B19 == "0" && B20 == "0" {
  1117. if loadStatus == "0" {
  1118. loadStatusStr = "Load_is_off".da_localizedStr()
  1119. }else if loadStatus == "1" {
  1120. loadStatusStr = "Load_is_on".da_localizedStr()
  1121. }
  1122. }
  1123. log.debug("负载状态 :\(num0?.subString(start: 7, length: 1))") // 低八位
  1124. deviceDetailData[key.loadStatus] = loadStatusStr
  1125. realDataDict[key.loadStatus] = loadStatusStr
  1126. }
  1127. }
  1128. ///定时器事件
  1129. extension SBTDeviceDetaiVCtr{
  1130. //定时器开启
  1131. @objc func uartCommandTimerStart() {
  1132. if isDemo == false {
  1133. self.uartCommandTimer!.fire()
  1134. }
  1135. }
  1136. //暂停计时器(只是暂停,并没有销毁timer)
  1137. @objc func uartCommandTimerPause() {
  1138. if isDemo == false {
  1139. self.uartCommandTimer?.fireDate = Date.distantFuture
  1140. }
  1141. }
  1142. @objc func uartCommandTimerPauseCheckEnd(_ complete: @escaping ()->Void) {
  1143. if isDemo == false {
  1144. self.checkUartCommandTimerEnd = complete
  1145. self.uartCommandTimer?.fireDate = Date.distantFuture
  1146. }
  1147. }
  1148. func switchCmdPause() {
  1149. self.uartCommandTimerPauseCheckEnd {
  1150. }
  1151. }
  1152. //继续计时
  1153. @objc func uartCommandTimerContinue() {
  1154. if isDemo == false {
  1155. self.uartCommandTimer?.fireDate = Date.distantPast
  1156. }
  1157. }
  1158. //定时器回调
  1159. @objc func uartCommandTimerCallback() {
  1160. sendRealStatusCMD()
  1161. }
  1162. func sendRealStatusCMD() {//0.850956+0800 0.513711+0800
  1163. self.isUartCommandTimerEnd = false
  1164. if self.isOld == true {
  1165. let arr = ["FF03000A0001","FF03E0030001","FF03E0080001","FF030100000A","FF0301200003"]
  1166. BabyBluetoothSwift.shareInstance()?.loopWriteDataWite(arr, type: "RealStatus", completionHandler: { (result) in
  1167. log.debug("返回数据 --- \(ReceiveData)")
  1168. self.realdata_000A(result!["FF03000A0001"] as! String)
  1169. self.realdata_E003(result!["FF03E0030001"] as! String)
  1170. self.realdata_E008(result!["FF03E0080001"] as!String)
  1171. self.realdata_0100(result!["FF030100000A"] as! String)
  1172. self.realdata_0120(result!["FF0301200003"] as! String)
  1173. NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifisionDeviceDatailDataRealDataRecieve), object: nil, userInfo: self.realDataDict)
  1174. self.isUartCommandTimerEnd = true
  1175. if self.checkUartCommandTimerEnd != nil{
  1176. self.checkUartCommandTimerEnd!()
  1177. }
  1178. })
  1179. }else{
  1180. let arr = ["FF03000A0001","FF03E0030001","FF03E0080001","FF0300FD000D"]
  1181. BabyBluetoothSwift.shareInstance()?.loopWriteDataWite(arr,type: "RealStatus", completionHandler: { (result) in
  1182. log.debug("返回数据 --- \(result)")
  1183. self.realdata_000A(result!["FF03000A0001"] as! String)
  1184. self.realdata_00FD(result!["FF0300FD000D"] as! String)
  1185. self.realdata_E003(result!["FF03E0030001"] as! String)
  1186. self.realdata_E008(result!["FF03E0080001"] as!String)
  1187. NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifisionDeviceDatailDataRealDataRecieve), object: nil, userInfo: self.realDataDict)
  1188. self.isUartCommandTimerEnd = true
  1189. if self.checkUartCommandTimerEnd != nil{
  1190. self.checkUartCommandTimerEnd!()
  1191. }
  1192. })
  1193. }
  1194. }
  1195. //定时器关闭
  1196. @objc func uartCommandTimerStop() {
  1197. uartCommandTimer?.invalidate()
  1198. uartCommandTimer = nil
  1199. }
  1200. /*********************************/
  1201. @objc func historyCommandTimerStart() {
  1202. if isDemo == false {
  1203. self.historyCommandTimer?.fire()
  1204. self.isHistoryTimerFire = true
  1205. }
  1206. }
  1207. //暂停计时器(只是暂停,并没有销毁timer)
  1208. @objc func historyCommandTimerPause() {
  1209. if isDemo == false {
  1210. self.historyCommandTimer?.fireDate = Date.distantFuture
  1211. }
  1212. }
  1213. //暂停计时器(只是暂停,并没有销毁timer)
  1214. @objc func historyCommandTimerPauseCheckEnd(_ complete : @escaping ()->Void) {
  1215. if isDemo == false {
  1216. self.checkHistoryCommandTimerEnd = complete
  1217. self.historyCommandTimer?.fireDate = Date.distantFuture
  1218. }
  1219. }
  1220. //继续计时
  1221. @objc func historyCommandTimerContinue() {
  1222. if isDemo == false {
  1223. self.historyCommandTimer?.fireDate = Date.distantPast
  1224. }
  1225. }
  1226. //定时器回调
  1227. @objc func historyCommandTimerCallback() {
  1228. sendHistoryCmd()
  1229. }
  1230. @objc func sendHistoryCmd() {
  1231. let arr = ["FF03F000000A","FF03F001000A","FF03F002000A","FF03F003000A","FF03F004000A","FF03F005000A","FF03F006000A","FF03F007000A","FF030115000B"]
  1232. isHistoryCommandTimerEnd = false
  1233. BabyBluetoothSwift.shareInstance()?.loopWriteDataWite(arr, type: "History", completionHandler: { (result) in
  1234. self.isHistoryCommandTimerEnd = true
  1235. self.historyDataArr.removeAll()
  1236. self.realdata_F000(result!["FF03F000000A"] as! String)
  1237. self.realdata_F001(result!["FF03F001000A"] as! String)
  1238. self.realdata_F002(result!["FF03F002000A"] as! String)
  1239. self.realdata_F003(result!["FF03F003000A"] as! String)
  1240. self.realdata_F004(result!["FF03F004000A"] as! String)
  1241. self.realdata_F005(result!["FF03F005000A"] as! String)
  1242. self.realdata_F006(result!["FF03F006000A"] as! String)
  1243. self.realdata_F007(result!["FF03F007000A"] as! String)
  1244. self.realdata_0115(result!["FF030115000B"] as! String)
  1245. if self.checkHistoryCommandTimerEnd != nil{
  1246. self.checkHistoryCommandTimerEnd!()
  1247. }
  1248. })
  1249. }
  1250. //定时器关闭
  1251. @objc func historyCommandTimerStop() {
  1252. historyCommandTimer?.invalidate()
  1253. historyCommandTimer = nil
  1254. }
  1255. }
  1256. //2019-11-04 16:59:17
  1257. //16:59:19