Ankündigung

Einklappen
Keine Ankündigung bisher.

Smarthome Logik: alle 5 Minuten Zähler auslesen, ein anderes Item diesen Wert zuweisen und Zähler zurücksetzen

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

    Smarthome Logik: alle 5 Minuten Zähler auslesen, ein anderes Item diesen Wert zuweisen und Zähler zurücksetzen

    Hallo KNX Gemeinde,
    ich versuche mich seit Tagen an einer Logik, stehe aber irgendwie auf dem Schlauch.

    In meiner Anlage werden Strom-, und Gaszähler durch Impulse gezählt.
    Ich möchte nun mit einer Logik alle 5 Minuten den Zähler(Counter) auslesen, ein anderes Item diesen Wert zuweisen(Counter2) und dann den Zähler zurücksetzen(Counter_reset).

    items/hwr.conf
    Code:
    [EG]
    [[HWR]]
        [[[Gas]]]
             [[[[Counter]]]]
            name = Counter
            type = num
            knx_dpt = 13
            knx_listen = 0/3/0
    
             [[[[Counter2]]]]
            name = Counter
            type = num
    
             [[[[Zaehlerstand]]]]
            name = Zaehlerstand
            sqlite = yes
            type = num
            eval = sh.EG.HWR.Gas.Counter_ges() / 100
            eval_trigger = EG.HWR.Gas.Counter_ges
    
             [[[[Counter_reset]]]]
            name = Counter Reset
            type = bool
            knx_dpt = 1
            knx_send = 0/3/1
    logic.conf
    Code:
    [Verbrauch]
        filename = verbrauch.py
        crontab = init
        cycle = 30
    verbrauch.py
    Code:
    #!/usr/bin/env python            
    
    Stromzaehler = sh.EG.HWR.Strom.Counter()
    sh.EG.HWR.Strom.Counter2(Stromzaehler)
    sh.EG.HWR.Strom.Counter_reset(1)
    
    Gaszaehler = sh.EG.HWR.Gas.Counter()
    sh.EG.HWR.Gas.Counter2(Gaszaehler)
    sh.EG.HWR.Gas.Counter_reset(1)
    Beim ersten start der Logik wird der Zähler resetet:
    Code:
    2016-11-26 20:43:14,096 DEBUG    Verbrauch    Item EG.HWR.Strom.Counter_reset = 1 via Logic None None -- item.py:__update:373
    bei allen weitern aber nicht.
    Code:
    2016-11-26 19:06:13,773 DEBUG    Scheduler    Verbrauch next time: 2016-11-26 19:06:43+01:00 -- scheduler.py:_next_time:303
    Kann mir jemand sagen wo mein Fehler liegt, bzw. wie ich das ganze event anders lösen kann.

    LG
    Tobias
    Zuletzt geändert von bmx; 26.11.2016, 21:29.

    #2
    Damit ein zweites Mal derselbe Wert auf den Bus geschrieben wird, musst du beim Item Counter_reset das Attribut enforce_updates = yes angeben.
    Weshalb du das Count2 überhaupt brauchst, getrau ich mich schon gar nicht zu fragen.

    Gruss
    Stefan
    Zuletzt geändert von bmx; 26.11.2016, 21:27.

    Kommentar


      #3
      Hallo Stefan,danke für deine Antwort.
      Hat super funtioniert.

      Das Binärinterface senden bei jedem Impuls den Zählerstand an die GA des Counter Items.
      Counter wird alle 5 Minuten abgefragt und der Letzte Wert an Counter2 übergeben und in der Datenbank gespeichert.

      Wie würdest du das denn anders lösen?
      Zuletzt geändert von bmx; 26.11.2016, 21:27.

      Kommentar


        #4
        Du könntest in der Logik direkt den Zählerstand setzen anstelle des Umweges über Counter2. Du hast ja anscheinend nochmal ein Hilfsitem namens Counter_ges(). Wenn ich richtig liege, dann summierst du dort (in einem eval?) die Werte von Counter2, damit du damit geteilt durch 100 den Zählerstand ermitteln kannst.

        Falls dem so ist, könnte die Logik einfach folgendermassen aussehen und Counter2 und Counter_ges können weggelassen werden:
        Code:
        sh.EG.HWR.Gas.Zaehlerstand(sh.EG.HWR.Gas.Zaehlerstand() + sh.EG.HWR.Gas.Counter())
        sh.EG.HWR.Gas.Counter_reset(1)

        Wenn wir schon beim Optimieren sind: Falls von aussen eine 1 an 0/3/1 gesendet wird, wird der Counter resettet, ohne dass es deine Logik mitkriegt und der Zählerstand ist danach falsch.
        Deshalb wäre evtl. auch folgendes Konstrukt möglich, ganz ohne eine Logik:

        Code:
        [EG]
        [[HWR]]
            [[[Gas]]]
                [[[[Counter]]]]
                name = Counter
                type = num
                knx_dpt = 13
                knx_listen = 0/3/0
        
                [[[[Zaehlerstand]]]]
                name = Zaehlerstand
                sqlite = yes
                type = num
        [B]        eval = sh.EG.HWR.Gas.Zaehlerstand() + sh.EG.HWR.Gas.Counter()/100 if value = True else sh.EG.HWR.Gas.Zaehlerstand()[/B]
        [B]        eval_trigger = EG.HWR.Gas.Counter_reset[/B]
        
                [[[[Counter_reset]]]]
                name = Counter Reset
                type = bool
                knx_dpt = 1
                knx_send = 0/3/1
        [B]        knx_listen = 0/3/1[/B]
        [B]        enforce_updates = yes[/B]
        [B]        cycle = 300 = True[/B]
        Damit würde der Zählerstand jedes mal wenn auf Counter_reset eine 1 gesendet oder empfangen wird um den Wert von Counter/100 erhöht.
        Falls dein Zähler auch bei 0/3/1 = 0 resettet, lässt du das if im eval weg.

        Falls der Counter nach einem Reset immer gleich eine 0 sendet, liesse sich das ganze noch zuverlässiger machen, indem du den eval_trigger auf EG.HWR.Gas.Counter änderst und das eval folgendermassen anpasst:
        eval = sh.EG.HWR.Gas.Zaehlerstand() + sh.EG.HWR.Gas.Counter.prev_value()/100 if value = 0 else sh.EG.HWR.Gas.Zaehlerstand()

        ACHTUNG: Das ganze ist natürlich ungetestet, Fehler also durchaus noch möglich.


        Verschieben kannst du afaik nicht, das können wohl nur Admins.
        EDIT: Und Halb-Admins wie bmx ;-)
        Zuletzt geändert von smai; 26.11.2016, 22:18. Grund: Einrückung korrigiert und zwei Mal sh. ergänzt

        Kommentar


          #5
          Hallo Stefan,
          danke für deine Hinweise ich werde mir die morgen mal in Ruhe anschauen und umsetzen.

          LG
          Tobias

          Kommentar

          Lädt...
          X