12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469 |
- //
- // SBTDeviceDetaiVCtr.swift
- // SolarBT
- //
- // Created by weclouds on 2019/1/28.
- // Copyright © 2019 weclouds. All rights reserved.
- //
- /*
-
- 进入设备信息页面
- 检测 本地是否保存有该设备的数据
- 否 || 是
- 读取一遍所有数据 || 从本地获取
- 保存到本地 ||
- (在这个页面结束的时候保存就好了)
- 循环刷新数据
- 实时数据 统计数据
- */
- import UIKit
- import JXCategoryView
- import PKHUD
- class SBTDeviceDetaiVCtr: BaseViewController {
- var checkUartCommandTimerEnd :(()->Void)?
- var checkHistoryCommandTimerEnd :(()->Void)?
- var isUartCommandTimerEnd : Bool? = false
- var isHistoryCommandTimerEnd : Bool? = false
- var peripheralName :String?
- var isOld :Bool?
- var categoryViewTimer : Timer?
- lazy var historyCommandTimer: Timer? = { // 定时器 历史数据定时器
- let historyCommandTimer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(historyCommandTimerCallback), userInfo: nil, repeats: true)
- return historyCommandTimer
- }()
- lazy var uartCommandTimer: Timer? = { // 定时器 实时数据定时器
- let uartCommandTimer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(uartCommandTimerCallback), userInfo: nil, repeats: true)
- return uartCommandTimer
- }()
- var solarPower : CGFloat?
- var solarPowerValue :String?
- var isManual:Bool? = false // 是否手动模式
- var isRealTime = false // 是否是实时数据
- var cumulativeDict : [String: Any] = [String: Any]()
- var deviceDetailData: [String: Any] = [String: Any]()
- var dataDict : [String: Any] = [String: Any]()
- var paramDataDict : [String: Any] = [String: Any]()
- var realDataDict : [String:Any] = [String:Any]()
- var cumulativeDataDict : [String :Any] = [String: Any]() /// 累计数据
- let key: DeviceDictKey = DeviceDictKey()
- var historyDataArr: [[String: String]] = [[String: String]]()
- var currentIndex : Int? = 0
- var isDemo:Bool? = false
- var isHistoryTimerFire :Bool? = false // 是否开启历史数据定时器
- var isSetAction : Bool? = false // 是否点击了设置
- var plist_node:String? // plist的子节点
- var deviceName:String? // 设备名称
-
- let titles = ["Real-time_status".da_localizedStr(),"Historical_data".da_localizedStr(),"Basic_information".da_localizedStr()]
- lazy var device = DeviceData()
- lazy var categoryView: JXCategoryTitleImageView = {
- let imageNames = ["no","no","no"]
- let selectedImageNames = ["标签箭头","标签箭头","标签箭头"]
- let categoryView = JXCategoryTitleImageView()
- categoryView.titles = titles
- categoryView.imageNames = imageNames
- categoryView.selectedImageNames = selectedImageNames
- categoryView.isImageZoomEnabled = true
- categoryView.imageZoomScale = 1.1// 图片放大
- categoryView.isAverageCellSpacingEnabled = true
-
- return categoryView
- }()
-
-
- let scrollView = UIScrollView()
-
- let shouldHandleScreenEdgeGesture : Bool = true
-
- }
- //MARK:lifeCycle
- extension SBTDeviceDetaiVCtr{
-
- override func viewDidLoad() {
- super.viewDidLoad()
-
-
- checkTheBlueToothWasActivity()
-
- if self.isDemo == false {
- self.sbtTitle = "Device_details".da_localizedStr()
- }else{
- self.sbtTitle = "Device_details".da_localizedStr() + "(" + "demo_data".da_localizedStr() + ")"
- }
- createUI()
- if self.isDemo == false {
- // HUD.flash(.progress, delay: 2)
- // readDeviceName()
- if self.isOld == false{
- delay(0.5) {
- BabyBluetoothSwift.shareInstance()?.writeData2222(["FF0300490020"], completionHandler: { (result) in
- let a = result!["FF0300490020"] as! String
- self.readdata_0049(a)
- delay(3, closure: {
- self.uartCommandTimerStart()
- })
-
- })
- }
-
- }else{
- delay(3) {
- self.uartCommandTimerStart()
- }
- }
- }
- }
-
- override func viewWillAppear(_ animated: Bool) {
- super.viewWillAppear(animated)
-
- if AppShare.reloadDeviceReciveData == true{
- }
- NotificationCenter.default.addObserver(self, selector: #selector(sendHistoryCmd), name: NSNotification.Name(kNotifitionSBTDeviceDetaiVCtrSendHistory), object: nil)
-
- NotificationCenter.default.addObserver(self, selector:#selector(uartCommandTimerPause), name: NSNotification.Name(kNotifitionSBTDeviceDetaiVCtrRealTimerStop), object: nil)
-
- NotificationCenter.default.addObserver(self, selector:#selector(uartCommandTimerContinue), name: NSNotification.Name(kNotifitionSBTDeviceDetaiVCtrRealTimerStart), object: nil)
-
- NotificationCenter.default.addObserver(self, selector: #selector(historyCommandTimerPause)
- , name: NSNotification.Name(rawValue: kNotifitionSBTDeviceDetaiVCtrHistoryTimerStop), object: nil)
-
- NotificationCenter.default.addObserver(self, selector: #selector(historyCommandTimerContinue)
- , name: NSNotification.Name(rawValue: kNotifitionSBTDeviceDetaiVCtrHistoryTimerStart), object: nil)
-
-
-
- }
- override func viewWillDisappear(_ animated: Bool) {
- super.viewWillDisappear(animated)
- if self.isDemo == false {
- uartCommandTimerPause()
- historyCommandTimerPause()
- }
- }
- override func viewDidDisappear(_ animated: Bool) {
- super.viewDidDisappear(animated)
- if self.isDemo == false {
- uartCommandTimerPause()
- historyCommandTimerPause()
- }
- }
-
- override func viewDidAppear(_ animated: Bool) {
- super.viewDidAppear(animated)
- //当前事第一个页面的时候
- navigationController?.interactivePopGestureRecognizer?.isEnabled = false
- // navigationController?.interactivePopGestureRecognizer?.isEnabled = (categoryView.selectedIndex == 0)
- log.debug("viewDidAppear")
-
- if self.isSetAction == true && self.isDemo == false{
- let index = self.currentIndex
-
- self.historyCommandTimerPause()
- self.uartCommandTimerPause()
- if index == 0 {
-
- delay(2) {
- self.uartCommandTimerContinue()
- }
- }else if index == 1{
- //判断历史数据定时器是否已经开启。如果没有开启,则开启
- delay(5) {
- if self.isHistoryTimerFire == false{
- self.historyCommandTimerStart()
- }else{
- self.historyCommandTimerContinue()
- }
- }
- }
- }
-
- }
-
- }
- extension SBTDeviceDetaiVCtr{
- @objc func refreshAction () {
-
- if self.isDemo == true {
- g_toast("Current_demo_data".da_localizedStr())
- return
- }
-
- if self.currentIndex == 0 {
- uartCommandTimerPauseCheckEnd { () in
- log.debug("当前下标 -- \(self.currentIndex)")
- log.debug("检查是否已经结束--- \(self.isUartCommandTimerEnd)")
- self.aRefreshData()
- }
- }else if self.currentIndex == 1 {
- historyCommandTimerPauseCheckEnd {
- log.debug("当前下标 -- \(self.currentIndex)")
- self.aRefreshData()
- }
- }else{ // index= 3
- historyCommandTimerPause()
- uartCommandTimerPause()
- }
- //循环执行
- categoryViewTimer?.invalidate()
- log.debug("刷新数据")
- let alert = SBTReadLoadingVCtr(nibName: "SBTReadLoadingVCtr", bundle: nil)
- let plist = CLDeviceDataPlist()
- let dataDict1 = plist.findData(deviceDetailPlist, key: self.plist_node!)
- var productName = ""
- if self.isOld == true {
- productName = " "
- }else{
- productName = dataDict1![key.productName] as! String
- }
- alert.deviceName = productName
- alert.message = "Data_refreshing...".da_localizedStr()
- alert.show()
- alert.dismiss(10)
- }
- func aRefreshData() {
- if self.isOld == false{
- BabyBluetoothSwift.shareInstance()?.writeData2222(["FF0300490020"], completionHandler: { (result) in
- let a = result!["FF0300490020"] as! String
- self.readdata_0049(a)
- })
- }
- delay(3) {
- self.refreshData()
- }
- }
- //
- func refreshData() {
- if self.isOld == true {
- let arr = ["FF03000A0001","FF03E0030001","FF03E0080001","FF030100000A","FF0301200003","FF03F000000A","FF03F001000A","FF03F002000A","FF03F003000A","FF03F004000A","FF03F005000A","FF03F006000A","FF03F007000A","FF030115000B"]
- BabyBluetoothSwift.shareInstance()?.writeData2222(arr, completionHandler: { (result) in
- log.debug("返回数据 --- \(ReceiveData)")
- //实时数据
- self.realdata_000A(result!["FF03000A0001"] as! String)
- self.realdata_E003(result!["FF03E0030001"] as! String)
- self.realdata_E008(result!["FF03E0080001"] as!String)
- self.realdata_0100(result!["FF030100000A"] as! String)
- self.realdata_0120(result!["FF0301200003"] as! String)
- NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifisionDeviceDatailDataRealDataRecieve), object: nil, userInfo: self.realDataDict)
- self.historyDataArr.removeAll()
- //历史数据
- self.realdata_F000(result!["FF03F000000A"] as! String)
- self.realdata_F001(result!["FF03F001000A"] as! String)
- self.realdata_F002(result!["FF03F002000A"] as! String)
- self.realdata_F003(result!["FF03F003000A"] as! String)
- self.realdata_F004(result!["FF03F004000A"] as! String)
- self.realdata_F005(result!["FF03F005000A"] as! String)
- self.realdata_F006(result!["FF03F006000A"] as! String)
- self.realdata_F007(result!["FF03F007000A"] as! String)
- self.realdata_0115(result!["FF030115000B"] as! String)
- self.perform(#selector(self.timerStar), with: nil, afterDelay: 1)
- self.timeChange()
- log.debug("加载结束 -- old")
- })
- }else{
- let arr = ["FF03000A0001","FF03E0030001","FF03E0080001","FF0300FD000D","FF03F000000A","FF03F001000A","FF03F002000A","FF03F003000A","FF03F004000A","FF03F005000A","FF03F006000A","FF03F007000A","FF030115000B"]
- BabyBluetoothSwift.shareInstance()?.writeData2222(arr, completionHandler: { (result) in
- log.debug("返回数据 --- \(result)")
- //实时数据
- self.realdata_000A(result!["FF03000A0001"] as! String)
- self.realdata_00FD(result!["FF0300FD000D"] as! String)
- self.realdata_E003(result!["FF03E0030001"] as! String)
- self.realdata_E008(result!["FF03E0080001"] as!String)
- NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifisionDeviceDatailDataRealDataRecieve), object: nil, userInfo: self.realDataDict)
- //历史数据
- self.historyDataArr.removeAll()
- self.realdata_F000(result!["FF03F000000A"] as! String)
- self.realdata_F001(result!["FF03F001000A"] as! String)
- self.realdata_F002(result!["FF03F002000A"] as! String)
- self.realdata_F003(result!["FF03F003000A"] as! String)
- self.realdata_F004(result!["FF03F004000A"] as! String)
- self.realdata_F005(result!["FF03F005000A"] as! String)
- self.realdata_F006(result!["FF03F006000A"] as! String)
- self.realdata_F007(result!["FF03F007000A"] as! String)
- self.realdata_0115(result!["FF030115000B"] as! String)
- // self.perform(#selector(self.timerStar), with: nil, afterDelay: 1)
- // self.timeChange()
- log.debug("加载结束 -- new")
- })
- }
- }
-
- func timeChange() {
- var time = 5
- let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (timer) in
- time = time - 1
- log.debug("计时 -- \(time)")
- //处理事件
- NotificationCenter.default.post(name: NSNotification.Name(kNotifitionSBTDeviceDetailVCtrRefreshStatus), object: nil, userInfo: ["countdown":"\(time)"])
- if time < 0 {
- timer.invalidate()
-
- }
- }
- timer.fire()
- }
- @objc func timerStar() {
-
- let index = self.currentIndex
- if index == 0 {
- uartCommandTimerContinue()
- }else if index == 1{
- historyCommandTimerContinue()
-
- }
- }
-
- @objc func setAction () {
- self.isSetAction = true
- log.debug("设置")
- AppShare.reloadDeviceReciveData = true
- if self.isDemo == true {
- g_toast("Current_demo_data".da_localizedStr())
-
- }
- if self.isDemo == false {
- categoryViewTimer?.invalidate()
- uartCommandTimerPause()
- historyCommandTimerPause()
- }
- let vc = SBTPramSettingVCtr()
- vc.bleKey = self.plist_node
- vc.isDemo = self.isDemo
- vc.isOld = self.isOld
- delay(0.25) {
- self.navigationController?.pushViewController(vc, animated: true)
- }
- }
- func createUI() {
- setNavgationBar()
-
- let refreshbtn = UIBarButtonItem.createBarbuttonItem(image: "刷新", highImage: "刷新", target: self, action: #selector(refreshAction))
-
- let setbtn = UIBarButtonItem.createBarbuttonItem(image: "参数设置", highImage: "参数设置", target: self, action: #selector(setAction))
- //设置空白展位bar
- let spaceItem = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
- spaceItem.width = 20
- self.navigationItem.rightBarButtonItems = [setbtn,spaceItem,refreshbtn]
- //滚动视图
- let count = preferredListViewCount()
- let categoryViewHeight = preferredCategoryViewHeight()
- let width = KSCREENWIDTH
- let height = KSCREENHEIGHT - KNavBarHeight - categoryViewHeight
-
- scrollView.frame = CGRect(x: 0, y: categoryViewHeight, width: width, height: height)
- scrollView.showsVerticalScrollIndicator = false
- scrollView.showsHorizontalScrollIndicator = false
- scrollView.delegate = self
- scrollView.isPagingEnabled = true
- scrollView.contentSize = CGSize(width: width * CGFloat(count), height: height)
- scrollView.bounces = false
- // scrollView.isScrollEnabled = false
- view.addSubview(scrollView)
-
- let realtimeVc = SBTRealTimeStatusVCtr()
- realtimeVc.preVC = self
- realtimeVc.isOld = self.isOld
- realtimeVc.bleKey = self.plist_node
- realtimeVc.isDemo = self.isDemo
- addChild(realtimeVc)
- realtimeVc.view.frame = CGRect(x: 0, y: 0, width: width, height: height)
- scrollView.addSubview(realtimeVc.view)
-
- let historyVC = SBTHistoryDataVCtr()
- historyVC.isOld = self.isOld
- historyVC.belKey = self.plist_node
- historyVC.isDemo = self.isDemo
- addChild(historyVC)
- historyVC.view.frame = CGRect(x: width, y: 0, width: width, height: height)
- scrollView.addSubview(historyVC.view)
-
- let baseInfoVc = SBTBaseInfoVCtr()
- baseInfoVc.isOld = self.isOld
- baseInfoVc.belKey = self.plist_node
- baseInfoVc.isDemo = self.isDemo
- addChild(baseInfoVc)
- baseInfoVc.view.frame = CGRect(x: width * 2, y: 0, width: width, height: height)
- scrollView.addSubview(baseInfoVc.view)
-
- categoryView.frame = CGRect(x: 0, y: 0, width: KSCREENWIDTH, height: categoryViewHeight)
- categoryView.delegate = self
- categoryView.contentScrollView = scrollView
- view.addSubview(categoryView)
- categoryView.titleColor = UIColor(hexString: "222222")
- categoryView.titleSelectedColor
- = UIColor(hexString: "FD8B23")
-
- }
-
-
- func preferredListViewCount() -> Int {
- return 3
- }
- func preferredCategoryViewHeight() -> CGFloat {
- return 49
- }
- }
- extension SBTDeviceDetaiVCtr :UIScrollViewDelegate,JXCategoryViewDelegate{
- func categoryView(_ categoryView: JXCategoryBaseView!, didScrollSelectedItemAt index: Int) {
-
- }
- func categoryView(_ categoryView: JXCategoryBaseView!, didClickSelectedItemAt index: Int) {
-
- }
- func categoryView(_ categoryView: JXCategoryBaseView!, canClickItemAt index: Int) -> Bool {
- return true
- }
- func categoryView(_ categoryView: JXCategoryBaseView!, scrollingFromLeftIndex leftIndex: Int, toRightIndex rightIndex: Int, ratio: CGFloat) {
- // log.debug("leftIndex -- \(leftIndex) rightIndext---\(rightIndex) --- ratio - \(ratio)")
- /*
- 正在滚动中的回调
-
- @param categoryView categoryView对象
- @param leftIndex 正在滚动中,相对位置处于左边的index
- @param rightIndex 正在滚动中,相对位置处于右边的index
- @param ratio 从左往右计算的百分比
- */
- }
-
- func categoryView(_ categoryView: JXCategoryBaseView!, didSelectedItemAt index: Int) {
-
-
- if shouldHandleScreenEdgeGesture {
- // navigationController?.interactivePopGestureRecognizer?.isEnabled = (index == 0)
- navigationController?.interactivePopGestureRecognizer?.isEnabled = false
- }
- self.currentIndex = index
- log.debug("当前控制器 \(index)")
- if self.isDemo == false {
- uartCommandTimerPause()
- historyCommandTimerPause()
- }
- if index != 2 {
- var flag = 0 // 标记 进来就是0
- //创建一个定时器
- let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (timer) in
- flag = flag + 1
- log.debug("当前计数: index -\(index) - flag-\(flag)")
- if flag == 5 {
- self.changeItem(index)
- timer.invalidate()
- }
- }
- timer.fire()
- categoryViewTimer = timer
- }
-
- }
-
- func changeItem(_ index:Int) {
-
- if self.isDemo == false {
- if index == 0 {
- self.uartCommandTimerContinue()
- }else if index == 1{
- if self.isHistoryTimerFire == false{
- self.historyCommandTimerStart()
- }else{
- self.historyCommandTimerContinue()
- }
- }else{
- uartCommandTimerPause()
- historyCommandTimerPause()
- }
- }
- NotificationCenter.default.post(name: NSNotification.Name(rawValue: kCheckCurrenVC), object: nil)
- }
- }
- extension SBTDeviceDetaiVCtr{
-
- //实时数据
- func realdata_000A(_ reciveData : String) {
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
- //系统支持的最高电压
- let num00 = UUUtils.numberHexString(str0.subString(start: 7 , length: 2))
- log.debug("额定充电电流: \(num00!)")
- realDataDict[key.MaxVolt] = "\(num00!)"
- deviceDetailData[key.MaxVolt] = "\(num00!)"
- let num0 = UUUtils.numberHexString(str0.subString(start: 7 + 2, length: 2))
- log.debug("额定充电电流: \(num0!)")
- // dataDict[key.IchageRage] = "\(num0!)"
- realDataDict[key.IchageRage] = "\(num0!)"
- deviceDetailData[key.IchageRage] = "\(num0!)"
-
- }
-
-
- func realdata_E003(_ reciveData : String) {
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
-
- //e003
-
- // FF
- let FF = str0.subString(start: 7 , length: 2)
- if FF == "FF"{
- // dataDict[key.autoRecognition] = "1"
- realDataDict[key.autoRecognition] = "1"
- deviceDetailData[key.autoRecognition] = "1"
- }else{
- // dataDict[key.autoRecognition] = "0"
- realDataDict[key.autoRecognition] = "0"
- deviceDetailData[key.autoRecognition] = "0"
- }
- // 判断是否自动识别
- let num0 = UUUtils.numberHexString(str0.subString(start: 7 + 2 , length: 2))
- log.debug("系统电压设置 - \(num0!)")
- deviceDetailData[key.BatRateVolt] = "\(num0!)"
- realDataDict[key.BatRateVolt] = "\(num0!)"
- }
-
-
- func realdata_E008(_ reciveData : String) {
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
-
- //e003
- //e008
- let num5 = UUUtils.numberHexString(str0.subString(start: 7 , length: 4))
- log.debug("提升充电电压/过充返回电压\(num5!.floatValue * 0.1)")
- deviceDetailData[key.BatImprovChgVolt] = "\(String(format: "%.1f", num5!.floatValue * 0.1))"
- realDataDict[key.BatImprovChgVolt] = "\(String(format: "%.1f", num5!.floatValue * 0.1))"
- }
-
-
-
- //读取名称
- func readdata_0049(_ reciveData : String){
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
-
- var productNameDict : [String:String] = [String:String]()
-
- if self.isOld == true {
- productNameDict[key.productName] = ""
- deviceDetailData[key.productName] = ""
- }else{
- var num5 = UUUtils.string(fromHexString: str0.subString(start: 7 , length: str0.count - 12))
- log.debug("要解析的十六进制 \( str0.subString(start: 7 , length: str0.count - 12))")
- num5 = num5?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白
- log.debug("设备名称 \(num5)")
- //f16d33 575578 e565b 065fd8 0906ed179
- if num5 == nil || num5 == "" {
- let ChineseString = UUUtils.deUnicodeString(fromHexString: str0.subString(start: 7 , length: str0.count - 12))
- // ff ff
- productNameDict[key.productName] = ChineseString
- deviceDetailData[key.productName] = ChineseString
- log.debug("设备中文名称 \(ChineseString!)")
- }else{
- productNameDict[key.productName] = num5
- deviceDetailData[key.productName] = num5
- }
- }
-
- }
-
- func real_000B000F(_ reciveData : String) {
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
-
- //1400
- //额定放电电流
- let num00 = UUUtils.numberHexString(str0.subString(start: 7, length: 2))
- log.debug("额定放电电流:\(num00!)")
- deviceDetailData[key.idischagRate] = "\(num00!)"
- //产品类型
- let num0 = UUUtils.numberHexString(str0.subString(start: 9, length: 2))
-
- log.debug("产品类型:\(num0)")
- var device_type = ""
- switch num0?.intValue {
- case 0:
- device_type = "Controller_household".da_localizedStr()
- case 1:
- device_type = "Controller_street_light".da_localizedStr()
- case 3:
- device_type = "Inverter".da_localizedStr()
- case 4:
- device_type = "All-in-one_inverter".da_localizedStr()
-
- default:
- break
- }
-
- deviceDetailData[key.device_type] = device_type
- var num1 = UUUtils.string(fromHexString: str0.subString(start: 11, length: 32))
- num1 = num1?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白
- log.debug("产品型号\(num1)")
- deviceDetailData[key.product_type] = num1!
- //软件版本
- // let num2 = UUUtils.numberHexString(str0.subString(start: 11 + 32, length: 8))
- let a = UUUtils.numberHexString(str0.subString(start: 11 + 32, length: 2))
- let b = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2, length: 2))
- let c = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2 + 2, length: 2))
- let d = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2 + 2 + 2, length: 2))
- log.debug("软件版本 : V \(b!).\(c!).\(d!)")
- deviceDetailData[key.softWareCersion] = "V\(b!).\(c!).\(d!)"
- //硬件版本
- let m1 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8, length: 2))
- let m2 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2, length: 2))
- let m3 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2 + 2, length: 2))
- let m4 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2 + 2 + 2, length: 2))
- log.debug("硬件版本 : V\(m2!).\(m3!).\(m4!)")
- // 序列号
- deviceDetailData[key.hardWareCersion] = "V \(m2!).\(m3!).\(m4!)"
- // let num4 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 , length: 8))
- let num41 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 , length: 2))
- let num42 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 2 , length: 2))
- let num43 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 4 , length: 4)) //补足5位
-
- log.debug("\( String(format: "%05d", num43!.intValue))") // 年月(低十六位)
-
- deviceDetailData[key.productSN] = "\(num41!)\(num42!)\( String(format: "%05d", num43!.intValue))"
-
- }
-
-
- func realdata_000B(_ reciveData : String) {
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
-
- //1400
- //额定放电电流
- let num00 = UUUtils.numberHexString(str0.subString(start: 7, length: 2))
- log.debug("额定放电电流:\(num00!)")
- deviceDetailData[key.idischagRate] = "\(num00!)"
- //产品类型
- let num0 = UUUtils.numberHexString(str0.subString(start: 9, length: 2))
-
- log.debug("产品类型:\(num0)")
- var device_type = ""
- switch num0?.intValue {
- case 0:
- device_type = "Controller_household".da_localizedStr()
- case 1:
- device_type = "Controller_street_light".da_localizedStr()
- case 3:
- device_type = "Inverter".da_localizedStr()
- case 4:
- device_type = "All-in-one_inverter".da_localizedStr()
-
- default:
- break
- }
-
- deviceDetailData[key.device_type] = device_type
- var num1 = UUUtils.string(fromHexString: str0.subString(start: 11, length: 32))
- num1 = num1?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白
- log.debug("产品型号\(num1)")
- deviceDetailData[key.product_type] = num1!
- //软件版本
- // let num2 = UUUtils.numberHexString(str0.subString(start: 11 + 32, length: 8))
- let a = UUUtils.numberHexString(str0.subString(start: 11 + 32, length: 2))
- let b = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2, length: 2))
- let c = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2 + 2, length: 2))
- let d = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2 + 2 + 2, length: 2))
- log.debug("软件版本 : V \(b!).\(c!).\(d!)")
- deviceDetailData[key.softWareCersion] = "V\(b!).\(c!).\(d!)"
- //硬件版本
- let m1 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8, length: 2))
- let m2 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2, length: 2))
- let m3 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2 + 2, length: 2))
- let m4 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2 + 2 + 2, length: 2))
- log.debug("硬件版本 : V\(m2!).\(m3!).\(m4!)")
- // 序列号
- deviceDetailData[key.hardWareCersion] = "V \(m2!).\(m3!).\(m4!)"
- // let num4 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 , length: 8))
- let num41 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 , length: 2))
- let num42 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 2 , length: 2))
- let num43 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 4 , length: 4)) //补足5位
-
- log.debug("\( String(format: "%05d", num43!.intValue))") // 年月(低十六位)
-
- deviceDetailData[key.productSN] = "\(num41!)\(num42!)\( String(format: "%05d", num43!.intValue))"
- // var num5 = UUUtils.string(fromHexString: str0.subString(start: 255 , length: 32)) // 最大32字节 12568哦哦哦泈色系儿子儿媳妇
-
- var num5 = UUUtils.string(fromHexString: str0.subString(start: 255 , length: 64))
- log.debug("要解析的十六进制 \( str0.subString(start: 255 , length: 64))")
- num5 = num5?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白
- log.debug("设备名称 \(num5)")
- //f16d33 575578 e565b 065fd8 0906ed179
- if num5 == nil || num5 == "" {
- let ChineseString = UUUtils.deUnicodeString(fromHexString: str0.subString(start: 255 , length: 64))
- // ff ff
- deviceDetailData[key.productName] = ChineseString
- log.debug("设备中文名称 \(ChineseString!)")
- }else{
- deviceDetailData[key.productName] = num5
- }
-
- let year = UUUtils.numberHexString(str0.subString(start: 75, length: 2))
- let mouth = UUUtils.numberHexString(str0.subString(start: 75 + 2, length: 2))
- let day = UUUtils.numberHexString(str0.subString(start: 75 + 2, length: 2))
- log.debug("生产日期 : \(year!)-\(mouth!)-\(day!)")
- }
- //温度处理
- func temp(with num:NSNumber)-> String{
- let numInt = num.intValue
- // let q1 = UUUtils.numberHexString(q)?.intValue
-
- let q2 = numInt & 128
- print("判断正负\(q2)")
- if q2 != 128 {
- log.debug("温度\(num.floatValue )")
- return "\(num.intValue )"
-
- }else{
-
- log.debug("温度: -\(numInt & 127 )")
- return "-\(numInt & 127 )"
- }
- }
- //1s刷新一次
-
- //实时数据
- func realdata_00FD(_ reciveData : String) {
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
- var num0A = UUUtils.getBinaryByHex(str0.subString(start: 11 , length: 8))
- let num0A_1 = num0A?.subString(start: 0, length: 16)
- let num0A_2 = num0A?.subString(start: 16, length: 16)
- let num0A_II = num0A_2! + num0A_1!
- num0A = num0A_II
- log.debug("太阳能板状态\(num0A!)")
-
- /*
-
-
- 00001101 00011100 00000000 00000000
-
-
- 30 ----
- 19 20 21 22 23 24 25 26 27 28 29 30 31
- */
- var solarStatusStr = ""
- let B30 = num0A?.subString(start: 1, length: 1)
- let B29 = num0A?.subString(start: 2, length: 1)
- let B28 = num0A?.subString(start: 3, length: 1)
- let B27 = num0A?.subString(start: 4, length: 1)
- let B26 = num0A?.subString(start: 5, length: 1)
- let B25 = num0A?.subString(start: 6, length: 1)
- let B24 = num0A?.subString(start: 7, length: 1)
- let B23 = num0A?.subString(start: 8, length: 1)
-
- //负载
- let B20 = num0A?.subString(start: 11, length: 1)
- let B19 = num0A?.subString(start: 12, length: 1)
- let B15 = num0A?.subString(start: 16, length: 1)
- //系统
- let B21 = num0A?.subString(start: 10, length: 1)
- let B14 = num0A?.subString(start: 17, length: 1)
- let B13 = num0A?.subString(start: 18, length: 1)
-
- //蓄电池状态
- let B22 = num0A?.subString(start: 9, length: 1)
- let B18 = num0A?.subString(start: 13, length: 1)
- let B17 = num0A?.subString(start: 14, length: 1)
- let B16 = num0A?.subString(start: 15, length: 1)
- let B12 = num0A?.subString(start: 19, length: 1)
- let B11 = num0A?.subString(start: 20, length: 1)
- let B10 = num0A?.subString(start: 21, length: 1)
-
- var batteryStatusStr = ""
- if B10 == "1" {
- batteryStatusStr = "BMS_overcharge_protection".da_localizedStr()
- }
- if B11 == "1" {
- batteryStatusStr = "Battery_low_temperature_protection,_stop_charging".da_localizedStr()
- }
- if B12 == "1" {
- batteryStatusStr = "Battery_reverse_polarity".da_localizedStr()
- }
- if B16 == "1" {
- batteryStatusStr = "Battery_over_discharge".da_localizedStr()
- }
- if B17 == "1" {
- batteryStatusStr = "Battery_overvoltage".da_localizedStr()
- }
- if B18 == "1" {
- batteryStatusStr = "Undervoltage_warning".da_localizedStr()
- }
- if B22 == "1" {
- batteryStatusStr = "External_ambient_temperature_is_too_high".da_localizedStr()
- }
-
- if B10 == "0" && B11 == "0" && B12 == "0" && B16 == "0" && B17 == "0" && B18 == "0" && B22 == "0"{
- batteryStatusStr = "Normal".da_localizedStr()
- }
- deviceDetailData[key.batteryStatus] = batteryStatusStr
- realDataDict[key.batteryStatus] = batteryStatusStr
- //太阳能状态
- if B23 == "1" {
- solarStatusStr = "PV_input_power_is_too_large".da_localizedStr()
- }
- if B24 == "1" {
- solarStatusStr = "Short_circuit_of_photovoltaic_input".da_localizedStr()
- }
- if B25 == "1" {
- solarStatusStr = "Overvoltage_at_the_photovoltaic_input".da_localizedStr()
- }
- if B26 == "1" {
- solarStatusStr = "Solar_panel_countercurrent".da_localizedStr()
- }
- if B27 == "1" {
- solarStatusStr = "Solar_panel_working_point_overpressure".da_localizedStr()
- }
- if B28 == "1" {
- solarStatusStr = "Solar_panel_reverse_connection".da_localizedStr()
- }
- deviceDetailData[key.solarStatus] = solarStatusStr
- realDataDict[key.solarStatus] = solarStatusStr
- let num0 = UUUtils.getBinaryByHex(str0.subString(start: 7, length: 4))
- log.debug("00FD \(num0!)")
- let low_8_bit = UUUtils.numberHexString(str0.subString(start: 9, length: 2))
-
- log.debug("low_8_bit - \(low_8_bit)")
- //1000000000000000
-
- var changeStatus = ""
- if low_8_bit == 0 {
- changeStatus = "Charging_is_not_turned_on".da_localizedStr()
- }else if low_8_bit == 1 {
- changeStatus = "Start_charging_mode".da_localizedStr()
- }else if low_8_bit == 2 {
- changeStatus = "MPPT_charge_mode".da_localizedStr()
- }else if low_8_bit == 3 {
- changeStatus = "Equalizing_charge_mode".da_localizedStr()
- }else if low_8_bit == 4 {
- changeStatus = "Floating_charge_mode".da_localizedStr()
- }else if low_8_bit == 5 {
- changeStatus = "Boost_charge_mode".da_localizedStr()
- }else if low_8_bit == 6 {
- changeStatus = "Current_limiting_(super_power)".da_localizedStr()
- }else if low_8_bit == 7 {
- changeStatus = "Fully_charged".da_localizedStr()
- }
- // if B23 == "0" && B24 == "0" && B25 == "0" && B26 == "0" && B27 == "0" && B28 == "0" {
- // dataDict[key.solarStatus] = batteryStatusStr
- // realDataDict[key.solarStatus] = batteryStatusStr
- // }
- // realDataDict[key.solarStatus] = solarStatusStr
- if B23 == "0" && B24 == "0" && B25 == "0" && B26 == "0" && B27 == "0" && B28 == "0" {
- dataDict[key.solarStatus] = changeStatus
- realDataDict[key.solarStatus] = changeStatus
- }
- //0000 0000 0000 0000 从后往前数
- let loadStatus = "\(num0?.subString(start: 0, length: 1) ?? "")"
- var loadStatusStr = ""
- if B15 == "1" {
- loadStatusStr = "Open_load".da_localizedStr()
- }
- if B19 == "1" {
- loadStatusStr = "Load_short_circuit".da_localizedStr()
- }
- if B20 == "1" {
- loadStatusStr = "Excessive_load_power_or_overload".da_localizedStr()
- }
-
- if B15 == "0" && B19 == "0" && B20 == "0" {
- if loadStatus == "0" {
- loadStatusStr = "Load_is_off".da_localizedStr()
- }else if loadStatus == "1" {
- loadStatusStr = "Load_is_on".da_localizedStr()
- }
- }
-
- log.debug("负载状态 :\(num0?.subString(start: 7, length: 1))") // 低八位
- deviceDetailData[key.loadStatus] = loadStatusStr
- realDataDict[key.loadStatus] = loadStatusStr
-
-
- //太阳能电压 0107
- let num1 = UUUtils.numberHexString(str0.subString(start: 47, length: 4))
- print("太阳能电压 \(num1!.floatValue * 0.1)" )
- let solarV = String(format: "%.1f", num1!.floatValue * 0.1)
- deviceDetailData[key.solarVoltage] = "\(solarV)"
- realDataDict[key.solarVoltage] = "\(solarV)"
- // 太阳能电流 0108
- let num2 = UUUtils.numberHexString(str0.subString(start: 47 + 4, length: 4))
- print("太阳能电流 \(num2!.floatValue * 0.01)")
- deviceDetailData[key.solarCurrent] = String(format: "%.2f", num2!.floatValue * 0.01)
- realDataDict[key.solarCurrent] = String(format: "%.2f", num2!.floatValue * 0.01)
- // 太阳能功率 0109
- let num2_1 = UUUtils.numberHexString(str0.subString(start: 47 + 4 + 4, length: 4))
- print("太阳能功率 \(num2_1!)")
- deviceDetailData[key.solarPower] = "\(num2_1!)"
- realDataDict[key.solarPower] = "\(num2_1!)"
- //蓄电池 电压
- let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4))
- print("蓄电池电压 \(num3!.floatValue * 0.1)")
- deviceDetailData[key.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1)
- realDataDict[key.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1)
- let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5, length: 4))
- print("蓄电池电流\(num4!.floatValue * 0.01)")
- deviceDetailData[key.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01)
- realDataDict[key.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01)
- let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6 + 2 , length: 2))
- print("温度 \(temp(with: num5!))")
- deviceDetailData[key.batteryTemp] = "\(temp(with: num5!))"
- realDataDict[key.batteryTemp] = "\(temp(with: num5!))"
- //负载
- let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7, length: 4))
- print("负载电压\(num6!.floatValue * 0.1)")
- deviceDetailData[key.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1)
- realDataDict[key.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1)
- let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4))
- print("负载电流\(num7!.floatValue * 0.01)")
- deviceDetailData[key.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01)
- realDataDict[key.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01)
- let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 9, length: 4))
- print("功率 \(num8! )")
- realDataDict[key.loadPower] = "\(num8!)"
-
- deviceDetailData[key.loadPower] = "\(num8!)"
-
- }
- //FF030115000B
- //ff031400000000000000000000000000 0000 0000 0000 0064 0b《》
- //13 * 4
- //处理历史数据
- func hisData(_ reciveData:String) {
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
- if str0.count != 13 * 4 {
- return
- }
- var F000Dict = [String: String]()
- //蓄电池当天最低电压
- let num0 = UUUtils.numberHexString(str0.subString(start: 7, length: 4))
- log.debug("蓄电池当天最低电压: \( String(format: "%.1f", num0!.floatValue * 0.1))")
- F000Dict[key.his_batteryVoltageMin] = String(format: "%.1f", num0!.floatValue * 0.1)
- //蓄电池当天最高电压
- let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4, length: 4))
- log.debug("蓄电池当天最高电压\(String(format: "%.1f", num1!.floatValue * 0.1))")
- F000Dict[key.his_batteryVoltageMax] = String(format: "%.1f", num1!.floatValue * 0.1)
- let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 2, length: 4))
- log.debug("当天充电最大电流\(String(format: "%.2f", num2!.floatValue * 0.01))")
- F000Dict[key.his_chargingCurrentMax] = String(format: "%.2f", num2!.floatValue * 0.01)
- let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 3, length: 4))
- log.debug("当天放电最大电流\(String(format: "%.2f", num3!.floatValue * 0.01))")
- F000Dict[key.his_dischargeCurrentmax] = String(format: "%.2f", num3!.floatValue * 0.01)
- let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4))
- log.debug("当天充电最大功率\(num4!)" )
- F000Dict[key.his_chargingPowerMax] = "\(num4!)"
- let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5 , length: 4))
- log.debug("当天放电最大功率\(num5!)")
- F000Dict[key.his_dischargePowerMax] = "\(num5!)"
- let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6, length: 4))
- log.debug("充电安时数 \(num6!)")
- F000Dict[key.his_chargingAmpereHour] = "\(num6!)"
- let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7 , length: 4))
- log.debug("放电安时数 \(num7!)")
- F000Dict[key.his_dischargeAmpereHour] = "\(num7!)"
- let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4))
- log.debug("当天发电量 \(num8!)")
- F000Dict[key.his_generationCapacity] = "\(num8!)"
- let num9 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 9, length: 4))
- log.debug("充电量 \(num9!)")
- F000Dict[key.his_dischargeCapacity] = "\(num9!)"
- historyDataArr.append(F000Dict)
- }
-
- func realdata_F000(_ reciveData : String) {
- hisData(reciveData)
- }
-
- func realdata_F001(_ reciveData : String) {
- hisData(reciveData)
- }
-
- func realdata_F002(_ reciveData : String) {
- hisData(reciveData)
- }
-
- func realdata_F003(_ reciveData : String) {
- hisData(reciveData)
- }
-
- func realdata_F004(_ reciveData : String) {
- hisData(reciveData)
- }
-
- func realdata_F005(_ reciveData : String) {
- hisData(reciveData)
- }
-
- func realdata_F006(_ reciveData : String) {
- hisData(reciveData)
-
- }
- func realdata_F007(_ reciveData : String) {
- hisData(reciveData)
- deviceDetailData[key.historydatas] = historyDataArr
- cumulativeDict[key.historydatas] = historyDataArr
-
- }
-
- func realdata_0115(_ reciveData :String) {
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
- //
- let num0 = UUUtils.numberHexString(str0.subString(start: 7 , length: 4))
- log.debug("总运行天数 - \(num0!)")
- cumulativeDict[key.runTime] = ("\(num0!)")
- deviceDetailData[key.runTime] = ("\(num0!)")
- let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4 , length: 4))
- log.debug("蓄电池总过放次数 - \(num1!)")
- cumulativeDict[key.overTimes] = "\(num1!)"
- deviceDetailData[key.overTimes] = "\(num1!)"
-
- let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 8 , length: 4))
- log.debug("蓄电池总充满次数 - \(num2!)")
- cumulativeDict[key.fullTimes] = "\(num2!)"
- deviceDetailData[key.fullTimes] = "\(num2!)"
-
- let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 12 , length: 8))
- log.debug("蓄电池总充电安时数 - \(num3!)")
- cumulativeDict[key.chargingAmpereHour] = "\(num3!)"
- deviceDetailData[key.chargingAmpereHour] = "\(num3!)"
-
- let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 , length: 8))
- log.debug("蓄电池总放电安时数 - \(num4!)")
- cumulativeDict[key.dischargeAmpereHour] = "\(num4!)"
- deviceDetailData[key.dischargeAmpereHour] = "\(num4!)"
-
- let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 * 2 , length: 8))
- // let num5 = UUUtils.numberHexString("ffffffff")
- log.debug("累计发电量 - \(num5!)")
- cumulativeDict[key.generatEnergyTotal] = "\(num5!)"
-
- let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 * 3, length: 8))
- log.debug("累计用电量 - \(num6!)")
- cumulativeDict[key.usedEnergyTotal] = "\(num6!)"
- deviceDetailData[key.usedEnergyTotal] = "\(num6!)"
-
-
- NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifisionDeviceDatailDataHistoryDataRecieve), object: nil, userInfo: cumulativeDict)
- }
-
- func realdata_DF0D(_ reciveData : String) {
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
- // <ff030200 009190>
- let num0 = UUUtils.numberHexString(str0.subString(start: 7, length: 4))
- log.debug("手动均衡 —— \(num0)")
- var canhandle = ""
- if num0?.intValue == 0 {
- canhandle = "Prohibited".da_localizedStr()
- }else if num0?.intValue == 1{
- canhandle = "Enable".da_localizedStr()
- }
- deviceDetailData[key.BattEqualChgImmediate] = canhandle
- paramDataDict[key.BattEqualChgImmediate] = canhandle
- log.debug(" kNotifisionDeviceDatailDataBaseInfoRecieve \(deviceDetailData)")
-
-
- NotificationCenter.default.post(name: NSNotification.Name(kNotifisionDeviceDatailDataBaseInfoRecieve), object: nil, userInfo: deviceDetailData)
- }
-
-
-
- func realdata_0100(_ reciveData : String) {
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
-
- //太阳能电压 0107
- let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7, length: 4))
- print("太阳能电压 \(num1!.floatValue * 0.1)" )
- let solarV = String(format: "%.1f", num1!.floatValue * 0.1)
- deviceDetailData[key.solarVoltage] = "\(solarV)"
- realDataDict[key.solarVoltage] = "\(solarV)"
- // 太阳能电流 0108
- let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4))
- print("太阳能电流 \(num2!.floatValue * 0.01)")
- deviceDetailData[key.solarCurrent] = String(format: "%.2f", num2!.floatValue * 0.01)
- realDataDict[key.solarCurrent] = String(format: "%.2f", num2!.floatValue * 0.01)
- // 太阳能功率 0109
- let num2_1 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 9, length: 4))
- print("太阳能功率 \(num2_1!)")
- deviceDetailData[key.solarPower] = "\(num2_1!)"
- realDataDict[key.solarPower] = "\(num2_1!)"
- //蓄电池 电压 101
- let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 1, length: 4))
- print("蓄电池电压 \(num3!.floatValue * 0.1)")
- deviceDetailData[key.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1)
- realDataDict[key.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1)
- //蓄电池电流 102
- let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 2, length: 4))
- print("蓄电池电流\(num4!.floatValue * 0.01)")
- deviceDetailData[key.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01)
- realDataDict[key.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01)
-
- //蓄电池温度 0103
- let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 3 , length: 2))
- print("温度 \(temp(with: num5!))")
- deviceDetailData[key.batteryTemp] = "\(temp(with: num5!))"
- realDataDict[key.batteryTemp] = "\(temp(with: num5!))"
- //负载电压 0104
- let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4))
- print("负载电压\(num6!.floatValue * 0.1)")
- deviceDetailData[key.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1)
- realDataDict[key.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1)
- //负载电流 0105
- let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5, length: 4))
- print("负载电流\(num7!.floatValue * 0.01)")
- deviceDetailData[key.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01)
- realDataDict[key.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01)
-
- //负载功率 0106
- let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6, length: 4))
- print("功率 \(num8! )")
- realDataDict[key.loadPower] = "\(num8!)"
-
- deviceDetailData[key.loadPower] = "\(num8!)"
- }
-
- func realdata_0120(_ reciveData : String) {
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
-
-
- var num0A = UUUtils.getBinaryByHex(str0.subString(start: 11 , length: 8))
- let num0A_1 = num0A?.subString(start: 0, length: 16)
- let num0A_2 = num0A?.subString(start: 16, length: 16)
- let num0A_II = num0A_2! + num0A_1!
- num0A = num0A_II
- log.debug("太阳能板状态\(num0A!)")
-
- var solarStatusStr = ""
- let B30 = num0A?.subString(start: 1, length: 1)
- let B29 = num0A?.subString(start: 2, length: 1)
- let B28 = num0A?.subString(start: 3, length: 1)
- let B27 = num0A?.subString(start: 4, length: 1)
- let B26 = num0A?.subString(start: 5, length: 1)
- let B25 = num0A?.subString(start: 6, length: 1)
- let B24 = num0A?.subString(start: 7, length: 1)
- let B23 = num0A?.subString(start: 8, length: 1)
-
- //负载
- let B20 = num0A?.subString(start: 11, length: 1)
- let B19 = num0A?.subString(start: 12, length: 1)
- let B15 = num0A?.subString(start: 16, length: 1)
- //系统
- let B21 = num0A?.subString(start: 10, length: 1)
- let B14 = num0A?.subString(start: 17, length: 1)
- let B13 = num0A?.subString(start: 18, length: 1)
-
- //蓄电池状态
- let B22 = num0A?.subString(start: 9, length: 1)
- let B18 = num0A?.subString(start: 13, length: 1)
- let B17 = num0A?.subString(start: 14, length: 1)
- let B16 = num0A?.subString(start: 15, length: 1)
- let B12 = num0A?.subString(start: 19, length: 1)
- let B11 = num0A?.subString(start: 20, length: 1)
- let B10 = num0A?.subString(start: 21, length: 1)
-
- var batteryStatusStr = ""
- if B10 == "1" {
- batteryStatusStr = "BMS_overcharge_protection".da_localizedStr()
- }
- if B11 == "1" {
- batteryStatusStr = "Battery_low_temperature_protection,_stop_charging".da_localizedStr()
- }
- if B12 == "1" {
- batteryStatusStr = "Battery_reverse_polarity".da_localizedStr()
- }
- if B16 == "1" {
- batteryStatusStr = "Battery_over_discharge".da_localizedStr()
- }
- if B17 == "1" {
- batteryStatusStr = "Battery_overvoltage".da_localizedStr()
- }
- if B18 == "1" {
- batteryStatusStr = "Undervoltage_warning".da_localizedStr()
- }
- if B22 == "1" {
- batteryStatusStr = "External_ambient_temperature_is_too_high".da_localizedStr()
- }
-
- if B10 == "0" && B11 == "0" && B12 == "0" && B16 == "0" && B17 == "0" && B18 == "0" && B22 == "0"{
- batteryStatusStr = "Normal".da_localizedStr()
- }
- deviceDetailData[key.batteryStatus] = batteryStatusStr
- realDataDict[key.batteryStatus] = batteryStatusStr
- //太阳能状态
- if B23 == "1" {
- solarStatusStr = "PV_input_power_is_too_large".da_localizedStr()
- }
- if B24 == "1" {
- solarStatusStr = "Short_circuit_of_photovoltaic_input".da_localizedStr()
- }
- if B25 == "1" {
- solarStatusStr = "Overvoltage_at_the_photovoltaic_input".da_localizedStr()
- }
- if B26 == "1" {
- solarStatusStr = "Solar_panel_countercurrent".da_localizedStr()
- }
- if B27 == "1" {
- solarStatusStr = "Solar_panel_working_point_overpressure".da_localizedStr()
- }
- if B28 == "1" {
- solarStatusStr = "Solar_panel_reverse_connection".da_localizedStr()
- }
- deviceDetailData[key.solarStatus] = solarStatusStr
- realDataDict[key.solarStatus] = solarStatusStr
- // if B23 == "0" && B24 == "0" && B25 == "0" && B26 == "0" && B27 == "0" && B28 == "0" {
- // dataDict[key.solarStatus] = batteryStatusStr
- // realDataDict[key.solarStatus] = batteryStatusStr
- // }
-
- //0120
- let num0 = UUUtils.getBinaryByHex(str0.subString(start: 7, length: 4))
- log.debug("00FD \(num0!)")
- let low_8_bit = UUUtils.numberHexString(str0.subString(start: 9, length: 2))
-
- log.debug("low_8_bit - \(low_8_bit)")
- //1000000000000000
-
- var changeStatus = ""
- if low_8_bit == 0 {
- changeStatus = "Charging_is_not_turned_on".da_localizedStr()
- }else if low_8_bit == 1 {
- changeStatus = "Start_charging_mode".da_localizedStr()
- }else if low_8_bit == 2 {
- changeStatus = "MPPT_charge_mode".da_localizedStr()
- }else if low_8_bit == 3 {
- changeStatus = "Equalizing_charge_mode".da_localizedStr()
- }else if low_8_bit == 4 {
- changeStatus = "Floating_charge_mode".da_localizedStr()
- }else if low_8_bit == 5 {
- changeStatus = "Boost_charge_mode".da_localizedStr()
- }else if low_8_bit == 6 {
- changeStatus = "Current_limiting_(super_power)".da_localizedStr()
- }else if low_8_bit == 7 {
- changeStatus = "Fully_charged".da_localizedStr()
- }
-
- // realDataDict[key.solarStatus] = solarStatusStr
- if B23 == "0" && B24 == "0" && B25 == "0" && B26 == "0" && B27 == "0" && B28 == "0" {
- dataDict[key.solarStatus] = changeStatus
- realDataDict[key.solarStatus] = changeStatus
- }
- //0000 0000 0000 0000 从后往前数
- let loadStatus = "\(num0?.subString(start: 0, length: 1) ?? "")"
- var loadStatusStr = ""
- if B15 == "1" {
- loadStatusStr = "Open_load".da_localizedStr()
- }
- if B19 == "1" {
- loadStatusStr = "Load_short_circuit".da_localizedStr()
- }
- if B20 == "1" {
- loadStatusStr = "Excessive_load_power_or_overload".da_localizedStr()
- }
-
- if B15 == "0" && B19 == "0" && B20 == "0" {
- if loadStatus == "0" {
- loadStatusStr = "Load_is_off".da_localizedStr()
- }else if loadStatus == "1" {
- loadStatusStr = "Load_is_on".da_localizedStr()
- }
- }
-
- log.debug("负载状态 :\(num0?.subString(start: 7, length: 1))") // 低八位
- deviceDetailData[key.loadStatus] = loadStatusStr
- realDataDict[key.loadStatus] = loadStatusStr
-
-
- }
- }
- ///定时器事件
- extension SBTDeviceDetaiVCtr{
- //定时器开启
- @objc func uartCommandTimerStart() {
- if isDemo == false {
- self.uartCommandTimer!.fire()
-
- }
- }
-
- //暂停计时器(只是暂停,并没有销毁timer)
- @objc func uartCommandTimerPause() {
- if isDemo == false {
- self.uartCommandTimer?.fireDate = Date.distantFuture
- }
- }
-
-
- @objc func uartCommandTimerPauseCheckEnd(_ complete: @escaping ()->Void) {
- if isDemo == false {
- self.checkUartCommandTimerEnd = complete
- self.uartCommandTimer?.fireDate = Date.distantFuture
- }
- }
-
- func switchCmdPause() {
- self.uartCommandTimerPauseCheckEnd {
-
- }
- }
- //继续计时
- @objc func uartCommandTimerContinue() {
- if isDemo == false {
- self.uartCommandTimer?.fireDate = Date.distantPast
- }
- }
-
- //定时器回调
- @objc func uartCommandTimerCallback() {
- sendRealStatusCMD()
- }
- func sendRealStatusCMD() {//0.850956+0800 0.513711+0800
- self.isUartCommandTimerEnd = false
-
- if self.isOld == true {
- let arr = ["FF03000A0001","FF03E0030001","FF03E0080001","FF030100000A","FF0301200003"]
-
- BabyBluetoothSwift.shareInstance()?.loopWriteDataWite(arr, type: "RealStatus", completionHandler: { (result) in
-
-
- log.debug("返回数据 --- \(ReceiveData)")
- self.realdata_000A(result!["FF03000A0001"] as! String)
- self.realdata_E003(result!["FF03E0030001"] as! String)
- self.realdata_E008(result!["FF03E0080001"] as!String)
- self.realdata_0100(result!["FF030100000A"] as! String)
- self.realdata_0120(result!["FF0301200003"] as! String)
-
- NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifisionDeviceDatailDataRealDataRecieve), object: nil, userInfo: self.realDataDict)
- self.isUartCommandTimerEnd = true
- if self.checkUartCommandTimerEnd != nil{
- self.checkUartCommandTimerEnd!()
- }
-
- })
- }else{
- let arr = ["FF03000A0001","FF03E0030001","FF03E0080001","FF0300FD000D"]
- BabyBluetoothSwift.shareInstance()?.loopWriteDataWite(arr,type: "RealStatus", completionHandler: { (result) in
-
- log.debug("返回数据 --- \(result)")
- self.realdata_000A(result!["FF03000A0001"] as! String)
- self.realdata_00FD(result!["FF0300FD000D"] as! String)
- self.realdata_E003(result!["FF03E0030001"] as! String)
- self.realdata_E008(result!["FF03E0080001"] as!String)
- NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifisionDeviceDatailDataRealDataRecieve), object: nil, userInfo: self.realDataDict)
- self.isUartCommandTimerEnd = true
-
- if self.checkUartCommandTimerEnd != nil{
- self.checkUartCommandTimerEnd!()
- }
- })
- }
- }
-
- //定时器关闭
- @objc func uartCommandTimerStop() {
- uartCommandTimer?.invalidate()
- uartCommandTimer = nil
-
- }
- /*********************************/
-
- @objc func historyCommandTimerStart() {
- if isDemo == false {
- self.historyCommandTimer?.fire()
- self.isHistoryTimerFire = true
- }
- }
-
- //暂停计时器(只是暂停,并没有销毁timer)
- @objc func historyCommandTimerPause() {
- if isDemo == false {
- self.historyCommandTimer?.fireDate = Date.distantFuture
- }
- }
-
- //暂停计时器(只是暂停,并没有销毁timer)
- @objc func historyCommandTimerPauseCheckEnd(_ complete : @escaping ()->Void) {
- if isDemo == false {
- self.checkHistoryCommandTimerEnd = complete
- self.historyCommandTimer?.fireDate = Date.distantFuture
- }
- }
-
-
- //继续计时
- @objc func historyCommandTimerContinue() {
- if isDemo == false {
- self.historyCommandTimer?.fireDate = Date.distantPast
- }
- }
- //定时器回调
- @objc func historyCommandTimerCallback() {
-
- sendHistoryCmd()
- }
-
- @objc func sendHistoryCmd() {
- let arr = ["FF03F000000A","FF03F001000A","FF03F002000A","FF03F003000A","FF03F004000A","FF03F005000A","FF03F006000A","FF03F007000A","FF030115000B"]
-
- isHistoryCommandTimerEnd = false
- BabyBluetoothSwift.shareInstance()?.loopWriteDataWite(arr, type: "History", completionHandler: { (result) in
- self.isHistoryCommandTimerEnd = true
- self.historyDataArr.removeAll()
- self.realdata_F000(result!["FF03F000000A"] as! String)
- self.realdata_F001(result!["FF03F001000A"] as! String)
- self.realdata_F002(result!["FF03F002000A"] as! String)
- self.realdata_F003(result!["FF03F003000A"] as! String)
- self.realdata_F004(result!["FF03F004000A"] as! String)
- self.realdata_F005(result!["FF03F005000A"] as! String)
- self.realdata_F006(result!["FF03F006000A"] as! String)
- self.realdata_F007(result!["FF03F007000A"] as! String)
- self.realdata_0115(result!["FF030115000B"] as! String)
- if self.checkHistoryCommandTimerEnd != nil{
- self.checkHistoryCommandTimerEnd!()
- }
- })
- }
-
- //定时器关闭
- @objc func historyCommandTimerStop() {
- historyCommandTimer?.invalidate()
- historyCommandTimer = nil
- }
-
-
- }
- //2019-11-04 16:59:17
- //16:59:19
|