forked from rockus/VE.direct-OSX-Linux
-
Notifications
You must be signed in to change notification settings - Fork 0
/
get_pannel_data.py
133 lines (105 loc) · 4.35 KB
/
get_pannel_data.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import subprocess
import json
import re
class NoUSBDeviceFoundError(Exception):
pass
"""
def find_tty_usb_device_id_lsusb():
try:
# Use lsusb to list connected USB devices
lsusb_output = subprocess.check_output(["lsusb"], stderr=subprocess.STDOUT, text=True)
# Search for the USB device with FTDI ID
pattern = r"ID\s+(\w+:\w+)\s+Future Technology Devices International"
match = re.search(pattern, lsusb_output)
if match:
device_id = match.group(1)
return device_id
else:
raise NoUSBDeviceFoundError("No USB device related to FTDI found in lsusb output.")
except subprocess.CalledProcessError as e:
print("Error running lsusb:", e.output)
return None
"""
def find_tty_usb_device_id_dmesg():
command = "sudo dmesg | grep tty"
output = subprocess.check_output(command, shell=True, stderr=subprocess.STDOUT, text=True)
# Adjusted pattern to match either "attached to" or "disconnected from"
pattern = r"usb \d-\d+\.\d+:\sFTDI USB Serial Device converter (now attached to|now disconnected from) (ttyUSB\d+)"
matches = re.findall(pattern, output)
if matches:
attached_devices = [device_id for action, device_id in matches if action == "now attached to"]
if attached_devices:
device_id = attached_devices[-1] # Take the last attached device (most recent)
return device_id
else:
print("No USB devices attached.")
return None
else:
print("USB device not found in dmesg output.")
return None
def find_tty_usb_device_id():
"""
# Try find_tty_usb_device_id_lsusb
try:
device_id = find_tty_usb_device_id_lsusb()
return device_id
except NoUSBDeviceFoundError:
pass
"""
# Try find_tty_usb_device_id_dmesg
try:
device_id = find_tty_usb_device_id_dmesg()
return device_id
except NoUSBDeviceFoundError:
pass
# Return None if no USB device is found
return None
def scan_charge_controller():
device_id = find_tty_usb_device_id()
if device_id is None:
raise Exception("Didn't find the device - please check if it's connected and please check the device ID")
command = "sudo ./mpptemoncms/mpptemoncms -c mppt_config.conf -d /dev/" + device_id
output_bytes = subprocess.check_output(command, shell=True, stderr=subprocess.STDOUT)
try:
output = output_bytes.decode('utf-8')
except UnicodeDecodeError:
output = output_bytes.decode('latin-1') # Use 'latin-1' as a more permissive encoding
marker = "GET /input/post.json"
json_start = output.find(marker)
if json_start != -1:
json_start = output.find("{", json_start)
json_end = output.find("}", json_start) + 1
json_data = output[json_start:json_end]
json_data = re.sub(r'(\w+):', r'"\1":', json_data)
parsed_json = json.loads(json_data)
# Extract data into a more descriptive dictionary with formatting
data = {
"panel_voltage": "{:.3f}".format(parsed_json.get("vpv")),
"panel_power": parsed_json.get("ppv"),
"battery_voltage": "{:.3f}".format(parsed_json.get("v")),
"battery_current": "{:.3f}".format(parsed_json.get("i")),
"battery_yield_total": "{:.2f}".format(parsed_json.get("yt")),
"battery_yield_today": "{:.2f}".format(parsed_json.get("yd")),
"battery_yield_yesterday": "{:.2f}".format(parsed_json.get("yy")),
"max_power_today": parsed_json.get("mpd"),
"max_power_yesterday": parsed_json.get("mpy"),
"charger_status": parsed_json.get("cs")
}
return data
else:
print("JSON data not found in output.")
return None
def check_voltage(charge_controller):
panel_data = charge_controller
battery_voltage_str = panel_data["battery_voltage"]
try:
battery_voltage = float(battery_voltage_str)
return battery_voltage
except ValueError:
print("Error converting battery voltage to numeric value:", battery_voltage_str)
return 0.0 # Return a default value (you can adjust this as needed)
# charge_controller_data = scan_charge_controller()
"""
if charge_controller_data:
print(json.dumps(charge_controller_data, indent=2))
"""