Ankündigung

Einklappen
Keine Ankündigung bisher.

Probleme im eval-Zweig?

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

    Probleme im eval-Zweig?

    Hallo,

    ich benutze eine Logik hier aus dem Forum, um Zeiten im Format "zeit.minute.since.midnight" usw zu berechnen. (basiert auf einer Logik und Items, die sich entsprechend aktualisieren).

    Dabei wird neben den Zeitwerten auch jeweils ein String für die DB-Abfrage erzeugt. Beispiel:

    Code:
    [[minute]]
            [[[since]]]
               [[[[hour]]]]
                    type = num
                    [[[[[dbstr]]]]]
                        type = str
                        eval_trigger = minute.since.hour
                        eval = str(sh.zeit.minute.since.hour()) + 'i'
    Dabei werden alle "normalen" Items korrekt berechnet - die jeweils vorgesehenen String-Items *.dbstr lauten aber alle auf "0i".

    Über das CLI-Plugin kann ich Items ja nur abfragen und setzen, aber der Zugriff auf sh.zeit.minute.since.hour gibt kein Ergebnis (ich muss zeit.minute.since.hour benutzen) und die str()-Wandlung geht auch nicht, da das Python-Code ist, wenn ich nicht falsch liege.

    Gibt es eine Möglichkeit, diese Wandlung Schritt für Schritt zu debuggen?

    Oder sieht jemand auf Anhieb, warum das bei mir nicht geht?

    #2
    Mag ja was ganz anderes sein, aber warum geht Dein Trigger auf "minute.since.hour" und Dein Eval auf "zeit.minute.since.hour". Kann es sein das Dein Trigger nicht vollständig ist?

    Kommentar


      #3
      Ja. Kann sein. Kann auch sein, dass ich Aktoren auf den Augen habe... args. Natürlich, du hast völlig Recht. Danke fürs Aufpassen

      So... und jetzt funktioniert das, die Werte lassen sich abfragen, und ich hab das nächste Problem:

      Code:
      2016-10-09 21:40:13 DEBUG    scheduler    iskra        Triggering d.haus.verbrauch.gestern - by: Logic source: None dest: None value: {'source': 'd.haus.zaehler', 'value': 69 -- scheduler.py:trigger:165
      2016-10-09 21:40:13 WARNING  item         d.haus.verbrauch.heute Item d.haus.verbrauch.heute: problem evaluating sh.d.haus.zaehler() - sh.d.haus.zaehler.db('min', sh.zeit.minute.since.midnight.dbstr): 'Item' object has no attribute 'isdigit' -- item.py:__run_eval:342
      Dieser Fehler taucht systematisch bei allen Auswertungen auf. Ich muss gestehen, dass ich den Fehler nicht mal im Detail verstehe...

      Zugehörige Item-Definition:
      Code:
      [zeit]
          [[minute]]
              [[[since]]]
                 [[[[midnight]]]]
                      type = num
                      [[[[[dbstr]]]]]
                          type = str
                          eval_trigger = zeit.minute.since.midnight
                          eval = str(sh.zeit.minute.since.midnight()) + 'i'
      
      [d]
          [[haus]]
              [[[verbrauch]]]
                  iskra_code = 1-0:16.7.0*255
                  device = /dev/lesekopf-haus
                  type=num
                  visu_acl = rw
                  rrd=yes
                  rrd_min=yes
                  rrd_max=yes
      
                  [[[[gestern]]]]
                      type = num
                      visu_acl = r
                      crontab = * * * * = 1
                      eval = sh.d.haus.zaehler.db('min', sh.zeit.minute.since.yesterday.dbstr) - sh.d.haus.zaehler.db('min', sh.zeit.minute.since.midnight.dbstr)
                      eval_trigger = d.haus.zaehler
      Nach der Doku kann ich die .db-Funktionen ja auch im rrdb-Plugin nutzen...?

      Kommentar


        #4
        Ist ein Schuss ins Blaue, aber ich bin nicht sicher, ob man ein min auf einen String machen darf?

        Kommentar


          #5
          Wenn ich das richtig lese, macht er das "min" ja auch d.haus.zaehler, der String (zeit.minute.since.yesterday.dbstr) ist doch die Zeitangabe "von". Jedenfalls habe ich das so verstanden.... oder meinst du noch was anderes?

          Kommentar


            #6
            Moin,
            bin kein Experte für die DB-Geschichten, daher kann ich auch nix direktes empfehlen, aber nach meinen Erfahrungen würde ich das ganze zum Debuggen erst mal in eine Logik packen. Macht es ggf. einfacher/deutlicher bzgl. Fehlermeldungen und zudem muß man bei Trial & Error nicht ständig neustarten

            Kommentar


              #7
              Richtig Morg, wer lesen kann...

              Neuer Versuch:
              Du zeigst nirgendwo die config für d.haus.zaehler. Hast du denn da rrd und rrd_min gesetzt?
              Weshalb schreibst du die Minuten überhaupt in ein Item und berechnest dann nochmal in einem Item den String? Machs doch einfach direkt im eval, z.B. mit
              Code:
               str((datetime.now() - datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)).total_seconds()/60) + 'i'
              Und für den Vortag kannst du einfach 1440 Minuten abziehen.

              Kommentar


                #8
                Hm... die Zähler-Konfiguration habe ich vergessen, sorry. Sieht im Prinzip genauso aus wie die vom Verbrauch:

                Code:
                [[[zaehler]]]
                                         iskra_code = 1-0:1.8.0*255
                                         device = /dev/lesekopf-haus
                                         type=num
                                         visu_acl = rw
                                         rrd=yes
                                         rrd_mode=counter
                rrd_min habe ich nicht gesetzt... das könnte ich mal probieren.

                Und die Berechnung der ganzen Zeiten ist nicht von mir, das war als Paket übernommen. Wenn ich irgendwann weiß, was ich damit anfangen will, kann ich es noch verschlanken Allerdings ist deine Berechnung sicherlich simpler, gerade, wenn man nur den einen Wert braucht!

                @Sandman:
                Das hat was für sich - da muss ich mal schauen, wie ich das in die Logik verpacke - und wie ich dann die Ergebnisse prüfe

                Kommentar


                  #9
                  Wenn ich es richtig verstehe, braucht es doch das rrd_min, damit du ein db('min') machen kannst.

                  Kommentar


                    #10
                    Ich habe jetzt mal beides probiert - wahrscheinlich fehlte tatsächlich das rrd_min.

                    Jetzt muss ich 2 Tage warten, bis die _min-Werte für heute 0:00 und gestern 0:00 vorhanden sind... aber immerhin

                    Danke für eure Tips!

                    Kommentar

                    Lädt...
                    X