FTUI Widget um Akku-Status vom Tablet an FHEM zu übermitteln

Begonnen von AGi2019, 13 Dezember 2022, 18:18:37

Vorheriges Thema - Nächstes Thema

AGi2019

Hallo FTUI Cracks,

ich suche nach einer Möglichkeit, den Akku-Status vom Tablet an FHEM zu senden.

mit der Java-Skript Funktion:

<script>
navigator.getBattery().then(function(battery) {
var level = battery.level;
console.log(level);
});
</script>


kann ich mir den Wert in der Console(Browser) ausgeben lassen.

Nur habe ich keine Ahnung, wie ich diesen Wert zu FHEM in mein DUMMY Device bringen kann.

Vielleicht könnt ihr helfen?

mr_petz

#1
Hi,
die Funktion finde ich nicht schlecht.
Ich habe die mal für FTUI3 erstellt:

<script type="text/javascript">
  document.onreadystatechange = () => {
   if (document.readyState === 'complete') {
      this.label = document.querySelector('#battery');
      getBatteryLevel();
      setInterval(()=>getBatteryLevel(),60000);
    }
  };
function getBatteryLevel() {
  navigator.getBattery().then(battery => {
   const level = battery.level;
   this.label.textContent = 'Akkustand: ' + level*100 + '%';
    if (battery.chargingTime !== 0 && battery.charging === true) {
      this.label.textContent += ' ⚡';
    }
    if (battery.dischargingTime > 0 && battery.charging === false && battery.dischargingTime.toString() !== 'Infinity') {
      this.label.textContent += ' Restzeit: ' + Math.floor(battery.dischargingTime / 3600 ) + 'h ' + Math.floor( (battery.dischargingTime % 3600) / 60 ) + 'min';
    }
   //ftuiApp.fhemService.sendCommand('setreading Device Reading ' + level*100 + '%'); //Backslash´s vor ftuiApp entfernen und Device+Reading anpassen wenn benötigt.
   //ftuiApp.toast('setreading Device Reading ' + level*100 + '%'); //Backslash´s vor ftuiApp entfernen und Device+Reading anpassen wenn benötigt.
  });
};
</script>
<ftui-label id="battery"></ftui-label>


Hier in meinem Bsp. für FTUI3 wird erst gewartet bis die Seite fertig geladen ist und dann ruft ein einminütiger Interval die function getBatteryLevel() auf. Darin wird wenn gewünscht ein toast angezeigt oder es an fhem gesendet...
Im ftui-label wird es dann auch angezeigt...

Im FTUI2 könnte das funktionieren:

<script type="text/javascript">
  document.onreadystatechange = () => {
    if (document.readyState === 'complete') {
      getBatteryLevel();
      setInterval(()=>getBatteryLevel(),60000);
    }
  };
function getBatteryLevel() {
  navigator.getBattery().then(battery => {
   const level = battery.level;
   ftui.sendFhemCommand('setreading Device Reading ' + level*100 + '%');
   ftui.toast('setreading Device Reading ' + level*100 + '%');
  });
};
</script>

Hier ohne label. Ob noch {} innerhalb des ftui.sendFhemCommand() sein muss, musst du testen... (hier ungetestet)
Und Device+Reading anpassen...
level geht bei mir von 0.xx bis 1.
Deswegen *100
Klar, man könnte die Funktion erweitern für nur wenn sich der Status ändert, aber dazu braucht man trotzdem den interval oder muss es per button oder was auch immer aufrufen...

LG mr_petz

Edit: erste Anweisung geändert und Restzeit hinzugefügt...
Hinweis: Unter Browser FF und Safari funktioniert navigator.getBattery() nicht!

AGi2019

#2
Hallo mr_petz,
das ist viel mehr, als ich erwartet habe.
Vielen Dank für Deine Mühe.

Ich werde es zwischen den Tagen ausprobieren und dann berichten oder weitere  Fragen stellen  ;)

Ulm32b

Mit der Vollversion des Fully-Browsers kann man diverse Systemdaten via FHEM auslesen, unter anderem den Akku-Stand.
Damit schalte ich (unter Verwendung von Shelly- Plug) den Ladestrom ein/aus.

mr_petz

@Ulm32b

Da hast du natürlich Recht.
Bei WallPanel und Fully kann man per MQTT die Daten holen und sogar setzen.
Ich habe z.Bsp. eine WordClock als Screensaver in FTUI3 eingebunden und wenn die Uhr aktiv ist, setze ich die Brightness runter...
Durch den Motionsensor wird die Uhr wieder deaktiviert und Brightness  hoch gesetzt...
Bild der Uhr mal angehangen.

LG mr_petz

AGi2019


!!! Rückmeldung !!!

So, nun habe ich endlich Zeit gefunden, es in FTUI2 zu implementieren.
Es funktioniert super  :D

Der Wert wird jede Minute übertragen. Voraussetung ist, dass das Tablet eingeschaltet ist und FTUI sichtbar.
MeinTablet schalte ich von FHEM ein, wenn Bewegung im Flur ist (Ikea Bewegungsmelder). Zum Aktivieren des Tablet habe ich die WOLi APP (Android) installiert. Das Tablet deaktiviert sich nach 2 Minuten wieder von selbst.
Sollte längere Zeit keine Bewegung im Flur sein, schlate ich alle 12h das Tablet von FHEM ein. Mit dem Einschalten wird dann der Akku-Stand an Fhem übermittelt und ich kann ggf. die Ladesteckdose einschalten.



andreas_r

@mr_petz: wie hast Du die Wordclock eingebunden? Gibt es das schon als fertiges Control?

VG, Andreas

mr_petz

@andreas_r

Nein. das must du extra einbinden. Uhr stammt von hier:
https://github.com/Snapstromegon/wordclock

Ich habe mir die Uhr noch bisschen angepasst.
Bei bedarf poste ich es. Macht aber nur als Screensaver sinn...

LG

Ulm32b

#8
Falls jemand alternative Ansätze für einen Bildschirmschoner sucht: Meiner ist minimalistisch und bewusst ohne Animation: Das Hintergrundbild ist aus einem dem eigenem Umfeld entstammenden Foto abgeleitet (Bildbearbeitung Relief, sehr dunkel), hier im unteren Bereich verschwommen dargestellt. Oben werden sehr groß Uhrzeit und Temperatur gezeigt.

Implementiert ist das über Fully (Vollversion). Dort kann man für den Screensaver eine URL angeben, dies ist hier eine ganz einfache FTUI-Seite, der Hintergrund ist über css definiert, Codes s.u.
Ein- und Ausschalten des Screensavers wird in Fully verwaltet: über Bewegungs- und Geräuscherkennung, natürlich auch durch Antippen des Bildschirms.
Das funktioniert zuverlässig seit 4 Jahren.

<html>
<head>
    <link rel="stylesheet" href="css/fhem-tablet-ui.css" />
<link rel="stylesheet" href="css/Layout_idle.css" />
<script src="js/fhem-tablet-ui.js" defer></script>
</head>
<body>
<div class="col-1-2 top-align left-align gigantic thin" data-type="label" data-device="WetterProplanta" data-get="temperature" data-fix="0" data-unit="°C" data-color="#555555"></div>
<div class="col-1-2 top-align right-align gigantic thin" data-type="clock" data-format="G:i" style="color: #555555"></div>
</body>
</html>


Style Sheet Layout_idle.css:
/* Hintergrundbild Bildschirmschoner */
  body {
    background-image: url(../images/xxx.jpg) !important;
    background-repeat: no-repeat;
    background-position: right top;
    background-attachment: fixed;
}