Widget für iOS

JSAnyone
Beiträge: 234
Registriert: Fr Jun 05, 2020 5:56 pm

Re: Widget für iOS

Beitrag von JSAnyone »

_daniel hat geschrieben: Fr Mai 28, 2021 7:13 pm Habe gerade noch einen Log gefunden, hier stehen alle Monatswerte (alle LPs einzeln und Summe...) drinnen - mit Überschrift ;)
...openWB/ramdisk/logaktmonthonl.csv
Das wäre wohl die einfachere Wahl gewesen, habe jetzt aber schon die Monats-CSV ausgewertet. War bloß noch nicht 100% zufrieden ;)
JSAnyone
Beiträge: 234
Registriert: Fr Jun 05, 2020 5:56 pm

Re: Widget für iOS

Beitrag von JSAnyone »

Ich habe den Widget-Code nun nochmal etwas aufgeräumt und folgendes neu implementiert:
- Die letzte Lademenge kann jetzt für LP1, LP2 oder beide summiert angezeigt werden
- Die Lademenge des aktuellen Monats kann jetzt für LP1, LP2 oder beide summiert angezeigt werden
- Die Farbmöglichkeiten für Rahmen und Graphen wurden vereinheitlich und vereinfacht, “gleiches” (z.B. Speicher SoC und Speicher Leistung) hat jetzt die gleiche Farbe. Die Farben von Graph und Rahmen können natürlich immer noch separat eingestellt werden
- LP2 ist jetzt gleichwertig mit LP1, es gibt z.B. jetzt einen Hintergrundgraphen für Leistung und SoC von LP2 usw.
- Die SmartHome 2.0 Geräte unterstützen jetzt bei Bedarf Hintergrundgraphen

Bei der Datenquelle bin ich dann doch noch bei den alten Monats-CSV geblieben (statt den neuen mit Header von okaegi), damit niemand wegen dem Widget auf eine OpenWB-Beta/Nightly updaten muss. Außerdem würde sowieso noch die alte Tages-CSV benötigt werden, da die erstmal nicht erneuert wird.

Wie immer konnte ich nicht alle Funktionen zu 100% testen, meldet euch also gerne, wenn etwas nicht wie erwartet funktioniert oder wenn ihr sonst noch Wünsche oder Anregungen habt!

Das Widget ist mit aktualisierter Anleitung jetzt hier unter Gist-GitHub verfügbar:
Code: https://gist.github.com/JSAnyone/74edf5 ... 87f63c1a70
Anleitung: https://gist.github.com/JSAnyone/74edf5 ... nt-3730115

Das Importieren in Scriptable ist zwar immer noch etwas umständlich, es ist denke ich aber einfacher als das nervige Ändern der Endung, was ja immer am PC/Mac gemacht werden musste. So geht zumindest alles direkt am iPhone/iPad.

In eigener Sache:
Ich habe mittlerweile doch ziemlich viel Zeit in dieses Widget gesteckt, auch wenn das sicherlich auch daran lag, das meine Programmierkenntnisse noch relativ „primitiv“ waren/sind. Nachdem hier aber doch viele Leute zufrieden mit dem Widget sind und es nützlich finden, wäre die Frage, inwiefern ihr „bereit“ wärt mir dafür eine Kleinigkeit zu spenden, z.B. über PayPal.
Es soll sich aber natürlich auch niemand dazu verpflichtet fühlen, deswegen wollte ich erstmal nachfragen wie ihr so dazu steht.
Dass das Widget aber grundsätzlich für alle kostenlos bleibt ist natürlich klar, das ist ja das schöne an open-source Projekten wie OpenWB.
LocutusB
Beiträge: 119
Registriert: So Dez 02, 2018 2:12 pm

Re: Widget für iOS

Beitrag von LocutusB »

Top Projekt, vielen Dank fürs Teilen. PN mir doch mal Deine PayPal Adresse.
Konfiguration: OpenWB auf Raspberry Pi 3 B+ an EVSE DIN ModBus, SDM120, 1-phasig max 20A, festes Kabel. BMW i3.
Smove
Beiträge: 209
Registriert: Mo Mär 09, 2020 8:56 pm

Re: Widget für iOS

Beitrag von Smove »

Stell doch einfach deine paypal- adresse rein, glaube der ein oder andere zufriedene Widget-User spendet da gerne. :x

Was mir eben aufgefallen ist:
717B36A6-7E0C-4221-8A73-FEA155FFE0AA.jpeg
Bei der Summation der Monatswerte LP1+2 stimmt der Wert um Faktor 1000 nicht.

grüße
Tobias
Fahrzeuge: VW eUP & div. Audi PHEVs
PV: 8,4kWp & 15,2kWp
WB: 2x openWB Series 2+ & 2x openWB Series 2
JSAnyone
Beiträge: 234
Registriert: Fr Jun 05, 2020 5:56 pm

Re: Widget für iOS

Beitrag von JSAnyone »

Smove hat geschrieben: Mi Jun 02, 2021 6:20 pm Stell doch einfach deine paypal- adresse rein, glaube der ein oder andere zufriedene Widget-User spendet da gerne.
Gute Idee, ich wollte das ganze nicht überstürzen.
Hier könnt ihr spenden: https://www.paypal.me/JulianSchmidt04
Ich würde mich freuen!
Smove hat geschrieben: Mi Jun 02, 2021 6:20 pm Bei der Summation der Monatswerte LP1+2 stimmt der Wert um Faktor 1000 nicht.
Jup, da habe ich eine Klammer vergessen. Sollte mit der neuen Version (auf Gist GitHub) passen.
Habe gerade bei dir auch gesehen, dass „Leistung“ ja nicht ganz hinpasst, ist jetzt zu „Leist.“ abgekürzt.
Bei dir ist die Überschrift auch nicht ganz mittig. Die ganzen Optionen für die Überschrift waren wohl nicht mehr wirklich aufeinander abgestimmt, jetzt sollte es besser sein.
Zuletzt geändert von JSAnyone am Do Jun 03, 2021 4:21 pm, insgesamt 1-mal geändert.
Smove
Beiträge: 209
Registriert: Mo Mär 09, 2020 8:56 pm

Re: Widget für iOS

Beitrag von Smove »

JSAnyone hat geschrieben: Do Jun 03, 2021 3:30 pm
Smove hat geschrieben: Mi Jun 02, 2021 6:20 pm Stell doch einfach deine paypal- adresse rein, glaube der ein oder andere zufriedene Widget-User spendet da gerne.
Gute Idee, ich wollte das ganze nicht überstürzen.
Hier könnt ihr spenden: https://www.paypal.com/donate?hosted_bu ... 3FYZP9N2RG
Ich würde mich freuen!
Smove hat geschrieben: Mi Jun 02, 2021 6:20 pm Bei der Summation der Monatswerte LP1+2 stimmt der Wert um Faktor 1000 nicht.
Jup, da habe ich eine Klammer vergessen. Sollte mit der neuen Version (auf Gist GitHub) passen.
Habe gerade bei dir auch gesehen, dass „Leistung“ ja nicht ganz hinpasst, ist jetzt zu „Leist.“ abgekürzt.
Bei dir ist die Überschrift auch nicht ganz mittig. Die ganzen Optionen für die Überschrift waren wohl nicht mehr wirklich aufeinander abgestimmt, jetzt sollte es besser sein.
Danke für die schnelle Korrektur!
Fahrzeuge: VW eUP & div. Audi PHEVs
PV: 8,4kWp & 15,2kWp
WB: 2x openWB Series 2+ & 2x openWB Series 2
_daniel
Beiträge: 17
Registriert: Fr Apr 09, 2021 6:03 pm

Re: Widget für iOS

Beitrag von _daniel »

JSAnyone hat geschrieben: Do Jun 03, 2021 3:30 pm Gute Idee, ich wollte das ganze nicht überstürzen.
Hier könnt ihr spenden: https://www.paypal.me/JulianSchmidt04
Viel Dank für deinen Fleiß, hoffe das funktioniert mit Version 2.0 dann noch :D
Ich würde mich den Unterstützern auch anschließen.
Hätte das selbst nicht hinbekommen, ich benötige schon viel Zeit für kleine Änderungen und Spielereien.

Hier ein paar kleine Erweiterungsvorschläge und Fragen:
  • Könnte man Profile anlegen? z.B. um für mehrere Widgets dasselbe Skript aufzurufen. z.B. mit der Parameterübergabe (args.widget.Parameter)
  • Bei den Farben wären Abhängigkeiten genial. D.h. kein statitschen Grenzen, sondern PV grün, wenn größer als Hausverbrauch und Laden...
  • Bringt es etwas Skriptteile zu überspringen, beipsielsweise wie bei dir mit monthlyused (csv Abfragen)? Oder ist das eher Kosmetik?
  • Man kann OpenWB über Safari im FullScreen öffnen (Anleitung von dir). Hast du eine Idee, um beim Klick auf das Widget die "App" statt den Standardbrowser zu öffnen?
  • Dank deinem CSV Zugriff, war es einfach ein paar Erweiterungen vorzunehmen. Ich hab das Skript um ein paar statistische Werte ergänzt. Die Anzeige mache ich in einem extra Widget (deswegen die Frage nach Profilen), damit es nicht zu übersichtlich wird (wie mit "widget.presentLage"). Anbei mal ein BIld wie es aussehen könnte und der Code dazu, falls du etwas aufgreifen willst. Muss sicherlich optimiert werden, war mehr für den Eigenbedarf mit dem Schwerpunkt: Funktion & Spielerei
Statistik_widgets.png
Hier im einzelnen: Belegung ergänzt und in 10er Schritten strukturiert:

Code: Alles auswählen

// ----Energie im aktuellen Monat-------------
let monthlyUsed = true;
// 50: PV Erzeugung
// 51: Einspeisung
// 52: Eigennutzung
// 53: Bezug
// 54: Lademenge
// 55: Hausverbrauch

// --- Energie heute ------
let dailyUsed = true;
// 60: PV Erzeugung
// 61: Einspeisung
// 62: Eigennutzung
// 63: Bezug
// 64: Lademenge
// 65: Hausverbrauch

// --- KPIs, Eigennutzungsquoten, Autarkiequote,  ------
// Monatsquoten
// 70: AQ Gesamt 
// 71: AQ Haus - ohne LPGesamt mit Annahme 100% PV geladen
// 72: EQ PV 

// Tagesquoten
// 80: AQ Gesamt
// 81: AQ Haus - ohne LPGesamt mit Annahme 100% PV geladen
// 82: EQ PV 
Parameterübergabe und am Titel getestet (sinnvoller wären Profile)

Code: Alles auswählen

let WidgetParameter = args.widgetParameter;
if (WidgetParameter == null){    //damit Widget-Runtime aus Scriptable App funktioniert und keinen Fehler ausgibt
  widgetTitle = "";
 }
else if (WidgetParameter != null){ 
  widgetTitle = WidgetParameter; //Titel im Widget
  logo =0; 
Variablen angelegt, damit die Werte einfacher unter Switch(panel) zu verarbeiten sind;

Code: Alles auswählen

let MonatsPV;
  let MonatsEinspeisung;
  let MonatsEigennutzung
  let MonatsBezug;
  let MonatsLPGesamt
  let MonatsHausverbrauch; 


  let TagesPV;
  let TagesEinspeisung;
  let TagesEigennutzung
  let TagesBezug;
  let TagesLPGesamt
  let TagesHausverbrauch;

//     Monatswerte holen
	if(monthlyUsed == true){
		MonatsPV = (Number(dataMonthly[dataMonthly.length-2]["PV"]) - Number(dataMonthly[0]["PV"]))/1000;
		MonatsEinspeisung = (Number(dataMonthly[dataMonthly.length-2]["Einspeisung"]) - Number(dataMonthly[0]["Einspeisung"]))/1000;
		MonatsBezug = (Number(dataMonthly[dataMonthly.length-2]["Bezug"]) - Number(dataMonthly[0]["Bezug"]))/1000;
		MonatsLPGesamt = (Number(dataMonthly[dataMonthly.length-2]["LPGesamt"]) - Number(dataMonthly[0]["LPGesamt"]))/1000;
		MonatsEigennutzung = MonatsPV  - MonatsEinspeisung;
		MonatsHausverbrauch = MonatsEigennutzung + MonatsBezug - MonatsLPGesamt;
	}    
  
// Tageswerte holen
	if(dailyUsed == true){
		TagesPV = (await getData("daily_pvkwhk")*1);
		TagesEinspeisung = (await getData("daily_einspeisungkwh")*1);
		TagesBezug = (await getData("daily_bezugkwh")*1);  
		TagesLPGesamt = (await getData("daily_llakwh")*1);
		TagesEigennutzung = round((TagesPV - TagesEinspeisung),2);  
		TagesHausverbrauch = round((TagesEigennutzung + TagesBezug - TagesLPGesamt), 2);
Panel Belegung ergänzt:

Code: Alles auswählen

 // Monatswerte   
 
    case 50:
      // PV Erzeugung im aktuellen Monat
      wert = Math.round(MonatsPV);
      value = wert.toString();
      valueColor = "";
      name = "PV";
      footnote = "kWh";
      borderColor = borderColorLP1;
      chart = 0;
      break; 
      
    case 51:
      // Einspeisung im aktuellen Monat
      wert = Math.round(MonatsEinspeisung);
      value = wert.toString();
      valueColor = "";
      name = "Einspeisung";
      footnote = "kWh";
      borderColor = borderColorLP1;
      chart = 0;
      break;       
    
    case 52:
      // PV Eigennutzung (Selbstentnahme) im aktuellen Monat
      wert = Math.round(MonatsEigennutzung);
      value = wert.toString();
      valueColor = "";
      name = "PV Eigennutzung";
      footnote = "kWh";
      borderColor = borderColorLP1;
      chart = 0;
      break;    
    
    case 53:
      // Energiebezug (EVU) im aktuellen Monat
      wert = Math.round(MonatsBezug);
      value = wert.toString();
      valueColor = "";
      name = "Bezug";
      footnote = "kWh";
      borderColor = borderColorLP1;
      chart = 0;
      break; 
      
    case 54:
      // Lademenge (alle Ladepunkte) im aktuellen Monat
      wert = Math.round(MonatsLPGesamt);
      value = wert.toString();
      valueColor = "";
      name = "Lademenge";
      footnote = "kWh";
      borderColor = borderColorLP1;
      chart = 0;
      break; 
    
    case 55:
      // Hausverbrauch im aktuellen Monat
      wert = Math.round(MonatsHausverbrauch);
      value = wert.toString();
      valueColor = "";
      name = "Hausverbrauch";
      footnote = "kWh";
      borderColor = borderColorLP1;
      chart = 0;
      break; 

// Tageswerte
    case 60:
      // PV Erzeugung heute
      wert = TagesPV;
      value = wert.toString();
      valueColor = "";
      name = "PV";
      footnote = "kWh";
      borderColor = borderColorLP1;
      chart = 0;
      break; 
      
    case 61:
      // Einspeisung heute
      wert = TagesEinspeisung;
      value = wert.toString();
      valueColor = "";
      name = "Einspeisung";
      footnote = "kWh";
      borderColor = borderColorLP1;
      chart = 0;
      break;       
 
     case 62:
      // PV Eigennutzing (Selbstentnahme) heute
      wert = TagesEigennutzung;
      value = wert.toString();
      valueColor = "";
      name = "PV Eigennutzung";
      footnote = "kWh";
      borderColor = borderColorLP1;
      chart = 0;
      break;       
    
    case 63:
      // Energiebezug (EVU) heute
      wert = TagesBezug;
      value = wert.toString();
      valueColor = "";
      name = "Bezug ";
      footnote = "kWh";
      borderColor = borderColorLP1;
      chart = 0;
      break; 
      
    case 64:
      // Lademenge (alle Ladepunkte) heute
      wert = TagesLPGesamt;
      value = wert.toString();
      valueColor = "";
      name = "Lademenge";
      footnote = "kWh";
      borderColor = borderColorLP1;
      chart = 0;
      break; 
    
    case 65:
      // Hausverbrauch heute
      wert = TagesHausverbrauch;
      value = wert.toString();
      valueColor = "";
      name = "Hausverbrauch";
      footnote = "kWh";
      borderColor = borderColorLP1;
      chart = 0;
      break; 

// KPIs ... Nutzungsquoten ... runden für Ganzzahlen

    case 70:
      // Monats AQ Gesamt - Annahme LPGesamt 100% aus PV 
      wert = Math.round(100 - MonatsBezug / (MonatsHausverbrauch + MonatsLPGesamt) * 100);
      value = wert.toString() + "%";
      valueColor = "";
      name = "AQ";
      footnote = "Gesamt";
      borderColor = borderColorLP1;
      chart = 0;
      break; 
  
    case 71:
      // Monats AQ Haus 
      wert = Math.round(100 - MonatsBezug /  MonatsHausverbrauch * 100);
      value = wert.toString() + "%";
      valueColor = "";
      name = "AQ";
      footnote = "Haus";
      borderColor = borderColorLP1;
      chart = 0;
      break; 
	  
    case 72:
      // Monats EQ: PV Eigennutzung zu Erzeugung
      wert = Math.round(MonatsEigennutzung / MonatsPV * 100);
      value = wert.toString() + "%";
      valueColor = "";
      name = "EQ";
      footnote = "PV";
      borderColor = borderColorLP1;
      chart = 0;
      break; 
      
case 80:
      // AQ Gesamt heute
      wert = Math.round(100 - TagesBezug / (TagesHausverbrauch + TagesLPGesamt) *100);
      value = wert.toString() + "%";
      valueColor = "";
      name = "AQ";
      footnote = "Gesamt";
      borderColor = borderColorLP1;
      chart = 0;
      break; 
  
    case 81:
      //  AQ Haus ohne Auto heute; Annahme 100%PV Laden
      wert = Math.round(100 - TagesBezug / TagesHausverbrauch *100);
      value = wert.toString() + "%";
      valueColor = "";
      name = "AQ"; 
      footnote = " Haus";
      borderColor = borderColorLP1;
      chart = 0;
      break; 
	  
    case 82:
      //  EQ:  PV Eigennutzung zu Erzeugung heute
      wert = Math.round(TagesEigennutzung / TagesPV *100);
      value = wert.toString() + "%";
      valueColor = "";
      name = "EQ";
      footnote = "PV";
      borderColor = borderColorLP1;
      chart = 0;
      break; 
Rundunsfunktion damit die Zahlen besser in die Widget passen:

Code: Alles auswählen

// Runden auf Dezimalstellen, siehe: https://www.ramschkasten.de/javascript-round-runden-dezimalstellen/2016/04/01/
function round(value, decimals) {
        return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
    }
    
JSAnyone
Beiträge: 234
Registriert: Fr Jun 05, 2020 5:56 pm

Re: Widget für iOS

Beitrag von JSAnyone »

_daniel hat geschrieben: Do Jun 10, 2021 3:33 pm Viel Dank für deinen Fleiß, hoffe das funktioniert mit Version 2.0 dann noch
Gerne! Zu 2.0:
LutzB hat ja schon mal angekündigt, dass es die Ramdisk in 2.0, zumindest so wie sie aktuell ist, nicht mehr geben wird. Einfach so weiterlaufen wird es also nicht. MQTT kann Scriptable leider nicht bis jetzt, aber vielleicht tut sich da ja was. Die nicht mehr weiterentwickelte HTTP-API liefert viel zu wenig Daten. Im letzten Notfall müsste ich halt selbst noch ein kleines Skript basteln, das einfach die fürs Widget benötigten Daten von MQTT geh holt und per HTTP bereitstellt. Ich denke dass das OpenWB-Team einen solchen PR mergen würde.

_daniel hat geschrieben: Do Jun 10, 2021 3:33 pm Könnte man Profile anlegen? z.B. um für mehrere Widgets dasselbe Skript aufzurufen. z.B. mit der Parameterübergabe (args.widget.Parameter)
Klar das wäre möglich. Aber wo liegt der Vorteil gegenüber das Skript einfach mehrmals in Scriptable abzuspeichern?
_daniel hat geschrieben: Do Jun 10, 2021 3:33 pm Bei den Farben wären Abhängigkeiten genial. D.h. kein statitschen Grenzen, sondern PV grün, wenn größer als Hausverbrauch und Laden...
Das klingt interessant, da überleg ich mir mal was.
_daniel hat geschrieben: Do Jun 10, 2021 3:33 pm Bringt es etwas Skriptteile zu überspringen, beipsielsweise wie bei dir mit monthlyused (csv Abfragen)? Oder ist das eher Kosmetik?
Allgemein bringt das nichts. Bei MonthlyUsed oder aber auch bei den Ramdisk-Abfragen in der Switch-Case werden aber HTTP-Requests ausgeführt, die brauchen schon etwas Zeit und Datenlast, gerade die CSVs können ja richtig groß werden. Auch sind manche Werte in der Ramdisk nur vorhanden, wenn diese Einstellung konfiguriert wurde. Wenn das Widget also z.B. immer Awwater Abfragen würde (nicht nur dann wenn es im Widget verwendet wird) würde es bei Leuten ohne Awattar wahrscheinlich zu Fehlern kommen, weil die Datei nicht vorhanden ist. Awattar nur als Beispiel, ich weis nicht ob es da so ist.
Aber aktuelle bin ich auch nicht glücklich, weil für doppelt benötigte Werte doch zwei HTTP-Requests ausgeführt werden. Das muss ich noch ändern.
_daniel hat geschrieben: Do Jun 10, 2021 3:33 pm Man kann OpenWB über Safari im FullScreen öffnen (Anleitung von dir). Hast du eine Idee, um beim Klick auf das Widget die "App" statt den Standardbrowser zu öffnen?
Dafür bräuchte die Verknüpfung ein URL-Schema:
https://ios.gadgethacks.com/how-to/alwa ... s-0184033/
Habe dazu aber leider nichts gefunden.
_daniel hat geschrieben: Do Jun 10, 2021 3:33 pm Dank deinem CSV Zugriff, war es einfach ein paar Erweiterungen vorzunehmen. Ich hab das Skript um ein paar statistische Werte ergänzt. Die Anzeige mache ich in einem extra Widget (deswegen die Frage nach Profilen), damit es nicht zu übersichtlich wird (wie mit "widget.presentLage"). Anbei mal ein BIld wie es aussehen könnte und der Code dazu, falls du etwas aufgreifen willst. Muss sicherlich optimiert werden, war mehr für den Eigenbedarf mit dem Schwerpunkt: Funktion & Spielerei
Super, drei einzelne Widgets sehen definitiv viel übersichtlicher aus als ein großes.
Dein Code mit den statischen Werten sieht gut aus, das werde ich etwas angepasst auf jeden Fall übernehmen!
_daniel
Beiträge: 17
Registriert: Fr Apr 09, 2021 6:03 pm

Re: Widget für iOS

Beitrag von _daniel »

Top. Mal gespannt was im Sommer kommt.
Wenn die Titelzeile und die Werte (vll. mehrdimensionale Objekte) abhängig vom Profil (Tag, Monat, Monitoring) wären, ist es „einfacher“ alles in einem Skript zu haben.
Vorteil, man muss nur ein Skript parametrieren (Panels) und warten (Änderungen).
Die Frage ist eher, ob es den Aufwand wert ist…
Antworten