summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeny Sorokin <me@ch1p.io>2024-01-17 03:35:59 +0300
committerEvgeny Sorokin <me@ch1p.io>2024-01-17 03:35:59 +0300
commita9a241ad19449c29b68cd4a5b539bcbec816e341 (patch)
tree2ebfc73b206e4cec30fd94613bd6bf42ef5b269d
parent8a89dd77be03ca8eb9cdc378ba8e912292494fa9 (diff)
lws: pump page rewritten to python
-rw-r--r--bin/web_kbn.py29
-rw-r--r--include/py/homekit/util.py5
-rw-r--r--localwebsite/classes/GPIORelaydClient.php18
-rw-r--r--localwebsite/classes/InverterdClient.php69
-rw-r--r--localwebsite/handlers/MiscHandler.php42
-rw-r--r--localwebsite/htdocs/index.php2
-rw-r--r--web/kbn_templates/pump.j2 (renamed from localwebsite/templates-web/pump.twig)16
7 files changed, 38 insertions, 143 deletions
diff --git a/bin/web_kbn.py b/bin/web_kbn.py
index d9d0035..09fa9c6 100644
--- a/bin/web_kbn.py
+++ b/bin/web_kbn.py
@@ -14,6 +14,7 @@ from homekit.config import config, AppConfigUnit
from homekit.util import homekit_path, filesize_fmt, seconds_to_human_readable_string
from homekit.modem import E3372, ModemsConfig, MacroNetWorkType
from homekit.inverter.config import InverterdConfig
+from homekit.relay.sunxi_h3_client import RelayClient
from homekit import http
@@ -24,7 +25,8 @@ class WebKbnConfig(AppConfigUnit):
def schema(cls) -> Optional[dict]:
return {
'listen_addr': cls._addr_schema(required=True),
- 'assets_public_path': {'type': 'string'}
+ 'assets_public_path': {'type': 'string'},
+ 'pump_addr': cls._addr_schema(required=True),
}
@@ -91,6 +93,13 @@ def get_modem_data(modem_cfg: dict, get_raw=False) -> Union[dict, tuple]:
}
+def get_pump_client() -> RelayClient:
+ addr = config.app_config['pump_addr']
+ cl = RelayClient(host=addr.host, port=addr.port)
+ cl.connect()
+ return cl
+
+
def get_inverter_client() -> inverterd.Client:
cl = inverterd.Client(host=InverterdConfig()['remote_addr'].host)
cl.connect()
@@ -180,6 +189,7 @@ class WebSite(http.HTTPServer):
self.get('/inverter.cgi', self.inverter)
self.get('/inverter.ajx', self.inverter_ajx)
+ self.get('/pump.cgi', self.pump)
async def render_page(self,
req: http.Request,
@@ -263,6 +273,23 @@ class WebSite(http.HTTPServer):
status, rated, html = await asyncio.get_event_loop().run_in_executor(None, get_inverter_data)
return self.ok({'html': html})
+ async def pump(self, req: http.Request):
+ # TODO
+ # these are blocking calls
+ # should be rewritten using aio
+
+ cl = get_pump_client()
+
+ action = req.query.get('set', None)
+ if action in ('on', 'off'):
+ getattr(cl, action)()
+ raise HTTPFound('/pump.cgi')
+
+ status = cl.status()
+ return await self.render_page(req, 'pump',
+ title='Насос',
+ context=dict(status=status))
+
if __name__ == '__main__':
config.load_app(WebKbnConfig)
diff --git a/include/py/homekit/util.py b/include/py/homekit/util.py
index f267488..78a78a0 100644
--- a/include/py/homekit/util.py
+++ b/include/py/homekit/util.py
@@ -12,7 +12,7 @@ import re
import os
from enum import Enum
-from datetime import datetime, timedelta
+from datetime import datetime
from typing import Optional, List
from zlib import adler32
@@ -256,8 +256,7 @@ def filesize_fmt(num, suffix="B") -> str:
def seconds_to_human_readable_string(seconds: int) -> str:
- duration = timedelta(seconds=seconds)
- days, remainder = divmod(duration.total_seconds(), 86400)
+ days, remainder = divmod(seconds, 86400)
hours, remainder = divmod(remainder, 3600)
minutes, seconds = divmod(remainder, 60)
diff --git a/localwebsite/classes/GPIORelaydClient.php b/localwebsite/classes/GPIORelaydClient.php
deleted file mode 100644
index 89c8dc9..0000000
--- a/localwebsite/classes/GPIORelaydClient.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-class GPIORelaydClient extends MySimpleSocketClient {
-
- const STATUS_ON = 'on';
- const STATUS_OFF = 'off';
-
- public function setStatus(string $status) {
- $this->send($status);
- return $this->recv();
- }
-
- public function getStatus() {
- $this->send('get');
- return $this->recv();
- }
-
-} \ No newline at end of file
diff --git a/localwebsite/classes/InverterdClient.php b/localwebsite/classes/InverterdClient.php
deleted file mode 100644
index b68b784..0000000
--- a/localwebsite/classes/InverterdClient.php
+++ /dev/null
@@ -1,69 +0,0 @@
-<?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
diff --git a/localwebsite/handlers/MiscHandler.php b/localwebsite/handlers/MiscHandler.php
index 4c5a25e..efaca22 100644
--- a/localwebsite/handlers/MiscHandler.php
+++ b/localwebsite/handlers/MiscHandler.php
@@ -3,17 +3,6 @@
class MiscHandler extends RequestHandler
{
- public function GET_main() {
- global $config;
- $this->tpl->set_title('Главная');
- $this->tpl->set([
- 'grafana_sensors_url' => $config['grafana_sensors_url'],
- 'grafana_inverter_url' => $config['grafana_inverter_url'],
- 'cameras' => $config['cam_list']['labels']
- ]);
- $this->tpl->render_page('index.twig');
- }
-
public function GET_sensors_page() {
global $config;
@@ -30,29 +19,6 @@ class MiscHandler extends RequestHandler
$this->tpl->render_page('sensors.twig');
}
- public function GET_pump_page() {
- global $config;
-
- if (isset($_GET['alt']) && $_GET['alt'] == 1)
- $config['pump_host'] = '192.168.5.223';
-
- list($set) = $this->input('set');
- $client = new GPIORelaydClient($config['pump_host'], $config['pump_port']);
-
- if ($set == GPIORelaydClient::STATUS_ON || $set == GPIORelaydClient::STATUS_OFF) {
- $client->setStatus($set);
- redirect('/pump/');
- }
-
- $status = $client->getStatus();
-
- $this->tpl->set([
- 'status' => $status
- ]);
- $this->tpl->set_title('Насос');
- $this->tpl->render_page('pump.twig');
- }
-
public function GET_cams() {
global $config;
@@ -160,12 +126,4 @@ class MiscHandler extends RequestHandler
}
}
- public function GET_debug() {
- print_r($_SERVER);
- }
-
- public function GET_phpinfo() {
- phpinfo();
- }
-
}
diff --git a/localwebsite/htdocs/index.php b/localwebsite/htdocs/index.php
index eeeaacb..cd32132 100644
--- a/localwebsite/htdocs/index.php
+++ b/localwebsite/htdocs/index.php
@@ -18,8 +18,6 @@ $router->add('inverter/set-osp/', 'Inverter set_osp');
// misc
$router->add('/', 'Misc main');
$router->add('sensors/', 'Misc sensors_page');
-$router->add('pump/', 'Misc pump_page');
-$router->add('phpinfo/', 'Misc phpinfo');
$router->add('cams/', 'Misc cams');
$router->add('cams/([\d,]+)/', 'Misc cams id=$(1)');
$router->add('cams/stat/', 'Misc cams_stat');
diff --git a/localwebsite/templates-web/pump.twig b/web/kbn_templates/pump.j2
index 3bce0e2..28d5c9d 100644
--- a/localwebsite/templates-web/pump.twig
+++ b/web/kbn_templates/pump.j2
@@ -1,11 +1,10 @@
-{% include 'bc.twig' with {
- history: [
- {text: "Насос" }
- ]
-} %}
+{% extends "base.j2" %}
-<form action="/pump/" method="get">
- <input type="hidden" name="set" value="{{ status == 'on' ? 'off' : 'on' }}" />
+{% block content %}
+{{ breadcrumbs([{'text': 'Насос'}]) }}
+
+<form action="/pump.cgi" method="get">
+ <input type="hidden" name="set" value="{{ 'off' if status == 'on' else 'on' }}" />
Сейчас насос
{% if status == 'on' %}
<span class="text-success"><b>включен</b></span>.<br><br>
@@ -14,4 +13,5 @@
<span class="text-danger"><b>выключен</b></span>.<br><br>
<button type="submit" class="btn btn-primary">Включить</button>
{% endif %}
-</form> \ No newline at end of file
+</form>
+{% endblock %}