aboutsummaryrefslogtreecommitdiff
path: root/inverterd/inverterd.py
diff options
context:
space:
mode:
Diffstat (limited to 'inverterd/inverterd.py')
-rw-r--r--inverterd/inverterd.py53
1 files changed, 53 insertions, 0 deletions
diff --git a/inverterd/inverterd.py b/inverterd/inverterd.py
new file mode 100644
index 0000000..9f07c2e
--- /dev/null
+++ b/inverterd/inverterd.py
@@ -0,0 +1,53 @@
+import socket
+
+from enum import Enum
+
+
+class Format(Enum):
+ JSON = 'json'
+ TABLE = 'table'
+ SIMPLE_TABLE = 'simple-table'
+
+
+class Client:
+ def __init__(self, port=8305, host='127.0.0.1'):
+ self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ self.sock.connect((host, port))
+
+ def _write(self, line):
+ self.sock.sendall((line+'\r\n').encode())
+
+ def _read(self):
+ buf = bytearray()
+ while True:
+ buf.extend(self.sock.recv(256))
+ if b'\r\n\r\n' in buf:
+ break
+
+ response = buf.decode().strip().split("\r\n")
+ status = response.pop(0)
+ if status not in ('ok', 'err'):
+ raise InverterError(f"Unexpected status '{status}'")
+
+ if status == 'err':
+ raise InverterError(response[0] if len(response) >= 0 else "Unknown error")
+
+ return '\r\n'.join(response)
+
+ def protocol(self, v):
+ self._write(f'v {v}')
+ return self._read()
+
+ def format(self, format):
+ self._write(f'format {format}')
+ return self._read()
+
+ def exec(self, command, arguments=()):
+ buf = f'exec {command}'
+ for arg in arguments:
+ buf += f' {arg}'
+ self._write(buf)
+ return self._read()
+
+
+class InverterError(RuntimeError): pass \ No newline at end of file