Ankündigung

Einklappen
Keine Ankündigung bisher.

Item für Wert über/unterschreiten und Zeitkomponente

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

    Item für Wert über/unterschreiten und Zeitkomponente

    Moin zusammen,
    ich habe schonmal ein wenig hier gesucht und auch etwas gefunden, was aber sehr alt war und irgendwie nicht funktioniert.
    Der Hauszähler gibt bei mir allerlei Werte aus, unter anderem auch die ins Netz eingespeiste Leistung.
    Code:
    p_m_total_w:
        visu_acl: ro
        type: num
        knx_dpt: 14
        knx_listen: 3/6/105
        database: init
        influxdb: 'true'
    Nun hätte ich gern ein weiteres Item, was True wird, wenn das Item da oben für 5 Minuten > 3500 ist.
    In Logic kann ich das, aber als Item sollte das doch auch gehen.
    Gern kann es auch ein Item sein, welches True wird, wenn 5 Min > 3500 oder 5 Minuten < 2500 ist
    Ich möchte damit Spüler und WaMa abhängig vom PV Ertrag steuern.

    Danke
    Matthias
    Zuletzt geändert von bmx; 17.03.2023, 15:19.
    Derzeit zwischen Kistenauspacken und Garten anlegen.
    Baublog im Profil.

    #2
    Mir würden auch Hinweise reichen. Bin ich der Einzige, der sowas braucht oder hab ich die Bestpractise überlesen ?
    Derzeit zwischen Kistenauspacken und Garten anlegen.
    Baublog im Profil.

    Kommentar


      #3
      Wie sieht deine Logik aus? Kannst die nicht 1:1 in ein eval packen?

      Kommentar


        #4
        Hallo,

        vielleicht liegt hier ein XY Problem vor?
        https://de.wikipedia.org/wiki/XY-Problem

        Wenn das so ist, wäre vielleicht das Forecastsolar Plugin etwas für Dich!
        Was nützt es, wenn die Erzeugung von 12-12:15 über 3.5kW ist...

        Aber zu deinem Problem:
        Ich würde ein Item machen, welches sich nach 5 min per Autotimer auf null setzt.
        Dieses würde ich von meinem p_m_total_w auf 1 setzten lassen (on change). Der Wert wird sich doch regelmäßig ändern. Sonst kannst du den natürlich auch per cycle triggern.

        Gruß,
        Hendrik

        Kommentar


          #5
          Zitat von greentux Beitrag anzeigen
          Nun hätte ich gern ein weiteres Item, was True wird, wenn das Item da oben für 5 Minuten > 3500 ist.
          In Logic kann ich das, aber als Item sollte das doch auch gehen.
          Gern kann es auch ein Item sein, welches True wird, wenn 5 Min > 3500 oder
          Ich habe mich daran auch mal versucht, weil das mit KNX-Boardmitteln und dem DT-Aktor nicht optimal lief. Aber auch mit SmartHomeNG lief das nicht so, wie ich das wollte bzw. es war einfach zu kompliziert.

          Idealerweise sollte es ein Watchdog-Funktion innerhalb von Items geben, die den Wert für eine bestimmte Zeit überwacht und dann ein Ergebnis zurückschreibt. Also sowas wie:

          Code:
          eval: watchdog(sh.ITEM(), 5*60, 2500, 3500)
          eval_trigger: ITEM​
          oder für dein Beispiel, zumindest so ähnlich:

          Code:
          eval: watchdog(sh.ITEM(), 5*60, 0, 2500) or watchdog(sh.ITEM(), 5*60, 3500, 0)
          eval_trigger: ITEM​


          Vielleicht hätte dazu jemand Lust.

          Aber anbei mal mein Code, als Ansatz. Ich hatte das in ein struct gepackt:

          Code:
          Schwellwert:
              type: num
              Status:
                  type: bool
                  cache: yes
              Berechnung:
                  Ueberschreitung:
                      type: bool
                      eval: True if value > sh....Parameter.Wert_Ueberschreitung() else False
                      eval_trigger: ...
                      on_change: .Timer = 1 if value else None
                      #on_change: .Timer = 1 if sh..Timer() != 1 and value else None
                      Timer:
                          type: num
                          autotimer: sh.....Parameter.Dauer_Ueberschreitung() = -1
                          #on_change: ....Status = True if value == -1 else None
                          on_change: ....Status = True if value == -1 and sh...() and sh...property.last_change_age >= sh.....Parameter.Wert_Ueberschreitung() else None
                  Unterschreitung:
                      type: bool
                      eval: True if value < sh....Parameter.Wert_Unterschreitung() else False
                      eval_trigger: ...
                      on_change: .Timer = 1 if value else None
                      Timer:
                          type: num
                          autotimer: sh.....Parameter.Dauer_Unterschreitung() = -1
                          on_change: ....Status = False if value == -1 and sh...() and sh...property.last_change_age >= sh.....Parameter.Wert_Unterschreitung() else None
          
              Parameter:
                  Wert_Ueberschreitung:
                      type: num
                      cache: yes
                  Dauer_Ueberschreitung:
                      type: num
                      cache: yes
                  Wert_Unterschreitung:
                      type: num
                      cache: yes
                  Dauer_Unterschreitung:
                      type: num
                      cache: yes
                  Status_Ueberschreitung:
                      type: bool
                      initial_value: True
                      cache: yes​

          Kommentar


            #6
            Hier liegt definitiv kein XY Problem vor Ich will es ja nicht komplizierter machen, als es ist. Im ersten Schritt würde es mir in der Tat reichen, wenn ein Item auf WAHR geht, wenn ich 10 Minuten lang mehr als 3500 W ins Netz einspeise. Dann kann ich mir immer noch überlegen, was ich dann mit dem WAHR so mache... (Spüler, WaMa, you name it).
            Der Ansatz von Cannon sieht ganz gut aus. Sowas mal allgemein für Icons wäre schon ne coole Sache.
            Auch für so Fragen wie "wenn draußen die Helligkeit für > 10 min unter 500 Lux sinkt" usw wäre das ganz hilfreich.
            Bei Gira nimmt man dann das Hysterese Objekt bei den Logiken.
            Derzeit zwischen Kistenauspacken und Garten anlegen.
            Baublog im Profil.

            Kommentar


              #7
              So ein Hysterese- und/oder Schwellwertattribut wäre schon eine Überlegung wert.. oder eine eval Funktion, die sich leicht einbinden lässt..?
              Ich hab mir schon in ne ähnliche Richtung Gedanken gemacht im Zuge des stateengine Plugins. Dort ist es im Setup auch immer recht mühsam, diverse bool Items anlegen zu müssen und du auf ein min_age zu testen. Hier über ein eigenes Threshold Item zu gehen würde das grundsätzliche Setup vermutlich auch deutlich vereinfachen.

              Kommentar


                #8
                Vielleicht sollte man sich die Funktionalität des Timmy Plugins von jentz1986 mal anschauen. Möglicherweise kann man Teile davon direkt in den Core mit übernehmen.

                Kommentar


                  #9
                  Zitat von Onkelandy Beitrag anzeigen
                  So ein Hysterese- und/oder Schwellwertattribut wäre schon eine Überlegung wert.. oder eine eval Funktion, die sich leicht einbinden lässt..?
                  Eine Funktion, die einfach in evals und Logiken eingebunden werden kann, könnte man als Userfunction ausführen.
                  Zuletzt geändert von Msinn; 21.03.2023, 13:39.
                  Viele Grüße
                  Martin

                  There is no cloud. It's only someone else's computer.

                  Kommentar


                    #10
                    Ich nutze die timmy Funktionalität in Kombination mit der UZSU dafür, abzubilden: „Von 09:30 - 18:30 mach das Garten WLAN an“ und: „Wenn in den letzten 30min noch jemand (Nutzer > 0) das Garten WLAN nutzt, dann halte den AP aktiv.“ Das, statt in einer Logik oder Funktion, in einem Item-Baum darzustellen erleichtert die Erstellung und auch im Verlauf der Nutzung mal das Debugging, insbesondere wenn es mehrere Abhängigkeiten gibt: AP_an = Zeitliche_bereitstellung OR weitere_Nutzung

                    Kommentar


                      #11
                      Für komplexere Sachen wäre natürlich das stateengine Plugin optimal. Aber halt eben nicht ganz zugänglich.

                      Userfunktion wäre auch ein Ansatz.
                      Lösungen gibt es bestimmt genug, Frage ist womit man was am einfachsten hinkriegt

                      Kommentar


                        #12
                        Zitat von Msinn Beitrag anzeigen
                        Eine Funktion, die einfach in evals und Logiken eingebunden werden kann, könnte man als Userfunction ausführen.
                        Ja und Nein. Ich arbeite gerne mit Userfunktionen, noch nicht sehr viele, aber die haben den Charme, dass man da schnell mal Ergebnisse liefern kann ohne eine komplizierte Berechnung zu machen oder auch einen Schwellenwert zu prüfen, also z.B. value < x und value > y. ABER was nicht geht ist das in Zeitfenstern zu prüfen, wie hier, also value < x für i Sekunden und value > y für k Sekunden. In diesem Fall wäre mein sehr kompliziertes und nicht richtig funktionierendes Beispiel oben in einem einzigen Item drin.

                        Das wäre eine wirkliche Erleichterung und man müsste nicht den autotimer oder cycle dafür "missbrauchen".

                        Kommentar


                          #13
                          Zitat von Cannon Beitrag anzeigen
                          ABER was nicht geht ist das in Zeitfenstern zu prüfen, wie hier, also value < x für i Sekunden und value > y für k Sekunden.
                          Wieso sollte das nicht gehen? Oder anders gefragt: Was geht für Dich nicht?
                          Viele Grüße
                          Martin

                          There is no cloud. It's only someone else's computer.

                          Kommentar


                            #14
                            Zitat von Msinn Beitrag anzeigen
                            Wieso sollte das nicht gehen? Oder anders gefragt: Was geht für Dich nicht?
                            Na wie kann ich denn Zeiten in User-Funktionen abfragen? Exemplarisch habe ich hierfür jedenfalls keine Phatansie. ;-)

                            Kommentar


                              #15
                              was meinst Du mit 'Zeiten in User-Funktionen abfragen​'? Das musst schon etwas genauer beschreiben.

                              Falls Du z.B. den aktuellen Zeitpunkt verwenden möchtest (geht natürlich auch anders, soll nur ein Beispiel sein):

                              Datei in ../functions: myfunc.py
                              Code:
                              import logging
                              _logger = logging.getLogger(__name__)
                              
                              _VERSION = '0.1.0'
                              _DESCRIPTION = 'Meine Testfunktionen'
                              
                              
                              ​def get_now(sh):
                                  # return now as a datetime object
                                  return sh.shtime.now()
                              ​
                              Aufrufen kann man die Funktion über:
                              Code:
                              uf.myfunc.get_now(sh)
                              Viele Grüße
                              Martin

                              There is no cloud. It's only someone else's computer.

                              Kommentar

                              Lädt...
                              X