summaryrefslogtreecommitdiff
path: root/localwebsite/classes/InverterdClient.php
diff options
context:
space:
mode:
Diffstat (limited to 'localwebsite/classes/InverterdClient.php')
-rw-r--r--localwebsite/classes/InverterdClient.php69
1 files changed, 69 insertions, 0 deletions
diff --git a/localwebsite/classes/InverterdClient.php b/localwebsite/classes/InverterdClient.php
new file mode 100644
index 0000000..b68b784
--- /dev/null
+++ b/localwebsite/classes/InverterdClient.php
@@ -0,0 +1,69 @@
+<?php
+
+class InverterdClient extends MySimpleSocketClient {
+
+ /**
+ * @throws Exception
+ */
+ public function setProtocol(int $v): string
+ {
+ $this->send("v $v");
+ return $this->recv();
+ }
+
+ /**
+ * @throws Exception
+ */
+ public function setFormat(string $fmt): string
+ {
+ $this->send("format $fmt");
+ return $this->recv();
+ }
+
+ /**
+ * @throws Exception
+ */
+ public function exec(string $command, array $arguments = []): string
+ {
+ $buf = "exec $command";
+ if (!empty($arguments)) {
+ foreach ($arguments as $arg)
+ $buf .= " $arg";
+ }
+ $this->send($buf);
+ return $this->recv();
+ }
+
+ /**
+ * @throws Exception
+ */
+ public function recv()
+ {
+ $recv_buf = '';
+ $buf = '';
+
+ while (true) {
+ $result = socket_recv($this->sock, $recv_buf, 1024, 0);
+ if ($result === false)
+ throw new Exception(__METHOD__ . ": socket_recv() failed: " . $this->getSocketError());
+
+ // peer disconnected
+ if ($result === 0)
+ break;
+
+ $buf .= $recv_buf;
+ if (endsWith($buf, "\r\n\r\n"))
+ break;
+ }
+
+ $response = explode("\r\n", $buf);
+ $status = array_shift($response);
+ if (!in_array($status, ['ok', 'err']))
+ throw new Exception(__METHOD__.': unexpected status ('.$status.')');
+ if ($status == 'err')
+ throw new Exception(empty($response) ? 'unknown inverterd error' : $response[0]);
+
+ return trim(implode("\r\n", $response));
+ }
+
+} \ No newline at end of file