From 849ee289c2a0561b709f92f8cbbda00415c6caba Mon Sep 17 00:00:00 2001
From: ulrich
Date: Fri, 16 Apr 2021 08:10:03 +0000
Subject: [PATCH] Erste Fassung der Geraete-Liste zum Ein- und Ausschalten funktioniert
---
src/mediaz_de_DE.properties | 1
www/ui/data/tpl/geraet_schalt_liste.txt | 4
src/de/uhilger/mediaz/Server.java | 3 +
src/de/uhilger/mediaz/api/GeraetSteuerung.java | 115 ++++++++++++++++++++++++++++++++++++++
www/ui/js/app.js | 24 +++++++
5 files changed, 143 insertions(+), 4 deletions(-)
diff --git a/src/de/uhilger/mediaz/Server.java b/src/de/uhilger/mediaz/Server.java
index 2f71fc9..a3f1b1c 100644
--- a/src/de/uhilger/mediaz/Server.java
+++ b/src/de/uhilger/mediaz/Server.java
@@ -19,6 +19,7 @@
import com.sun.net.httpserver.HttpServer;
import de.uhilger.mediaz.api.FileHandler;
+import de.uhilger.mediaz.api.GeraetSteuerung;
import de.uhilger.mediaz.api.ListFileHandler;
import de.uhilger.mediaz.api.ListHandler;
import de.uhilger.mediaz.api.MediaSteuerung;
@@ -51,6 +52,7 @@
public static final String RB_WEBROOT = "webroot";
public static final String RB_STORE = "store";
public static final String RB_STRG = "strg";
+ public static final String RB_GSTRG = "gstrg";
public static final String RB_ALIST= "alist";
//public static final String RB_UI_ROOT = "uiroot";
public static final String RB_STOP_SERVER = "stopServer";
@@ -113,6 +115,7 @@
ablageorteEinklinken(server);
server.createContext(ctx + App.getRs(RB_STORE), new StorageHandler());
server.createContext(ctx + App.getRs(RB_STRG), new MediaSteuerung());
+ server.createContext(ctx + App.getRs(RB_GSTRG), new GeraetSteuerung());
server.createContext(ctx + App.getRs(RB_ALIST), new ListHandler());
server.createContext(ctx + App.getRs(RB_STOP_SERVER), new StopServerHandler());
server.setExecutor(Executors.newFixedThreadPool(20));
diff --git a/src/de/uhilger/mediaz/api/GeraetSteuerung.java b/src/de/uhilger/mediaz/api/GeraetSteuerung.java
new file mode 100644
index 0000000..dcd4bbf
--- /dev/null
+++ b/src/de/uhilger/mediaz/api/GeraetSteuerung.java
@@ -0,0 +1,115 @@
+/*
+ Mediazentrale - Personal Media Center
+ Copyright (C) 2021 Ulrich Hilger
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+package de.uhilger.mediaz.api;
+
+import com.sun.net.httpserver.HttpExchange;
+import de.uhilger.mediaz.App;
+import de.uhilger.mediaz.Server;
+import de.uhilger.mediaz.entity.Entity;
+import de.uhilger.mediaz.entity.Geraet;
+import de.uhilger.mediaz.store.FileStorage;
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Steuerung von Geraeten, also Ein- und Ausschalten sowie deren Status
+ * ermitteln
+ *
+ *
+ * HTTP GET /mz/api/gstrg/geraet/[name]/ein
+ * HTTP GET /mz/api/gstrg/geraet/[name]/aus
+ * HTTP GET /mz/api/gstrg/geraet/[name]/status
+ *
+ * @author Ulrich Hilger
+ */
+public class GeraetSteuerung extends AbstractHandler {
+
+ private static final Logger logger = Logger.getLogger(GeraetSteuerung.class.getName());
+
+ public static final String KMD_EIN = "ein";
+ public static final String KMD_AUS = "aus";
+ public static final String KMD_STATUS = "status";
+
+ @Override
+ protected String get(HttpExchange e) {
+ String response;
+ String path = e.getRequestURI().toString();
+ String[] elems = path.split(Server.SLASH);
+ FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
+ logger.fine(path);
+
+ String geraetName = elems[5];
+ String kommando = elems[6];
+
+ Entity entity = fs.read(FileStorage.ST_GERAET, geraetName);
+ if(entity instanceof Geraet) {
+ Geraet g = (Geraet) entity;
+ switch(kommando) {
+ case KMD_EIN:
+ String einschaltBefehl = g.getEinUrl();
+ response = senden(einschaltBefehl);
+ break;
+
+ case KMD_AUS:
+ String ausschaltBefehl = g.getAusUrl();
+ response = senden(ausschaltBefehl);
+ break;
+
+ case KMD_STATUS:
+ response = statusErmitteln();
+ break;
+
+ default:
+ response = "Ungueltiges Kommando,";
+ break;
+ }
+ } else {
+ response = "Geraet nicht gefunden.";
+ }
+
+ return response;
+ }
+
+ private String statusErmitteln() {
+ return "noch nicht fertig";
+ }
+
+ private String senden(String kommando) {
+ /*
+ TODO hier evtl. mit mehreren Versuchen ausgleichen,
+ dass ein einzelner Versuch nicht 'durchkommt'...
+ */
+ logger.info(kommando);
+ try {
+ HttpURLConnection conn = (HttpURLConnection) new URL(kommando).openConnection();
+ conn.setRequestMethod("GET");
+ conn.connect();
+ int status = conn.getResponseCode();
+ String msg = conn.getResponseMessage();
+ logger.log(Level.INFO, "Kommando {0} mit Status {1} {2} gesendet.", new Object[]{kommando, status, msg});
+ return msg;
+ } catch(IOException ex) {
+ logger.log(Level.INFO, ex.getMessage(), ex);
+ return ex.getLocalizedMessage();
+ }
+ }
+
+}
diff --git a/src/mediaz_de_DE.properties b/src/mediaz_de_DE.properties
index 255d04e..92154cf 100644
--- a/src/mediaz_de_DE.properties
+++ b/src/mediaz_de_DE.properties
@@ -18,6 +18,7 @@
store=/api/store
alist=/api/alist
strg=/api/strg
+gstrg=/api/gstrg
epliste=liste
stopServer=/api/server/stop
testAblage=/api/test/ablage
diff --git a/www/ui/data/tpl/geraet_schalt_liste.txt b/www/ui/data/tpl/geraet_schalt_liste.txt
index b5b3648..928924a 100644
--- a/www/ui/data/tpl/geraet_schalt_liste.txt
+++ b/www/ui/data/tpl/geraet_schalt_liste.txt
@@ -1,8 +1,8 @@
<div class='entity-formular'>
{{#ArrayList}}
<div class='geraet-schalt-eintrag'>
- <button class="button schalt-btn" id="ein-btn">Ein</button>
- <button class="button schalt-btn" id="aus-btn">Aus</button>
+ <button class="button schalt-btn" id="ein-btn" gname="{{.}}">Ein</button>
+ <button class="button schalt-btn" id="aus-btn" gname="{{.}}">Aus</button>
<div class='schalt-geraet-name entity-eintrag'>{{.}}</div>
</div>
{{/ArrayList}}
diff --git a/www/ui/js/app.js b/www/ui/js/app.js
index 1d00a77..98a5675 100644
--- a/www/ui/js/app.js
+++ b/www/ui/js/app.js
@@ -161,6 +161,21 @@
"self.form_geraet_status", function(responseText) {
var geraet = JSON.parse(responseText);
self.geraet_status_form(geraet);
+ }, function() {
+ self.addEvtListener('#ein-btn', 'click', function (event) {
+ var geraetName = event.target.attributes.gname.nodeValue;
+ //var geraetName = document.querySelector('.schalt-geraet-name').textContent;
+ self.http_get('../api/gstrg/geraet/' + geraetName + "/ein", function(responseText) {
+ console.log(responseText);
+ });
+ });
+ self.addEvtListener('#aus-btn', 'click', function (event) {
+ var geraetName = event.target.attributes.gname.nodeValue;
+ //var geraetName = document.querySelector('.schalt-geraet-name').textContent;
+ self.http_get('../api/gstrg/geraet/' + geraetName + "/aus", function(responseText) {
+ console.log(responseText);
+ });
+ });
});
};
@@ -493,7 +508,7 @@
* self.ablageort_form(ablageort);
* });
*/
- this.entitaet_liste = function(bname, listUrl, tpl, storeUrl, formFunc, cb) {
+ this.entitaet_liste = function(bname, listUrl, tpl, storeUrl, formFunc, cb, customListCode) {
self.reset_top_buttons();
document.querySelector('.bereich-name').textContent = bname;
var bb = document.querySelector('.breadcrumb-behaelter');
@@ -508,7 +523,12 @@
//self.addEvtListener('#neu-btn', 'click', function (event) {
self.addEvtListener('#top-neu-btn', 'click', function(event) {
eval(formFunc + "(this)");
- });
+ });
+ if(typeof(customListCode) !== 'function') {
+ // ..
+ } else {
+ customListCode();
+ }
});
});
};
--
Gitblit v1.9.3