Fix some issues with raw values
This commit is contained in:
		
							
								
								
									
										60
									
								
								bms.py
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								bms.py
									
									
									
									
									
								
							| @@ -310,7 +310,7 @@ def parse_03_response(response): | ||||
|             # Cells are recorded as groups of 4 bits (0x0-0xF) per 4 cells | ||||
|             g = int(hilo_cell / 4) | ||||
|             b = 2**(hilo_cell - (g * 4 )) | ||||
|             data['bms_cells_balancing']['raw_values'][cell+1] = int(bool((state >> g) & b)) | ||||
|             data['bms_cells_balancing']['raw_values'][cell+1] = bool((state >> g) & b) | ||||
|             data['bms_cells_balancing']['values'][cell+1] = "{0}".format(int(bool((state >> g) & b))) | ||||
|             if debug > 1: | ||||
|                 print("Balancing cell {0}: {1}".format(cell, bool((state >> g & b)))) | ||||
| @@ -331,56 +331,56 @@ def parse_03_response(response): | ||||
|         slm  = protection_state & 4096 | ||||
|         data['bms_protection_sop_bool'] = dict() | ||||
|         data['bms_protection_sop_bool']['help'] = "Single overvoltage protection" | ||||
|         data['bms_protection_sop_bool']['raw_value'] = int(bool(sop)) | ||||
|         data['bms_protection_sop_bool']['raw_value'] = bool(sop) | ||||
|         data['bms_protection_sop_bool']['value'] = "{0}".format(int(bool(sop))) | ||||
|         data['bms_protection_sup_bool'] = dict() | ||||
|         data['bms_protection_sup_bool']['help']  = "Single undervoltage protection" | ||||
|         data['bms_protection_sup_bool']['raw_value'] = int(bool(sup)) | ||||
|         data['bms_protection_sup_bool']['raw_value'] = bool(sup) | ||||
|         data['bms_protection_sup_bool']['value'] = "{0}".format(int(bool(sup))) | ||||
|         data['bms_protection_wgop_bool'] = dict() | ||||
|         data['bms_protection_wgop_bool']['help']  = "Whole group overvoltage protection" | ||||
|         data['bms_protection_wgop_bool']['raw_value'] = int(bool(gop)) | ||||
|         data['bms_protection_wgop_bool']['raw_value'] = bool(gop) | ||||
|         data['bms_protection_wgop_bool']['value'] = "{0}".format(int(bool(gop))) | ||||
|         data['bms_protection_wgup_bool'] = dict() | ||||
|         data['bms_protection_wgup_bool']['help']  = "Whole group undervoltage protection" | ||||
|         data['bms_protection_wgup_bool']['raw_value'] = int(bool(gup)) | ||||
|         data['bms_protection_wgup_bool']['value'] = int(bool(gup)) | ||||
|         data['bms_protection_wgup_bool']['raw_value'] = bool(gup) | ||||
|         data['bms_protection_wgup_bool']['value'] = "{0}".format(int(bool(gup))) | ||||
|         data['bms_protection_cotp_bool'] = dict() | ||||
|         data['bms_protection_cotp_bool']['help']  = "Charging over-temperature protection" | ||||
|         data['bms_protection_cotp_bool']['raw_value'] = \ | ||||
|         data['bms_protection_cotp_bool']['raw_value'] = bool(cotp) | ||||
|         data['bms_protection_cotp_bool']['value'] = "{0}".format(int(bool(cotp))) | ||||
|         data['bms_protection_cutp_bool'] = dict() | ||||
|         data['bms_protection_cutp_bool']['help']  = "Charging under-temperature protection" | ||||
|         data['bms_protection_cutp_bool']['raw_value'] = int(bool(cutp)) | ||||
|         data['bms_protection_cutp_bool']['raw_value'] = bool(cutp) | ||||
|         data['bms_protection_cutp_bool']['value'] = "{0}".format(int(bool(cutp))) | ||||
|         data['bms_protection_dotp_bool'] = dict() | ||||
|         data['bms_protection_dotp_bool']['help']  = "Discharging over-temperature protection" | ||||
|         data['bms_protection_dotp_bool']['raw_value'] = int(bool(dotp)) | ||||
|         data['bms_protection_dotp_bool']['raw_value'] = bool(dotp) | ||||
|         data['bms_protection_dotp_bool']['value'] = "{0}".format(int(bool(dotp))) | ||||
|         data['bms_protection_dutp_bool'] = dict() | ||||
|         data['bms_protection_dutp_bool']['help']  = "Discharging under-protection" | ||||
|         data['bms_protection_dutp_bool']['raw_value'] = int(bool(dutp)) | ||||
|         data['bms_protection_dutp_bool']['raw_value'] = bool(dutp) | ||||
|         data['bms_protection_dutp_bool']['value'] = "{0}".format(int(bool(dutp))) | ||||
|         data['bms_protection_cocp_bool'] = dict() | ||||
|         data['bms_protection_cocp_bool']['help']  = "Charging over-current protection" | ||||
|         data['bms_protection_cocp_bool']['raw_value'] = int(bool(cocp)) | ||||
|         data['bms_protection_cocp_bool']['raw_value'] = bool(cocp) | ||||
|         data['bms_protection_cocp_bool']['value'] = "{0}".format(int(bool(cocp))) | ||||
|         data['bms_protection_docp_bool'] = dict() | ||||
|         data['bms_protection_docp_bool']['help']  = "Discharging over-current protection" | ||||
|         data['bms_protection_docp_bool']['raw_value'] = int(bool(docp)) | ||||
|         data['bms_protection_docp_bool']['raw_value'] = bool(docp) | ||||
|         data['bms_protection_docp_bool']['value'] = "{0}".format(int(bool(docp))) | ||||
|         data['bms_protection_scp_bool'] = dict() | ||||
|         data['bms_protection_scp_bool']['help']  = "Short-circuit protection" | ||||
|         data['bms_protection_scp_bool']['raw_value'] = int(bool(scp)) | ||||
|         data['bms_protection_scp_bool']['raw_value'] = bool(scp) | ||||
|         data['bms_protection_scp_bool']['value'] = "{0}".format(int(bool(scp))) | ||||
|         data['bms_protection_fdic_bool'] = dict() | ||||
|         data['bms_protection_fdic_bool']['help']  = "Front detection IC error" | ||||
|         data['bms_protection_fdic_bool']['raw_value'] = int(bool(fdic)) | ||||
|         data['bms_protection_fdic_bool']['raw_value'] = bool(fdic) | ||||
|         data['bms_protection_fdic_bool']['value'] = "{0}".format(int(bool(fdic))) | ||||
|         data['bms_protection_slmos_bool'] = dict() | ||||
|         data['bms_protection_slmos_bool']['help']  = "Software lock MOS" | ||||
|         data['bms_protection_slmos_bool']['raw_value'] = int(bool(slm)) | ||||
|         data['bms_protection_slmos_bool']['value'] = int(bool(slm)) | ||||
|         data['bms_protection_slmos_bool']['raw_value'] = bool(slm) | ||||
|         data['bms_protection_slmos_bool']['value'] = "{0}".format(int(bool(slm))) | ||||
|         if debug > 2: | ||||
|             print("Protection state: {0}".format(protection_state)) | ||||
|             print("Single overvoltage protection: {0}".format(bool(sop))) | ||||
| @@ -403,7 +403,7 @@ def parse_03_response(response): | ||||
|         rsoc = response[23] * 0.01 | ||||
|         data['bms_capacity_charge_ratio'] = dict() | ||||
|         data['bms_capacity_charge_ratio']['help']  = "Percent Charge" | ||||
|         data['bms_capacity_charge_ratio']['raw_value'] = format(rsoc) | ||||
|         data['bms_capacity_charge_ratio']['raw_value'] = rsoc | ||||
|         data['bms_capacity_charge_ratio']['value'] = "{0}".format(rsoc) | ||||
|         data['bms_capacity_charge_ratio']['units'] = "\u2030" | ||||
|         if debug > 1: | ||||
| @@ -413,11 +413,11 @@ def parse_03_response(response): | ||||
|         control_status = response[24] | ||||
|         data['bms_charge_is_charging'] = dict() | ||||
|         data['bms_charge_is_charging']['help']  = "MOSFET charging" | ||||
|         data['bms_charge_is_charging']['raw_value'] = int(bool(control_status & 1)) | ||||
|         data['bms_charge_is_charging']['value'] = int(bool(control_status & 1)) | ||||
|         data['bms_charge_is_charging']['raw_value'] = bool(control_status & 1) | ||||
|         data['bms_charge_is_charging']['value'] = "{0}".format(int(bool(control_status & 1))) | ||||
|         data['bms_charge_is_discharging'] = dict() | ||||
|         data['bms_charge_is_discharging']['help']  = "MOSFET discharging" | ||||
|         data['bms_charge_is_discharging']['raw_value'] = int(bool(control_status & 1)) | ||||
|         data['bms_charge_is_discharging']['raw_value'] = bool(control_status & 1) | ||||
|         data['bms_charge_is_discharging']['value'] = "{0}".format(int(bool(control_status & 1))) | ||||
|         if debug > 1: | ||||
|             if (control_status & 1): | ||||
| @@ -565,7 +565,7 @@ def main(): | ||||
|         pp.pprint(data) | ||||
|  | ||||
|  | ||||
| def prometheus_export(daemonize=True, filename=False): | ||||
| def prometheus_export(daemonize=True, filename=None): | ||||
|     global debug | ||||
|     if not can_export_prometheus: | ||||
|         return | ||||
| @@ -582,7 +582,7 @@ def prometheus_export(daemonize=True, filename=False): | ||||
|     # Populate the metric data structure this period | ||||
|     prometheus_populate_metric(metric, data) | ||||
|  | ||||
|     if (daemonize): | ||||
|     if daemonize: | ||||
|         prometheus_client.start_http_server(9999, registry=registry) | ||||
|  | ||||
|         while True: | ||||
| @@ -596,7 +596,7 @@ def prometheus_export(daemonize=True, filename=False): | ||||
|             prometheus_populate_metric(metric, data) | ||||
|             prometheus_client.generate_latest(registry) | ||||
|     else: | ||||
|         if not filename: | ||||
|         if filename is None: | ||||
|             print("Invalid filename supplied"); | ||||
|             return False | ||||
|         prometheus_client.write_to_textfile(filename, registry=registry) | ||||
| @@ -606,19 +606,19 @@ def prometheus_create_metric(registry, data): | ||||
|     metric = dict() | ||||
|     for name, contains in data.items(): | ||||
|         helpmsg = '' | ||||
|         if contains.get('help'): | ||||
|         if contains.get('help') is not None: | ||||
|             helpmsg = contains.get('help') | ||||
|             if contains.get('units'): | ||||
|                 helpmsg += ' (' + contains.get('units') + ')' | ||||
|         if contains.get('value'): | ||||
|         if contains.get('value') is not None: | ||||
|             metric[name] = prometheus_client.Gauge(name, helpmsg, registry=registry) | ||||
|         # Has multiple values, each a different label | ||||
|         elif contains.get('values'): | ||||
|         elif contains.get('values') is not None: | ||||
|             if contains.get('label') is None: | ||||
|                 print("ERROR: no label for {0} specified".format(name)) | ||||
|             label = contains.get('label') | ||||
|             metric[name] = prometheus_client.Gauge(name, helpmsg, [label], registry=registry) | ||||
|         elif contains.get('info'): | ||||
|         elif contains.get('info') is not None: | ||||
|             metric[name] = prometheus_client.Info(name, helpmsg, registry=registry) | ||||
|         else: | ||||
|             pass | ||||
| @@ -626,11 +626,11 @@ def prometheus_create_metric(registry, data): | ||||
|  | ||||
| def prometheus_populate_metric(metric, data): | ||||
|     for name, contains in data.items(): | ||||
|         if contains.get('value'): | ||||
|         if contains.get('value') is not None: | ||||
|             value = contains.get('value') | ||||
|             metric[name].set(value) | ||||
|         # doesn't have a value, but has [1-4]: | ||||
|         if contains.get('values') and isinstance(contains.get('values'), dict): | ||||
|         if contains.get('values') is not None and isinstance(contains.get('values'), dict): | ||||
|             for idx, label_value in contains.get('values').items(): | ||||
|                 metric[name].labels(idx).set(label_value) | ||||
|         if contains.get('info'): | ||||
| @@ -659,7 +659,7 @@ def influxdb_export(bucket, url=None, org=None, token=None, daemonize=True): | ||||
|         influxclient = InfluxDBClient.from_env_properties() | ||||
|     influxdb_write_snapshot(bucket, data) | ||||
|  | ||||
|     if (daemonize): | ||||
|     if daemonize: | ||||
|         while True: | ||||
|             # Delay, collect new data, and start again | ||||
|             time.sleep(DAEMON_UPDATE_PERIOD) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user