Ankündigung

Einklappen
Keine Ankündigung bisher.

(openHAB) Welche Werte speichern, um später schöne Plots zu haben?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    (openHAB) Welche Werte speichern, um später schöne Plots zu haben?

    Hallo,

    mich treibt um wie ich am besten meine (Verbrauchs-)Werte speichern soll um diese sinnvoll in Plots darzustellen.

    Es geht mir dabei vorallem um den Stromverbrauch des gesamten Hauses, der Wärmepumpe und der erzeugte Strom der PV-Anlage.

    Hier mal was später dabei rauskommen soll:
    1. schöne Kurven des Momentanverbrauchs/-erzeugung
    2. Balken des Tagesverbrauchs/-erzeugung bzw. Wochen/Monat/Jahr

    Für 1. stellt das mMn kein Problem dar, einfach den Wert bei jedem Update speichern.
    Für 2. bin ich mir unsicher... kann man die Werte im Nachgang direkt in der smartVISU berechnen oder muss ich z.B. den Tageswert täglich um (kurz vor) 24 Uhr speichern?

    Wie macht ihr das?

    Achja, mein Backend ist mittlerweile openHAB falls das wichtig ist...
    cu Yfkt5A
    DALI(ABB DG/S1.1), KODI Odroid, TrueNAS, Zehnder ComfoAir 200 L Luxe
    microk8s-Cluster: HomeAssistant, MusicAssistant, mosquitto, TVHeadend, jellyfin

    #2
    In der Visu können nur vorhandene Daten aus der Datenbank angefordert werden. Die Daten werden unverändert an die Grafik weiter geleitet. Berechnungen können nicht durchgeführt werden.

    Die Datenbank kann lediglich über die Modi (avg, minmax…) angewiesen werden, bestimmte Werte vor der Ausgabe zu aggregieren. Das passiert im Backend. Soweit ich im Treiber sehen konnte, unterstützt openHAB diese Modi allerdings nicht. D.h. Du musst die Werte selbst aggregieren und exakt so liefern, wie sie angezeigt werden sollen.

    Gruß
    Wolfram
    Zuletzt geändert von wvhn; 08.11.2023, 19:26.

    Kommentar


      #3
      Danke wvhn für deine Antwort.

      Ist es dann möglich von einem Item immer nur den Höchstwert pro Tag/Woche/Monat/Jahr anzeigen zu lassen, so dass man z.B. einen Plot mit Balken mit dem Höchstwert erstellen kann wobei der aktuelle Tag/Monat/Jahr noch "wächst"? ...oder muss dafür der Höchstwert kurz vor Ablauf in ein eigenes Item gespeichert werden?

      Wenn das möglich ist wäre in Beispiel super
      cu Yfkt5A
      DALI(ABB DG/S1.1), KODI Odroid, TrueNAS, Zehnder ComfoAir 200 L Luxe
      microk8s-Cluster: HomeAssistant, MusicAssistant, mosquitto, TVHeadend, jellyfin

      Kommentar


        #4
        Für schöne Graphen/Dashboards würde ich grafana und influxdb nutzen. Ich habe keine Ahnung von OpenHab aber google liefert Anleitungen zum Einbinden.

        https://smarthome-training.com/de/op...konfiguration/

        Es gibt zahlreiche andere Videos/Anleitung wie man min/max usw mit grafana und influxdb darstellen kann.

        Kommentar


          #5
          android danke für den Hinweis...

          Grafana ist bestimmt toll, aber ich würde die Plots schon gerne in der smartVISU haben und nicht eine extra Oberfläche dafür verwenden wollen.
          cu Yfkt5A
          DALI(ABB DG/S1.1), KODI Odroid, TrueNAS, Zehnder ComfoAir 200 L Luxe
          microk8s-Cluster: HomeAssistant, MusicAssistant, mosquitto, TVHeadend, jellyfin

          Kommentar


            #6
            Zitat von Yfkt5A Beitrag anzeigen
            Danke [USER="34334"]...von einem Item immer nur den Höchstwert pro Tag/Woche/Monat/Jahr anzeigen zu lassen
            Ich bekomm das einfach nicht hin... mein Item startet jeden Tag bei 0 und wächst dann bis Sonneruntergang an (Produktion meines BKW)

            sieht dann in openHAB so aus:
            grafik.png

            Nun möchte ich aber nur den jeweiligen Tageshöchstwert in der smartVISU als Balken darstellen, hier mein Versuch
            dazu habe ich das columnstack-Beispiel von https://docu.smartvisu.de/3.3/index....et_plot.period möglichst wenig modifiziert, daher sind auch noch die beiden anderen Items die ich garnicht habe vorhanden:

            Code:
             [COLOR=#d4d4d4]{{ plot.period('AhoyDTU_Inv1_YieldDay', ['AhoyDTU_Inv1_YieldDay', 'bath_plot2', 'bath_plot3'], 'max', '10d', '', '', '', 10, '', ['#aa0', '#a00', '#00a'], ['column', 'column', 'column'],'','','','','','','','',['normal', 'normal'],['0','0','1'], 2) }}[/COLOR]
             
            ​
            grafik.png

            Weiß echt nicht weiter und bin für jede Hilfe dankbar
            cu Yfkt5A
            DALI(ABB DG/S1.1), KODI Odroid, TrueNAS, Zehnder ComfoAir 200 L Luxe
            microk8s-Cluster: HomeAssistant, MusicAssistant, mosquitto, TVHeadend, jellyfin

            Kommentar


              #7
              Wie gesagt: smartViSU stellt exakt die Daten in der Grafik dar, die vom Backend angeliefert werden. Dabei spielt es keine Rolle, welche Diagrammart Du wählst. Du kannst also nicht einfach die gleiche Zeitreihe wie in openHAB verwenden, um tägliche Maxima darzustellen.

              Aus meiner Sicht gibt es zwei Lösungsmöglichkeiten:
              1. Du erzeugst ein eigenes Serien-item, in das Du jeweils den Maximalwert eines Tages schreibst und plottest das als Diagramm
              2. Jemand baut in openHAB die Datenbank-Modi nach, die auch smarthomeNG und fhem verwenden. Das geht mittels SQL-Abfragen. Darin werden alle Werte in Intervallen gruppiert, die von der Gesamtlänge des Plots geteilt durch die Anzahl der Punkte („count“) definiert werden. Auf diese Gruppen können dann per SQL die Aggregatsfunktionen wie min, max, avg … angewendet werden. Dann muss die Auswahl der Modi auf Seite von openHAB auf der Schnittstelle bereitgestellt werden.
              Wie man das macht, müsste eher das openHAB-Forum beantworten können. Ich kann dann helfen, den Treiber in smartVISU zu erweitern.

              Gruß
              Wolfram
              Zuletzt geändert von wvhn; 11.11.2023, 18:14.

              Kommentar


                #8
                Zitat von wvhn Beitrag anzeigen
                1. Du erzeugst ein eigenes Serien-item, in das Du jeweils den Maximalwert eines Tages schreibst und plottest das als Diagramm
                Dann werd ich mich mal daran versuchen eine rule zu schreiben die das macht. Zumindest als workaround
                Zitat von wvhn Beitrag anzeigen
                1. Jemand baut in openHAB die Datenbank-Modi nach, die auch smarthomeNG und fhem verwenden. Das geht mittels SQL-Abfragen. Darin werden alle Werte in Intervallen gruppiert, die von der Gesamtlänge des Plots geteilt durch die Anzahl der Punkte („count“) definiert werden. Auf diese Gruppen können dann per SQL die Aggregatsfunktionen wie min, max, avg … angewendet werden. Dann muss die Auswahl der Modi auf Seite von openHAB auf der Schnittstelle bereitgestellt werden.
                Wie man das macht, müsste eher das openHAB-Forum beantworten können. Ich kann dann helfen, den Treiber in smartVISU zu erweitern.
                Das wäre natürlich wünschenswert wenn das openHAB-Backend dieselben Daten liefert wie die Anderen. Da muss ich mal wieder den udo1toni dazuholen, evtl. kann der da was machen oder kennt die richtigen Leute?


                PS: Würde mein plot.period von oben mit einem anderen Backend funktionieren?
                Code:
                {{ plot.period('AhoyDTU_Inv1_YieldDay', ['AhoyDTU_Inv1_YieldDay', 'bath_plot2', 'bath_plot3'], 'max', '10d', '', '', '', 10, '', ['#aa0', '#a00', '#00a'], ['column', 'column', 'column'],'','','','','','','','',['normal', 'normal'],['0','0','1'], 2) }}
                cu Yfkt5A
                DALI(ABB DG/S1.1), KODI Odroid, TrueNAS, Zehnder ComfoAir 200 L Luxe
                microk8s-Cluster: HomeAssistant, MusicAssistant, mosquitto, TVHeadend, jellyfin

                Kommentar


                  #9
                  openHAB hat eine eigene Persistence (bzw. auch mehrere, wenn man sie konfiguriert). Die Charts in openHAB greifen immer auf die eigene Persistence zu.
                  Du kannst jederzeit den Maximalwert (genau wie Minimalwert, Durchschnitt, mittlere Abweichung, Summe oder auch Delta über eine Zeitspanne ausgeben lassen, das ist dann ein diskreter Wert.
                  Mit einer passenden Rule kann man sich auch entsprechende Charts zulegen, z.B. so:
                  grafik.png
                  Man kann ganz gut sehen, dass Minimum und Maximum im Tagesverlauf jeweils entsprechend korrigiert werden (der Peak der Minimaltemperatur am 13. rührt von einem Neustart...)
                  Die zugehörige Rule:
                  Code:
                  var nTempUpdate = 0
                  
                  rule "Update max and min temperatures"
                   when
                      Item Wetter_CurrTemperature changed or
                      Time cron "1 * * * * ?"
                   then
                      var Number nOld = null
                      var Number nNew = null
                      logDebug("Temperatur","previousState = {}", previousState)
                      logDebug("Temperatur","Wetter_CurrTemperature.state = {}", Wetter_CurrTemperature.state)
                      if (previousState instanceof Number) nOld = (previousState as Number).floatValue
                      if(newState instanceof Number)       nNew = (newState as Number).floatValue
                      if(nNew !== null && nOld !== null) {
                          var String strDir = "unk"
                          if (nOld < nNew)
                              strDir = "tieg"
                          logDebug("Temperatur","Temperatur ges{}en von {} auf {}",strDir,nOld,nNew)
                      }
                      if(nNew !== null)         Virtuelle_TempOut.postUpdate(nNew)
                      nTempUpdate = 0
                      tTempUpdate?.cancel
                      tTempUpdate = createTimer(now.plusSeconds(2), [ |
                          nTempUpdate += 1
                          switch(nTempUpdate) {
                              case 1: {
                                  Weather_Temp_Max.postUpdate(Virtuelle_TempOut.maximumSince(now.with(LocalTime.MIDNIGHT),"rrd4j").state as Number)
                                  Weather_Temp_Min.postUpdate(Virtuelle_TempOut.minimumSince(now.with(LocalTime.MIDNIGHT),"rrd4j").state as Number)
                                  val Zeit_Max = Virtuelle_TempOut.maximumSince(now.with(LocalTime.MIDNIGHT),"rrd4j").timestamp.toLocalDateTime
                                  val Zeit_Min = Virtuelle_TempOut.minimumSince(now.with(LocalTime.MIDNIGHT),"rrd4j").timestamp.toLocalDateTime
                                  logDebug("Temperatur","Maximum um {}, Minimum um {}",Zeit_Max,Zeit_Min)
                                  tTempUpdate.reschedule(now.plusSeconds(2))
                              }
                              case 2: {
                                  var String strMin = "- "+" °C; "
                                  var String strNow = "- "+" °C; "
                                  var String strMax = "- "+" °C"
                                  if(Weather_Temp_Min.state instanceof Number)  strMin = Weather_Temp_Min.state.format("%.1f") + " °C; "
                                  if(Virtuelle_TempOut.state instanceof Number) strNow = Virtuelle_TempOut.state.format("%.1f") + " °C; "
                                  if(Weather_Temp_Max.state instanceof Number)  strMax = Weather_Temp_Max.state.format("%.1f") + " °C"
                                  WeatherMinMax.postUpdate(strMin + strNow + strMax)
                                  tTempUpdate = null
                              }
                          }
                      ])
                  end​
                  Das meiste ist Code zum Debuggen
                  Der eigentliche Zauber geschieht im Timer. Weil ich damals spielen wollte, lade ich in einem ersten Schritt die Werte für Maximum und Minimum in die Persistence und lese diese Werte dann zwei Sekunden später wieder aus. Das ist unnötig umständlich, aber ich war bisher zu faul, das mal sauber zu programmieren, funktioniert ja...

                  Das Maximum lese ich hier:
                  Code:
                  Weather_Temp_Max.postUpdate(Virtuelle_TempOut.maximumSince(now.with(LocalTime.MIDNIGHT),"rrd4j").state as Number)​
                  Alles andere ist im Grunde nur Beiwerk...
                  Im Chart werden dann alle drei Items angezeigt, Wetter_CurrTemperature, Weather_Temp_Min und Weather_Temp_Max. Meist schaue ich aber auf das Item WeatherMinMax, welches mir diese Ausgabe liefert:
                  grafik.png

                  Kommentar


                    #10
                    udo1toni auch dir danke für deine -wie immer- umfangreiche Antwort, aber ich denke so war das garnicht gedacht, es geht hier ja darum die Graphen in der smartVISU darzustellen und das man die Daten von openHAB genauso über die Schnittstelle bekommt wie von den anderen Backends(z.B. SmarthomeNG, FHEM...)... evtl. kann ja wvhn noch was dazusagen oder ihr euch kurzschliessen...

                    Wäre wirklich toll wenn das funktionieren würde


                    Bis dahin bleibt mir nur der Workaround mit der Rule, dieser hat aber den Pferdefuss das ich den aktuellen Wert des Tages/Woche/Monats/Jahr nicht darstellen kann, da der Maxwert ja erst am Ende des Zeitraums berechnet werden kann... beim Tag mag das noch hinehmbar sein, aber bei den anderen wäre es schon nice wenn man den aktuellen anwachsenden Balken auch sehen würde

                    Wg. der Rule werde ich dann wohl noch einen eigenen Tread eröffnen wenn ich nicht weiter komme (wovon auszugehen ist )
                    cu Yfkt5A
                    DALI(ABB DG/S1.1), KODI Odroid, TrueNAS, Zehnder ComfoAir 200 L Luxe
                    microk8s-Cluster: HomeAssistant, MusicAssistant, mosquitto, TVHeadend, jellyfin

                    Kommentar


                      #11
                      Nach Rücksprache mit udo1toni und etwas Studium der openHAB Doku sehe ich keine Möglichkeit, hier eine allgemeingültige Lösung zu schaffen, wie in den anderen Backends. Grund sind die vielfältigen Konfigurationsmöglichkeiten für die Persistenzen in openHAB. Dort kann man offenbar sehr viel flexibler definieren, welche Daten zu welchen Zeitpunkten geschrieben werden und in welche Datenbank.

                      Der Anwender muss dann eben selbst dafür sorgen, dass die Persistenzen genau die Daten enthalten, die geplottet werden sollen. Das kann über rules gemacht werden, oder über die Konfiguration der Persistenzen und der Datenbank.

                      Ich werde das Thema deshalb nicht weiter verfolgen.

                      Gruß
                      Wolfram

                      Kommentar


                        #12
                        Erstmal danke dir wvhn und udo1toni für eure Bemühungen, auch wenn das Ergebnis nicht so ist wie gewünscht.

                        Bin nun wirklich ernsthaft, wie von udo1toni im anderen Thread angeregt, am überlegen auf ein anderes Backend zu wechseln, da selbst mit irgendwelche Klimmzügen das Ergebnis nie so wird wie gewünscht - zumindest bezogen auf den Plot mit Balken


                        Hab gestern schon mal kurz die Alternativen überflogen:

                        SmartHomeNG -> mir bis jetzt das sympathischte, aber mal checken ob ich da alles einbinden kann und leider (vermutlich) kleinere Community und damit Weiterentwicklung als bei anderen

                        FHEM -> sieht irgendwie altbacken aus

                        ioBroker -> hab da was von Cloud und Monetarisierung gelesen, will möglichst alles lokal und auch kein Abo

                        Gibts noch andere die ich aktuell nicht auf dem Schirm habe?
                        cu Yfkt5A
                        DALI(ABB DG/S1.1), KODI Odroid, TrueNAS, Zehnder ComfoAir 200 L Luxe
                        microk8s-Cluster: HomeAssistant, MusicAssistant, mosquitto, TVHeadend, jellyfin

                        Kommentar

                        Lädt...
                        X