Ankündigung

Einklappen
Keine Ankündigung bisher.

Stromverbrauch bzw. Laufzeit der Lampen mitschreiben

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

    Stromverbrauch bzw. Laufzeit der Lampen mitschreiben

    Hi,

    mir spukt da eine Idee im Kopf herum, von der ich aber nicht was ob, und wenn ja, wie sie umzusetzen ist.
    Folgende Idee:
    OpenHAB merkt sich, wie lange einzelne Schalter (ein Schalter pro Verbraucher (z.B. Esszimmerlicht) ) seit Beginn der Aufzeichnung insgesamt gelaufen sind, sodass man sich bei Bedarf eine Entsprechende Auswertung anzeigen lassen kann. Diese sollte dann folgendermaßen aussehen:
    Flurlicht 1:20 Std.
    Wohnzimmerlicht 10:30 Std.
    usw.
    Wenn man dann noch den Verbrauch der einzelnen Lampen bzw. Verbraucher irgendwo eintragen könnte, sodann man dann den Stromverbrauch berechnen kann, hätte man auch gleich eine Übersicht, an welchem Verbraucher es sich evtl. rentiert die jeweilige Lampe mit LED-Lampen auszutauschen usw.

    Hat jemand vielleicht schon so etwas umgesetzt?

    #2
    Hallo,

    an so etwas habe ich auch schon gedacht, aber leider noch nicht die Zeit gefunden dies umzusetzen.

    Eine Möglichkeit besteht darin, eine Regel mit cron zu erstellen, die z.B. jede Minute bzw. Sekunde aufgerufen wird und die gewünschten Lampen abgefragt und den jeweiligen Betriebsstundenzähler inkrementiert wird.

    Prinzip-Beisiel ():

    Code:
    var Number Zaehler_Flurlicht
    var Number Zaehler_Esszimmer
    
    rule Betriebsstundenzaehler
    when
      Time cron "0/1 * * * * ?" // Abfrage alle Sekunde oder "* 0/1 * * * ?" für Minuten 
    then
      if (Licht_UG_Esszimmer_Decke == ON) {
          Zaehler_Esszimmer=Zaehler_Esszimmer+1
          Betriebsstundenzaehler_esszimmer.postUpdate(Zaehler_Esszimmer)
      } 
      if (Licht_Flur_EG == ON) {
          Zaehler_Flurlicht=Zaehler_Flurlicht+1
          Betriebsstundenzaehler_Flurlicht.postUpdate(Zaehler_Flurlicht)
      }
    end
    Betriebsstundenzaehler_Flurlicht und Betriebsstundenzaehler_esszimmer sind Items um die Betriebszeit in Sekunden bzw. Minuten (abhängig in welchen Takt chron eingestellt ist) anzuzeigen.

    Das Beispiel habe ich nicht getestet!!!

    Deine Lösung bitte posten, damit andere dies übernehemen können.

    Ich hoffe ich konnte dir etwas weiterhelfen.


    Gruß
    mepi0011

    Kommentar


      #3
      Kurz zur Info: Wir hatten vor einer Weile ein Dropbox-Share eingerichtet, um nützliche Scripte und Beispiele teilen zu können - seht dazu https://groups.google.com/d/msg/open...k/aFAIL6liQTEJ.

      Schickt also einfach Thomas oder mir eine PM und wir teilen die Schreibrechte zu - nach dem Schneeballprinzip sollte es dann für alle einfach sein, dort (Schreib-)Zugriff zu erhalten.

      Kommentar


        #4
        Hi mepi,

        danke für deine Hilfe. Ich habe es noch nicht getestet,sieht soweit aber plausibel aus. Kannst du mir auch sagen, wie ich dann die Auswertung machen kann, bzw. wie ich mir das anzeigen lasse?
        Was ist, wenn ich den Rechner, auf dem OpenHAB läuft einmal neu starten muss, oder er wegen eines Stromausfalls einmal aus ist, läuft dann der Zähler nicht wieder bei 0 los?
        Wenn ja, gibt es eine Möglichkeit, den aktuellen Stand der Variablen irgendwie weg zu schreiben und beim Neustart von OpenHAB als Startwert auszulesen?

        Gruß Jan

        Kommentar


          #5
          Hi,

          wäre es hier nicht fast einfacher für gewisse Vertraucher - also in dem Fall alle Lampen/Lichter - einen Schaltaktor mit Strommessung zu nehmen?

          In diesem Zusammenhang würde mich auch gleich interessieren ob jemand mit so einem Aktor schon Erfahrung hat ;-)

          Gruß Andreas

          Kommentar


            #6
            Da Lampen üblicherweise immer den gleichen Stromwert haben (Dimmer mal ausgenommen), reicht es eigentlich, diesen einmal zu messen und sich (teure) Aktoren mit Strommessung zu sparen.

            Zudem bieten Dir viele Aktoren auch nur den aktuellen Stromwert (in (m)A), aber kein Integral über die Zeit (um zum Verbrauch zu gelangen). Dieses müsstest Du also weiterhin "extern" berechnen.

            Grüße,
            Kai

            Kommentar


              #7
              Hallo,

              den Ansatz einfach die Betriebsdauer der Lampen mit zu loggen finde ich völlig ausreichend. Was die Aktoren angeht, bin ich ein gebranntes Kind. Vor einiger Zeit habe ich mir teure Energieaktoren gekauft, die aber eine DPT verwenden die von Calimero nicht unterstützt wird und folglich von openHAB nicht verwendet werden können.


              siehe Eintrag: https://knx-user-forum.de/openhab/22...-13-010-a.html

              Zurück zum Thema:

              Nach einem Neustart sind die Daten leider weg, ob es eine Möglichkeit gibt die Daten in einer Datei zu speichern, kann ich dir leider nicht beantworten da ich leider auch noch nicht alle Möglichkeiten von openHAB kenne.

              Wenn ich es richtig gesehen habe gibt es auch ein MySQL Binding

              Gruß
              mepi

              Kommentar


                #8
                Achso, ich wusste jetz den Preisunterschied nicht auswendig... Und vor allem wenn die Daten nicht direkt genutzt werden können ist es was anderes.

                PS: Weis zufällig jemand ob sich eine solche Log-Datei mit Loxone realisieren lässt?

                Kommentar


                  #9
                  Zitat von mepi0011 Beitrag anzeigen
                  Vor einiger Zeit habe ich mir teure Energieaktoren gekauft, die aber eine DPT verwenden die von Calimero nicht unterstützt wird und folglich von openHAB nicht verwendet werden können.
                  richtig, dass ist BISHER so ... es spricht allerdings (außer der verfügbaren Freizeit) nichts dagegen, den weiteren DPTConverter unserer ohnehin schon gepatchten lib hinzuzufügen. Solltest Du die Quellen von Calimero haben, schau mal nach den DPTXlator-Klassen.

                  Zitat von mepi0011 Beitrag anzeigen
                  Nach einem Neustart sind die Daten leider weg, ob es eine Möglichkeit gibt die Daten in einer Datei zu speichern, kann ich dir leider nicht beantworten da ich leider auch noch nicht alle Möglichkeiten von openHAB kenne.
                  Für die Speicherung der Daten über den Neustart hinweg gibt es die sog. Persistence-Services (siehe: Persistence - openhab - Documentation of the persistence service in openHAB - empowering the smart home - Google Project Hosting). Für Deinen Fall scheint erstmal der db4o-Service der passende zu sein. Das Problem ist bei dem aktuell nur, dass die zugehörige Datendatei (db4o.store) stetig wächst. Du wirst in der Datei also auch noch Einträge von vor einem Jahr finden. Besser passen würden hier eigentlich der rrd4j-Service. Der kann allerdings (noch) nicht beauskunftet werden. Kai hat das Thema aber schon auf seiner Liste (siehe: Issue 165 - openhab - Make RRD4J persistence service queryable - empowering the smart home - Google Project Hosting).

                  Gruß,

                  Thomas E.-E.
                  Visualisierung, Rule/Logic-Engine, Integrationsplattform mit openhab (Supportforum)

                  Kommentar


                    #10
                    Hi,

                    Zitat von teichsta Beitrag anzeigen
                    es spricht allerdings (außer der verfügbaren Freizeit) nichts dagegen, den weiteren DPTConverter unserer ohnehin schon gepatchten lib hinzuzufügen. Solltest Du die Quellen von Calimero haben, schau mal nach den DPTXlator-Klassen
                    zur Info: wir haben soeben Calimero geforked (siehe: https://github.com/openhab/calimero) und unseren Code eingechecked. In den nächsten Tagen wird es auch einen DPTXlator für 14.* geben. Dann dürfte 13.* auch nicht mehr weit hin sein ...

                    Pull-Requests sind willkommen :-)

                    Gruß,

                    Thomas E.-E.
                    Visualisierung, Rule/Logic-Engine, Integrationsplattform mit openhab (Supportforum)

                    Kommentar


                      #11
                      Zitat von teichsta Beitrag anzeigen
                      Hi,



                      zur Info: wir haben soeben Calimero geforked (siehe: https://github.com/openhab/calimero) und unseren Code eingechecked. In den nächsten Tagen wird es auch einen DPTXlator für 14.* geben. Dann dürfte 13.* auch nicht mehr weit hin sein ...

                      Pull-Requests sind willkommen :-)

                      Gruß,

                      Thomas E.-E.
                      Das sind mal wirklich gute Nachrichten! vielen Dank an alle Beteiligten des Fork.

                      Kommentar


                        #12
                        Zitat von Jan0815 Beitrag anzeigen
                        Kannst du mir auch sagen, wie ich dann die Auswertung machen kann, bzw. wie ich mir das anzeigen lasse?
                        Was ist, wenn ich den Rechner, auf dem OpenHAB läuft einmal neu starten muss, oder er wegen eines Stromausfalls einmal aus ist, läuft dann der Zähler nicht wieder bei 0 los?
                        Wenn ja, gibt es eine Möglichkeit, den aktuellen Stand der Variablen irgendwie weg zu schreiben und beim Neustart von OpenHAB als Startwert auszulesen?

                        Gruß Jan
                        Hallo Jan,

                        den Betriebsstundenzähler habe ich nun etwas weiter entwickelt und deine Anmerkungen von oben implementiert (mit etwas Hilfe von Thomas E.-E. -- Danke!). Dabei bin ich wie folgt vorgeganen:

                        Folgendes Item habe ich angelegt:

                        Code:
                        Group Test                                         "Timer Test"
                        Switch Licht_UG_Esszimmer_Decke                 "Licht Esszimmer Decke"                (Test)
                        Switch Licht_UG_Esszimmer_Tisch                 "Licht Esszimmer Tisch"                (Test)
                        
                        Number Betriebsstundenzaehler_Esszimmer_Decke "Betriebsstundenzähler Decke [%d]"    (Test)  // kann aus der Gruppe Test entfallen bzw. ausgeblendet werden
                        Number Betriebsstundenzaehler_Esszimmer_Tisch "Betriebsstundenzähler Tisch [%d]"    (Test)   // kann aus der Gruppe Test entfallen bzw. ausgeblendet werden
                        
                        String Betriebsstunden_Esszimmer_Decke                    "Betriebsstungen Licht Decke [%s]"            (Test)
                        String Betriebsstunden_Esszimmer_Tisch                    "Betriebsstungen Licht Tisch [%s]"            (Test)
                        Die benötigten Regeln sehen wie folgt aus:

                        Code:
                        import org.openhab.core.library.types.*
                        
                        rule "Initialisiere Betriebsstundenzaehler"
                        when
                            System started
                        then
                            // sollte noch kein Default-Wert gesetzt sein, holen wir das hier einmalig 
                            // nach ... danach sollte der Wert aus db4o kommen!
                            if (Betriebsstundenzaehler_Esszimmer_Decke.state == Uninitialized) {
                                Betriebsstundenzaehler_Esszimmer_Decke.postUpdate(0)
                            }
                            if (Betriebsstundenzaehler_Esszimmer_Tisch.state == Uninitialized) {
                                Betriebsstundenzaehler_Esszimmer_Tisch.postUpdate(0)
                            }
                        end
                              
                        rule Betriebsstundenzaehler
                        when
                          Time cron "0/1 * * * * ?" // Abfrage alle Sekunde oder "* 0/1 * * * ?" für Minuten 
                        then
                          if (Licht_UG_Esszimmer_Decke.state == ON) {
                              //var int Zaehler_Esszimmer2 = (Betriebsstundenzaehler_esszimmer.state as DecimalType).intValue
                              var Number Zaehler = Betriebsstundenzaehler_Esszimmer_Decke.state as DecimalType
                                Zaehler = Zaehler + 1 
                              Betriebsstundenzaehler_Esszimmer_Decke.postUpdate(Zaehler)
                          }
                          if (Licht_UG_Esszimmer_Tisch.state == ON) {
                              //var int Zaehler_Esszimmer2 = (Betriebsstundenzaehler_esszimmer.state as DecimalType).intValue
                              var Number Zaehler = Betriebsstundenzaehler_Esszimmer_Tisch.state as DecimalType
                                Zaehler = Zaehler + 1 
                              Betriebsstundenzaehler_Esszimmer_Tisch.postUpdate(Zaehler)
                          } 
                        end
                        
                        rule Aktualisiere_Betriebsstunden_Anzeige
                        when
                            Time cron "0 * * * * ?"  // Update nach einer Minute
                        then
                            var String h
                            var Number H
                            var String m
                            var Number M
                            var String s
                            var Number S
                            /*berechne Stunden */
                            S = Betriebsstundenzaehler_Esszimmer_Decke.state as DecimalType
                            H = (S/3600).intValue
                            h = H.toString
                            S = S-H*3600        
                            /* berechne Minuten */
                            M = (S/60).intValue
                            if (M <=9) m = "0" + M.toString
                            else m = M.toString
                            
                            /* berechne sehunden */
                            S = S-M*60
                            if (S <=9) s = "0" + S.toString
                            else s = S.toString  
                            Betriebsstunden_Esszimmer_Decke.postUpdate(h+":"+m+":"+s)
                        
                            /* Tisch */
                            /*berechne Stunden */
                            S = Betriebsstundenzaehler_Esszimmer_Tisch.state as DecimalType
                            H = (S/3600).intValue
                            h = H.toString
                            S = S-H*3600       
                            /* berechne Minuten */
                            M = (S/60).intValue
                            if (M <=9) m = "0" + M.toString
                            else m = M.toString
                            
                            /* berechne sehunden */
                            S = S-M*60
                            if (S <=9) s = "0" + S.toString
                            else s = S.toString  
                            Betriebsstunden_Esszimmer_Tisch.postUpdate(h+":"+m+":"+s)
                        end
                        Nun noch das persistence.db4o Binding in das Verzeichnis addons kopieren und die Datei db4o.persist im Verzeichnis configurations/persistence mit folgendem Inhalt anlegen, dadurch werden die Daten dauerhaft gespeichern.

                        Code:
                        // persistence strategies have a name and a definition and are referred to in the "Items" section
                        Strategies {
                                everyHour : "0 0 * * * ?"
                                everyDay  : "0 0 0 * * ?"
                        
                                // if no strategy is specified for an item entry below, the default list will be used
                                default = everyChange
                        }
                        
                        /* 
                         * Each line in this section defines for which item(s) which strategy(ies) should be applied.
                         * You can list single items, use "*" for all items or "groupitem*" for all members of a group
                         * item (excl. the group item itself).
                         */
                        Items {
                                // persist all items once a day and on every change and restore them from the db at startup
                                Betriebsstundenzaehler_Esszimmer_Decke : strategy = everyHour, everyDay, restoreOnStartup
                                Betriebsstundenzaehler_Esszimmer_Tisch : strategy = everyHour, everyDay, restoreOnStartup
                                
                                // additionally, persist all temperature and weather values every hour
                        }
                        Bei einem Neustart werden die Daten wieder hergestellt, mit der Einschränkung dass bei einem Stromausfall evtl. die letzte Stunde fehlen könnte.

                        Sollte etwas unklar sein, dann einfach melden.

                        Gruß
                        mepi

                        PS: Die Regel zum umwandeln der Zahl in einen String geht bestimmt auch einfacher. Anregungen hierzu sind gerne willkommen.

                        Kommentar


                          #13
                          Hi Mepi,

                          danke für den Code.
                          Ich hab gestern auch noch etwas herum experimentiert und wollte gerade fragen, wie ich die Daten in ein Item schreibe, damit ich es mir anzeigen lassen kann, als ich gesehen habe, dass du schon geschrieben hast.
                          Da ich programmiertechnisch nicht so ganz auf der Höhe bin, bin ich für jeden Codeschnipsel dankbar.
                          Ich probiere es heute Abend gleich aus.

                          Gruß Jan

                          Kommentar


                            #14
                            Hi Mepi,

                            ich hab es gestern ausprobiert und zum Laufen bekommen. Es funktioniert!
                            Allerdings habe ich das Problem, dass nach einem Neustart ständig der KNX-Link verloren geht. Nach langem hin und her hat sich dann herausgestellt, dass das Problem behoben ist, wenn ich die db4o.persist wieder lösche und anschließend neu starte. Dann sind aber verständlicherweise die gespeicherten Werte wieder verloren.
                            Hat jemand eine Ahnung, wieso die KNX-Verbindung im Zusammenspiel mit der db4o.persist solche Probleme macht?

                            Gruß Jan

                            Kommentar


                              #15
                              Am besten startest Du mit start_debug.sh/bat und hängst uns mal die openhab.log an?
                              Visualisierung, Rule/Logic-Engine, Integrationsplattform mit openhab (Supportforum)

                              Kommentar

                              Lädt...
                              X