Ankündigung

Einklappen
Keine Ankündigung bisher.

Item mit variablem Namen für Logik anlegen

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

    Item mit variablem Namen für Logik anlegen

    Hallo,

    ich benötige für eine Logik ein variables Item jedoch weis ich nicht so recht wie dieses in der items.yaml zu definieren ist.

    Im Genauen geht es um diese Logik

    Code:
    # Überprüfe, ob heute der erste Tag des Monats ist
    Tag = datetime.date.today().day
    Monatstage = (datetime.date.today() - datetime.timedelta(1)).day
    start = str(Monatstage) + 'd'
    Monat = (datetime.date.today() - datetime.timedelta(1)).strftime("%B")
    item = 'sh.Bezug.Verbrauch.' + Monat
    
    if Tag == 10:
    
    # Berechne die Stromkosten sowie den vebrauch des vorherigen Monats und schreibe das Ergebnis in ein Item
        sh.Bezug.VormonatsverbrauchHT(sh.Bezug.EnergieHT() - sh.Bezug.EnergieHT.db('min', start))
        sh.Bezug.VormonatsverbrauchNT(sh.Bezug.EnergieNT() - sh.Bezug.EnergieNT.db('min', start))
        sh.Bezug.Vormonatsverbrauch(sh.Bezug.VormonatsverbrauchHT() + sh.Bezug.VormonatsverbrauchNT())
        sh.Bezug.KostenVormonat((round((sh.Bezug.VormonatsverbrauchNT())*0.1652 + (64.62/365),2)) + (round((sh.Bezug.VormonatsverbrauchHT())*0.2164 + (64.62/365),2)))
        item(sh.Bezug.Verbrauch()('min ', start))
    Diese Logik berechnen den Vormonatsverbrauch anhand dieser Logik und DB Einträgen.
    Jetzt möchte ich die Monatsverbräuche auf das item Bezug.Verbrauch.MONAT schreiben sodass ich die gesamte Jahresstatistik habe und nicht jeden Monat schauen muss.

    In einem anderen Thread hat Maxthomas mir folgendes mitgeteilt. Jedoch geht das nicht so recht

    Zitat von Maxthomas2001 Beitrag anzeigen
    Du verwendest doch eh die Logik, die am ersten des Monats den Verbrauch für das vorhergehende berechnet.
    Das kannst du ja leicht erweitern.
    Du fügst eine Variable hinzu, die den Monatsnamen des Vortages enthält:
    Code:
    Monat = (datetime.date.today() - datetime.timedelta(1)).strftime("%B")
    Dann definierst du ein item als Variable:

    Code:
    item = 'sh.Bezug.Verbrauch.' + Monat
    Und bei der if-Bedingung fügst du dann noch mit hinzu:

    Code:
    item(sh.DG.Garage.Raumklima.Ist_Temperatur.db('min ', start))
    Ungetestet ohne Gewähr.


    Danke
    Gruss Oliver

    Elektroinstallateur für Energie und Gebäudetechnik

    #2
    Du hast die Anleitung etwas falsch interpretiert. Du kannst (noch) nicht über Logiker Items anlegen. Die Zeile
    Code:
     
     item = 'sh.Bezug.Verbrauch.' + Monat
    meinte wohl, dass du in der Logik auf das jeweils relevante Item zugreifst. Letzteres muss aber schon existieren. Aber du kannst ja einfach für jeden Monat das entsprechend Item im yaml anlegen!? Also:
    Code:
    Bezug:
      Verbrauch:
        Januar:
           type: num
        Februar:
       .......

    Kommentar


      #3
      Hallo Onkelandy ,


      ich habe die Items nun mal angelegt, danke dafür.


      Nun nach Anpassung der Logik kommt es zu Fehlermeldungen


      Code:
      
      # Überprüfe, ob heute der erste Tag des Monats ist
      Tag = datetime.date.today().day
      Monatstage = (datetime.date.today() - datetime.timedelta(1)).day
      start = str(Monatstage) + 'd'
      Monat = (datetime.date.today() - datetime.timedelta(1)).strftime("%B")
      item = 'sh.Bezug.Verbrauch.' + Monat
      
      if Tag == 15:
      
      # Berechne die Stromkosten sowie den vebrauch des vorherigen Monats und schreibe das Ergebnis in ein Item
          sh.Bezug.VormonatsverbrauchHT(sh.Bezug.EnergieHT() - sh.Bezug.EnergieHT.db('min', start))
          sh.Bezug.VormonatsverbrauchNT(sh.Bezug.EnergieNT() - sh.Bezug.EnergieNT.db('min', start))
          sh.Bezug.Vormonatsverbrauch(sh.Bezug.VormonatsverbrauchHT() + sh.Bezug.VormonatsverbrauchNT())
          sh.Bezug.KostenVormonat((round((sh.Bezug.VormonatsverbrauchNT())*0.1652 + (64.62/365),2)) + (round((sh.Bezug.VormonatsverbrauchHT())*0.2164 + (64.62/365),2)))
          item(sh.Bezug.Vormonatsverbrauch('min ', start))
      Das ist die Logik





      Dies ist das LOG:


      Code:
      2019-06-15  11:05:04 WARNING  lib.item            Item Bezug.Vormonatsverbrauch: problem evaluating round((value),3): type str doesn't define __round__ method
      2019-06-15  11:05:04 ERROR    logics.Vormonatsverbrauch Logic: logics.Vormonatsverbrauch, File: /usr/local/smarthome/logics/vormonatsverbrauch.py, Line: 15, Method: <module>, Exception: 'str' object is not callable
      > Traceback (most recent call last):
      >   File "/usr/local/smarthome/lib/scheduler.py", line 498, in _task
      >     exec(obj.bytecode)
      >   File "/usr/local/smarthome/logics/vormonatsverbrauch.py", line 15, in <module>
      >     item(sh.Bezug.Vormonatsverbrauch('min ', start))
      > TypeError: 'str' object is not callable
      2019-06-15  11:05:05 WARNING  lib.item            Item Bezug.Vormonatsverbrauch: problem evaluating round((value),3): type str doesn't define __round__ method
      2019-06-15  11:05:05 ERROR    logics.Vormonatsverbrauch Logic: logics.Vormonatsverbrauch, File: /usr/local/smarthome/logics/vormonatsverbrauch.py, Line: 15, Method: <module>, Exception: 'str' object is not callable
      > Traceback (most recent call last):
      >   File "/usr/local/smarthome/lib/scheduler.py", line 498, in _task
      >     exec(obj.bytecode)
      >   File "/usr/local/smarthome/logics/vormonatsverbrauch.py", line 15, in <module>
      >     item(sh.Bezug.Vormonatsverbrauch('min ', start))
      > TypeError: 'str' object is not callable


      Items sind wie folgt definiert:

      Code:
      
          Verbrauch:
              Januar:
                  type: num
              Februar:
                  type: num
              Maerz:
                  type: num
              April:
                  type: num
              Mai:
                  type: num
              Juni:
                  type: num
              Juli:
                  type: num
              August:
                  type: num
              September:
                  type: num
              Oktober:
                  type: num
              November:
                  type: num
              Dezember:
                  type: num

      Gruss Oliver

      Elektroinstallateur für Energie und Gebäudetechnik

      Kommentar


        #4
        Folgendes kann nicht funktionieren:
        Code:
        item = 'sh.Bezug.Verbrauch.' + Monat
        
        ...
        
        item(sh.Bezug.Vormonatsverbrauch('min ', start))
        Die Vorgehensweise ist es anhand des Itempfades ein tatsächlich vorhandenes Item rauszusuchen und dann dieses mit dem ermittelten Wert zu aktualisieren. Nachfolgendes könnte funktionieren (ungetestet)

        Code:
        from lib.item import Items
        items = Items.get_instance()
        
        item = items.return_item('Bezug.Verbrauch.' + Monat)
        
        ...
        
        item(sh.Bezug.Vormonatsverbrauch('min', start))

        Kommentar


          #5
          Hi Oliver,

          Dein Problem liegt daran, dass bei der Zeile
          Code:
           
           item = 'sh.Bezug.Verbrauch.' + Monat
          die Variable item gar kein Item, sondern nur der Name des Items ist, also ein string. Deswegen bekommst Du auch die Meldung 'str is not callable'.

          Mach mal:
          Code:
          item = sh.return_item('Bezug.Verbrauch.' + Monat)
          dann wird da was draus. Die angelegten Items sind natürlich immer noch notwendig.

          Gruß, Waldemar

          Kommentar


            #6
            OK, bmx war schneller.

            Anzumerken ist noch, dass seine Lösung für shNG Version 1.6 gilt, meine für die früheren Versionen.

            Gruß, Waldemar

            Kommentar


              #7
              Guter Punkt mumpf, die passende Stelle in der Doku wäre dies hier.

              Kommentar


                #8
                Hallo zusammen !

                ich habe es nun beide male probiert:

                Code:
                
                # Überprüfe, ob heute der erste Tag des Monats ist
                Tag = datetime.date.today().day
                Monatstage = (datetime.date.today() - datetime.timedelta(1)).day
                start = str(Monatstage) + 'd'
                Monat = (datetime.date.today() - datetime.timedelta(1)).strftime("%B")
                from lib.item import Items
                items = Items.get_instance()
                
                item = items.return_item('Bezug.Verbrauch.' + Monat)
                
                
                
                if Tag == 15:
                
                # Berechne die Stromkosten sowie den vebrauch des vorherigen Monats und schreibe das Ergebnis in ein Item
                    sh.Bezug.VormonatsverbrauchHT(sh.Bezug.EnergieHT() - sh.Bezug.EnergieHT.db('min', start))
                    sh.Bezug.VormonatsverbrauchNT(sh.Bezug.EnergieNT() - sh.Bezug.EnergieNT.db('min', start))
                    sh.Bezug.Vormonatsverbrauch(sh.Bezug.VormonatsverbrauchHT() + sh.Bezug.VormonatsverbrauchNT())
                    sh.Bezug.KostenVormonat((round((sh.Bezug.VormonatsverbrauchNT())*0.1652 + (64.62/365),2)) + (round((sh.Bezug.VormonatsverbrauchHT())*0.2164 + (64.62/365),2)))
                    item(sh.Bezug.Vormonatsverbrauch('min', start))
                Jedoch wird auf das ITEM nichts geschrieben und Fehler kommen auch keine bei raus ich stehe grade acht auf dem berühmten Schlauch

                Ah Übrigens SHNG Version 1.6


                Edit:


                  2019-06-15 12:09:52 WARNING lib.item Item Bezug.Vormonatsverbrauch: value "min" does not match type num. Via 14d None 
                Zuletzt geändert von jonny7792; 15.06.2019, 11:10.
                Gruss Oliver

                Elektroinstallateur für Energie und Gebäudetechnik

                Kommentar


                  #9
                  In der letzten Zeile fehlt jedenfalls das .db

                  Kommentar


                    #10
                    Danke dir das war der fehler
                    Gruss Oliver

                    Elektroinstallateur für Energie und Gebäudetechnik

                    Kommentar

                    Lädt...
                    X