Das Widget von meteoblue war ein fremdes Dokument im iframe: es passte farblich nicht, liess sich nicht aendern, wurde auf schmalen Schirmen als Ganzes heruntergerechnet und konnte die eigenen Messwerte nicht zeigen. Genau das kann das neue Modul - links vom Jetzt-Strich steht, was die Wetterstation gemessen hat, rechts die Vorhersage. Aufgebaut wie die uebrigen Anzeige-Module: meteogrammKatalog.js sagt, WAS gezeigt wird, meteogramm.js nur, WIE. Der Renderer kennt kein Feld und keine Spur beim Namen. Eine weitere Spur ist damit ein Objekt im Katalog und keine Codeaenderung. Ein einziges SVG ueber alle drei Felder, damit Zeitachse, Nachtstreifen, Jetzt-Linie und Zeiger nur einmal existieren und ueberall gleich sitzen. Zwei Entscheidungen, die man sonst sucht: Das Wolkenband zeichnet je Schicht ein Rechteck mit waagerechtem Farbverlauf. Ein Rechteck je Stunde war der erste Versuch und sah aus wie Fernsehrauschen - zweihundert harte Kanten nebeneinander. Open-Meteo kennt ohnehin nur drei Schichten statt eines Hoehenprofils. Die Strahlung teilt sich das Feld mit der Temperatur, statt ein viertes zu bekommen: gleicher Tagesrhythmus, gleiche Nacht-Schattierung, und ein viertes Feld machte das Ganze am Handy hoeher als das externe Widget. Die alte Einbindung bleibt vorerst und ist umschaltbar. mountMeteogram() laeuft jetzt erst beim Umschalten - wer meteoblue nie ansieht, laedt es auch nicht mehr. Die Karte heisst "Wetter" statt "Forecast": darunter steht bereits eine zweite Karte dieses Namens. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
152 lines
7.7 KiB
PHP
152 lines
7.7 KiB
PHP
<?php
|
|
require_once("helper.php");
|
|
|
|
if (isset($_GET["addUser"])) {
|
|
if (checkAdduser($_GET["addUser"])) {
|
|
echo <<<ENDE
|
|
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>Smarthome control</title>
|
|
<link rel="icon" type="image/png" href="assets/img/favicon.png">
|
|
<!--end::Accessibility Meta Tags-->
|
|
|
|
<!--begin::Primary Meta Tags-->
|
|
<meta name="title" content="Smarthome control" />
|
|
<meta name="author" content="ColorlibHQ" />
|
|
<meta name="description" content="Smarthome control panel by m0." />
|
|
<meta name="keywords" content="smarthome dashboard, admin panel" />
|
|
<!--end::Primary Meta Tags-->
|
|
|
|
<!--begin::Fonts-->
|
|
<link rel="stylesheet" href="assets/fonts/font_poppins.css" media="print" onload="this.media='all'" />
|
|
<!--end::Fonts-->
|
|
|
|
<!--begin::Third Party Plugin(Bootstrap Icons)-->
|
|
<link rel="stylesheet" href="css/bootstrap-icons.min.css" />
|
|
<!--end::Third Party Plugin(Bootstrap Icons)-->
|
|
|
|
<!--begin::Required Plugin(AdminLTE)-->
|
|
<link rel="stylesheet" href="./css/adminlte.min.css?v=2" />
|
|
<!--end::Required Plugin(AdminLTE)-->
|
|
|
|
|
|
</head>
|
|
<body onload="createRegistration()">
|
|
</body>
|
|
<script src="js/auth.js"></script>
|
|
<script>
|
|
async function createRegistration() {
|
|
try {
|
|
// check browser support
|
|
if (!window.fetch || !navigator.credentials || !navigator.credentials.create) {
|
|
throw new Error('Browser not supported.');
|
|
}
|
|
let keyName = encodeURIComponent(prompt('Bitte Hier den Namen des Schlüssels eingeben:'));
|
|
// get create args
|
|
let rep = await window.fetch('authServer.php?fn=getCreateArgs', {method:'GET', cache:'no-cache'});
|
|
//alert(await rep.text());
|
|
const createArgs = await rep.json();
|
|
// error handling
|
|
if (createArgs.success === false) {
|
|
throw new Error(createArgs.msg || 'unknown error occured');
|
|
}
|
|
|
|
// replace binary base64 data with ArrayBuffer. a other way to do this
|
|
// is the reviver function of JSON.parse()
|
|
recursiveBase64StrToArrayBuffer(createArgs);
|
|
|
|
// create credentials
|
|
const cred = await navigator.credentials.create(createArgs);
|
|
|
|
// create object
|
|
const authenticatorAttestationResponse = {
|
|
transports: cred.response.getTransports ? cred.response.getTransports() : null,
|
|
clientDataJSON: cred.response.clientDataJSON ? arrayBufferToBase64(cred.response.clientDataJSON) : null,
|
|
attestationObject: cred.response.attestationObject ? arrayBufferToBase64(cred.response.attestationObject) : null
|
|
};
|
|
|
|
// check auth on server side
|
|
rep = await window.fetch('authServer.php?fn=processCreate&name='+keyName, {
|
|
method : 'POST',
|
|
body : JSON.stringify(authenticatorAttestationResponse),
|
|
cache : 'no-cache'
|
|
});
|
|
authenticatorAttestationServerResponse = await rep.json();
|
|
// prompt server response
|
|
if (authenticatorAttestationServerResponse.success) {
|
|
window.alert(authenticatorAttestationServerResponse.msg || 'registration success');
|
|
if(!authenticatorAttestationServerResponse.msg){
|
|
window.location.href = "https://nas.el-wa.org/smart";
|
|
}
|
|
|
|
} else {
|
|
throw new Error(authenticatorAttestationServerResponse.msg);
|
|
}
|
|
|
|
} catch (err) {
|
|
window.alert(err.message || 'unknown error occured');
|
|
}
|
|
}
|
|
</script>
|
|
</html>
|
|
ENDE;
|
|
}
|
|
} else if (checkLogin()) {
|
|
/*
|
|
* Seitentabelle: Vorlage, Seitenskripte und welche Bibliotheken die Seite
|
|
* ueberhaupt braucht. Frueher wurden Chart.js, MQTT & Co. auf jeder Seite
|
|
* geladen - die Home-Seite etwa zeichnet gar keine Diagramme.
|
|
*/
|
|
$pages = [
|
|
"solar" => ["template" => "solar.php", "mqtt" => true, "charts" => true, "meteogram" => true, "leaflet" => false,
|
|
"scripts" => ["js/solar/jahresstatistik.js", "js/solar/anlageKatalog.js", "js/solar/anlage.js", "js/solar/speicher.js",
|
|
"js/solar/meteogrammKatalog.js", "js/solar/meteogramm.js",
|
|
"js/solar/energieflussKatalog.js", "js/solar/energiefluss.js", "js/solar/bewaesserungAnzeige.js", "js/solar/ladefenster.js", "js/solar/bedienfenster.js", "js/solar/solarMQTT.js"]],
|
|
"home" => ["template" => "home.php", "mqtt" => true, "charts" => false, "meteogram" => false, "leaflet" => false,
|
|
"scripts" => ["js/solar/autoActionFuncs.js", "js/solar/zeitleiste.js", "js/solar/raumfenster.js", "js/solar/homeMQTT.js"]],
|
|
"heat" => ["template" => "heat.php", "mqtt" => true, "charts" => true, "meteogram" => false, "leaflet" => false,
|
|
"scripts" => ["js/solar/heatMQTT.js"]],
|
|
"history" => ["template" => "history.php", "mqtt" => false, "charts" => true, "meteogram" => false, "leaflet" => false,
|
|
"scripts" => ["js/solar/jahresstatistik.js", "js/solar/historyMQTT.js"]],
|
|
"skoda" => ["template" => "skoda.php", "mqtt" => true, "charts" => true, "meteogram" => false, "leaflet" => true,
|
|
"scripts" => ["js/solar/skodaMQTT.js"]],
|
|
"weather" => ["template" => "weather.php", "mqtt" => true, "charts" => false, "meteogram" => true, "leaflet" => false,
|
|
"scripts" => ["js/solar/weatherMQTT.js"]],
|
|
"settings" => ["template" => "settings.php", "mqtt" => false, "charts" => false, "meteogram" => false, "leaflet" => false,
|
|
"scripts" => ["js/solar/settings.js", "js/solar/grundriss.js",
|
|
"js/solar/anlageKatalog.js", "js/solar/energieflussKatalog.js",
|
|
"js/solar/energiefluss.js", "js/solar/energieflussEinstellungen.js",
|
|
"js/solar/benachrichtigungen.js"]],
|
|
"logs" => ["template" => "logs.php", "mqtt" => false, "charts" => false, "meteogram" => false, "leaflet" => false,
|
|
"scripts" => ["js/solar/logs.js"]],
|
|
"einfuehrung" => ["template" => "einfuehrung.php", "mqtt" => false, "charts" => false, "meteogram" => false, "leaflet" => false,
|
|
"scripts" => ["js/solar/einfuehrung.js"]],
|
|
];
|
|
// Anzeige für ein festes Display (Raspberry Pi, 800 x 480): die Solar-Seite
|
|
// ohne Kopfleiste und Menue, mit schmaler Leiste - header.php und
|
|
// footer.php richten sich nach "anzeige", js/solar/anzeige.js macht den Rest.
|
|
$pages["anzeige"] = $pages["solar"];
|
|
$pages["anzeige"]["anzeige"] = true;
|
|
$pages["anzeige"]["scripts"][] = "js/solar/anzeige.js";
|
|
|
|
// Unbekannte oder fehlende Aktion faellt auf die Solar-Seite zurueck.
|
|
if (!isset($_GET["action"]) || !isset($pages[$_GET["action"]])) {
|
|
$_GET["action"] = "solar";
|
|
}
|
|
$page = $pages[$_GET["action"]];
|
|
|
|
include "restricted/header.php";
|
|
include "restricted/" . $page["template"];
|
|
include "restricted/footer.php";
|
|
} else {
|
|
echo <<<ENDE
|
|
<html>
|
|
<head><link rel="icon" type="image/png" href="assets/img/favicon.png"></head>
|
|
<body onload="checkRegistration()">
|
|
<script src="js/auth.js"></script>
|
|
</body>
|
|
</html>
|
|
ENDE;
|
|
}
|