Ankündigung

Einklappen
Keine Ankündigung bisher.

Pumpenüberwachung

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

    #16
    rule CheckItemTrigger
    when
    Member of gPump changed
    then
    logInfo("WaterTest", triggeringItem.name)
    logInfo("WaterTest", triggeringItem.state.toString)

    if (triggeringItem.state > 0 && previousState == 0) {
    logInfo("WaterTest", "Die Pumpe {} ist angelaufen.", triggeringItem.name)
    } else if (triggeringItem.state > 0 && previousState > 0) {
    logInfo("WaterTest", "Die Pumpe {} zieht derzeit {} mA.", triggeringItem.name, triggeringItem.state)
    } else if (triggeringItem.state == 0 && previousStatenotep > 0) {
    logInfo("WaterTest", "Die Pumpe {} hat abgeschaltet.", triggeringItem.name)
    }
    end
    [/CODE]

    Dieser läuft soweit, aber es scheint noch ein Fehler mit previousState zu geben
    Code:
    2020-01-18 10:32:08.766 [INFO ] [pse.smarthome.model.script.WaterTest] - PumpWater_Power
    2020-01-18 10:32:08.782 [INFO ] [pse.smarthome.model.script.WaterTest] - 18.94
    2020-01-18 10:32:08.797 [INFO ] [pse.smarthome.model.script.WaterTest] - Die Pumpe PumpWater_Power zieht derzeit 18.94 mA.
    
    2020-01-18 10:32:08.829 [INFO ] [pse.smarthome.model.script.WaterTest] - PumpWater_Power
    2020-01-18 10:32:08.829 [INFO ] [pse.smarthome.model.script.WaterTest] - 18.94
    2020-01-18 10:32:08.829 [INFO ] [pse.smarthome.model.script.WaterTest] - Die Pumpe PumpWater_Power ist angelaufen.
    
    2020-01-18 10:32:19.049 [INFO ] [pse.smarthome.model.script.WaterTest] - PumpWater_Power
    2020-01-18 10:32:19.081 [INFO ] [pse.smarthome.model.script.WaterTest] - 18.68
    2020-01-18 10:32:19.096 [INFO ] [pse.smarthome.model.script.WaterTest] - Die Pumpe PumpWater_Power zieht derzeit 18.68 mA.
    
    2020-01-18 10:32:38.800 [INFO ] [pse.smarthome.model.script.WaterTest] - PumpWater_Power
    2020-01-18 10:32:38.832 [INFO ] [pse.smarthome.model.script.WaterTest] - 0.56
    2020-01-18 10:32:38.847 [INFO ] [pse.smarthome.model.script.WaterTest] - Die Pumpe PumpWater_Power zieht derzeit 0.56 mA.
    
    2020-01-18 10:32:49.146 [INFO ] [pse.smarthome.model.script.WaterTest] - PumpWater_Power
    2020-01-18 10:32:49.162 [INFO ] [pse.smarthome.model.script.WaterTest] - 0.0
    2020-01-18 10:32:49.177 [INFO ] [pse.smarthome.model.script.WaterTest] - Die Pumpe PumpWater_Power hat abgeschaltet.
    Seltsamerweise wird erst die zweite Abfrage als wahr erkannt, obwohl doch previousState 0.0 sein müsste (so wie am Schluß)
    Die erste Vermutung war 0 === 0.0 aber, im Anschluß (also nach der nächsten Änderung) funktioniert das ja, obwohl ich dort previousState schon bei 18.94 erwartet hätte.
    Schließlich ist 18,94 ja direkt beim ersten Durchlauf der aktuelle Status.

    Kommentar


      #17
      Seltsam, nach 2-3 Läufen war es auf einmal in der richtigen Reihenfolge, aber ich hatte da noch einen copy&paste Fehler in der dritten Abfrage. Das habe ich genutzt und noch ein wenig getestet und zumindest kommen nun die Meldungen in der korrekten Abfolge.

      Code:
      2020-01-18 15:24:11.165 [INFO ] [pse.smarthome.model.script.WaterTest] - Entwässerungspumpe ist angelaufen.
      2020-01-18 15:24:11.180 [INFO ] [pse.smarthome.model.script.WaterTest] - Entwässerungspumpe zieht derzeit 10.85 mA.
      2020-01-18 15:24:15.241 [INFO ] [pse.smarthome.model.script.WaterTest] - Entwässerungspumpe zieht derzeit 10.790000000000001 mA.
      2020-01-18 15:24:20.286 [INFO ] [pse.smarthome.model.script.WaterTest] - Entwässerungspumpe zieht derzeit 10.77 mA.
      2020-01-18 15:24:25.287 [INFO ] [pse.smarthome.model.script.WaterTest] - Entwässerungspumpe zieht derzeit 10.71 mA.
      2020-01-18 15:24:26.099 [INFO ] [pse.smarthome.model.script.WaterTest] - Entwässerungspumpe hat abgeschaltet.
      Der dazu gehörige Code
      Code:
      rule CheckItemTrigger
      when
      Member of gPump changed
      then
      if (triggeringItem.state > 0 && previousState == 0) {
      logInfo("WaterTest", "{} ist angelaufen.", triggeringItem.label)
      } else if (triggeringItem.state > 0 && previousState > 0) {
      logInfo("WaterTest", "{} zieht derzeit {} mA.", triggeringItem.label, triggeringItem.state)
      } else if (triggeringItem.state == 0 && previousState > 0) {
      logInfo("WaterTest", "{} hat abgeschaltet.", triggeringItem.label)
      }
      end
      Nun geht es weiter mit der weiteren Überlegung und schalten von Dummy Items

      PS: Für weitere Tipps und Anregungen bin ich immer offen

      Kommentar


        #18
        So, nächste getestetet Version mit virtuellen Schaltern

        Items
        Code:
        Group:Number:SUM      gPump         "Pumpen"
        Group                             gPumpOn
        
        /* Pumpen */
        Switch Steckd_PumpFeedingWater        "Hauswasserwerk"          (KG_Hausanschluss)           {channel="knx:device:bridge:ABB_0_0_20:ch8"}
        Switch Steckd_PumpWasteWater           "Schmutzwasser"           (KG_Hausanschluss)           //{channel="knx:device:bridge:ABB_0_0_20:ch8"}
        Switch Steckd_PumpDrainage                 "Entwässerungspumpe"                                              {channel="knx:device:bridge:ABB_0_0_105:ch1"}
        /* virtuelle Schalter */
        Switch PumpFeedingWater_vSwitch        "Hauswasserwerk"             (gPumpOn)
        Switch PumpWasteWater_vSwitch           "Schmutzwasser"              (gPumpOn)
        Switch PumpDrainage_vSwitch                 "Entwässerungspumpe"    (gPumpOn)
        /* Stromverbrauch */
        Number PumpFeedingWater_Power         "Hauswasserwerk [%f Wh]"           (gPump, Electricity_Chart)       {channel="knx:device:bridge:ABB_0_0_20:ch8A"}
        Number PumpWasteWater_Power            "Schmutzwasser [%f Wh]"            (gPump, Electricity_Chart)       //{channel="knx:device:bridge:ABB_0_0_20:ch8A"}
        Number PumpDrainage_Power                 "Entwässerungspumpe [%f Wh]"   (gPump, Electricity_Chart)       {channel="knx:device:bridge:ABB_0_0_105:ch1A"}
        Logging und schalten der virtuellen Schalter
        Code:
        rule PumpMonitor
        when
           Member of gPump changed
        then
           val myPump = gPumpOn.members.filter[i|i.name.contains(triggeringItem.name.split("_").g et(0))].head
           if (triggeringItem.state > 0 && previousState == 0 && myPump.state != ON) {
              myPump.postUpdate(ON)
              logInfo("Water", "{} ist angelaufen.", triggeringItem.label)
           } else if (triggeringItem.state > 0 && previousState > 0) {
              logInfo("Water", "{} zieht derzeit {} mA.", triggeringItem.label, triggeringItem.state)
           } else if (triggeringItem.state == 0 && previousState > 0 && myPump.state != OFF) {
              myPump.postUpdate(OFF)
              logInfo("Water", "{} hat abgeschaltet.", triggeringItem.label)
           }
        end
        Logeinträge
        Code:
        2020-01-18 19:06:14.559 [INFO ] [eclipse.smarthome.model.script.Water] - Hauswasserwerk ist angelaufen.
        2020-01-18 19:06:27.246 [INFO ] [eclipse.smarthome.model.script.Water] - Hauswasserwerk zieht derzeit 18.34 mA.
        2020-01-18 19:06:57.291 [INFO ] [eclipse.smarthome.model.script.Water] - Hauswasserwerk zieht derzeit 18.400000000000002 mA.
        2020-01-18 19:07:08.715 [INFO ] [eclipse.smarthome.model.script.Water] - Hauswasserwerk zieht derzeit 19.38 mA.
        2020-01-18 19:07:09.262 [INFO ] [eclipse.smarthome.model.script.Water] - Hauswasserwerk hat abgeschaltet.
        
        2020-01-18 18:53:51.901 [INFO ] [eclipse.smarthome.model.script.Water] - Entwässerungspumpe ist angelaufen.
        2020-01-18 18:53:57.333 [INFO ] [eclipse.smarthome.model.script.Water] - Entwässerungspumpe zieht derzeit 10.58 mA.
        2020-01-18 18:54:02.363 [INFO ] [eclipse.smarthome.model.script.Water] - Entwässerungspumpe zieht derzeit 10.63 mA.
        2020-01-18 18:54:07.393 [INFO ] [eclipse.smarthome.model.script.Water] - Entwässerungspumpe zieht derzeit 10.5 mA.
        2020-01-18 18:54:10.160 [INFO ] [eclipse.smarthome.model.script.Water] - Entwässerungspumpe hat abgeschaltet.
        Was würde denn gegen eine große Rule sprechen um dort in die entsprechende Pumpenregel zu verzweigen und was wäre ein Vorteil von einer Rule pro Pumpe??
        Und wie würde eine Hashmap funktionieren??
        Welchen Vorteil hat der virtuelle Switch gegenüber der Liveüberwachung des Stromflusses
        Zuletzt geändert von JoergA; 18.01.2020, 19:27. Grund: Ergänzung

        Kommentar


          #19
          Folgende Regel habe ich für abzuleitenden Aktionen gewählt
          Code:
          rule PumpAction
          when
              Member of gPumpOn received update
          then
             /* Entwässerungspumpe EIN */
             if (triggeringItem.state == (ON) && triggeringItem.name.split("_").get(0) == PumpDrainage_Power.name.split("_").get(0)) {
                if (t_watchdogdrainage === null) {
                   logInfo("Water", "Note: Alarmtimer für {} gestartet", PumpDrainage_vSwitch.label)
                   pushNotification("Note: " + now, PumpDrainage_vSwitch.label + " ist angelaufen.")
                   t_watchdogdrainage = createTimer(now.plusMinutes(2))[|
                   if (PumpDrainage_vSwitch.state == (ON) && Parents.state == OPEN) {
                      pushNotification("ALARM: " + now, PumpDrainage_vSwitch.label + " läuft seit 2 Minuten!")
                      Steckd_OG_Schlafz_Schrank.sendCommand(ON)
                      Lampe_OG_Flur_Deko.sendCommand(ON)
                   } else if (PumpDrainage_vSwitch.state == (ON) && Parents.state == CLOSED) {
                      pushNotification("ALARM: " + now, PumpDrainage_vSwitch.label + " läuft seit 2 Minuten")
                      t_watchdogdrainage.reschedule(now.plusMinutes(2))
                   } else if (PumpDrainage_vSwitch.state == (OFF)) {
                      t_watchdogdrainage.cancel
                      t_watchdogdrainage = null
                      return;
                   }
                ]
              }
             /* Entwässerungspumpe AUS (nur temporär zur Überwachung) */
           } else if (triggeringItem.state == (OFF) && triggeringItem.name.split("_").get(0) == PumpDrainage_Power.name.split("_").get(0)) {
             pushNotification("Entwarnung: " + now, PumpDrainage_vSwitch.label + " hat abgeschaltet.")
             return;
             /* Hauswasserwerk EIN */
             } else if (triggeringItem.state == (ON) && triggeringItem.name.split("_").get(0) == PumpFeedingWater_Power.name.split("_").get(0)) {
                if (t_watchdogfeeding === null) {
                   logInfo("Water", "Note: Alarmtimer für {} gestartet", PumpFeedingWater_vSwitch.label)
                   t_watchdogfeeding = createTimer(now.plusSeconds(10))[|
                      if (PumpFeedingWater_vSwitch.state == (ON) && Parents.state == OPEN) {
                      pushNotification("ALARM: " + now, PumpFeedingWater_vSwitch.label + " läuft seit 10 Sekunden!")
                      Lampe_EG_Deko_Wand.sendCommand(ON)
                   } else if (PumpFeedingWater_vSwitch.state == (ON) && Parents.state == CLOSED && myIrrigationSwitchVis.state == ON) {
                      pushNotification("ALARM: " + now, PumpFeedingWater_vSwitch.label + " läuft seit 10 Sekunden!")
                      t_watchdogfeeding.reschedule(now.plusSeconds(10))
                } else if (PumpFeedingWater_vSwitch.state == (OFF)) {
                   t_watchdogfeeding.cancel
                   t_watchdogfeeding = null
                   return;
              }
             ]
          }
          /* Schmutzwasserpumpe EIN */
          } else if (triggeringItem.state == (ON) && triggeringItem.name.split("_").get(0) == PumpWasteWater_Power.name.split("_").get(0)) {
          pushNotification("Achtung: " + now, "Was passiert mit " + PumpWasteWater_vSwitch.label + "???")
          return;
          }
          end

          Kommentar


            #20
            Du gewinnst ja nichts durch die Zusammenfassung der Rules zu einer monolitischen Rule, im Gegenteil bekommst Du einen riesigen Codeblock, von dem große Teile nicht ausgeführt werden, also gezielt übersprungen werden müssen.

            Kommentar


              #21
              Zitat von udo1toni Beitrag anzeigen
              Du gewinnst ja nichts durch die Zusammenfassung der Rules zu einer monolitischen Rule, im Gegenteil bekommst Du einen riesigen Codeblock, von dem große Teile nicht ausgeführt werden, also gezielt übersprungen werden müssen.
              Zugegeben, neigen Riesen Rules auch dazu, etwas unübersichtlich zu werden. Auch habe ich mir nun in der Sitemap eine Section "Maintenance" eingerichtet und lasse die vSwitche dort anzeigen. Dies kann ich dann manuell aktivieren und kann prüfen ob die Regel noch wie gewünscht arbeiten, ohne immer extra die Pumpen zu starten.

              Kommentar


                #22
                Hallo zusammen,

                ich wollte die Überwachung der Entwässerungspumpe noch weiter verfeinern und dazu die Laufzeit der Pumpe berechnen und dann entspreched senden.

                Idee dazu wäre
                Code:
                var Timer t_watchdogdrainage = null //Timer zur Überwachung der Entwässerungspumpe
                
                rule PumpAction
                    when
                Member of gPumpOn received update
                   then
                      /* Entwässerungspumpe EIN */
                      if (triggeringItem.state == (ON) && triggeringItem.name.split("_").get(0) == PumpDrainage_Power.name.split("_").get(0)) {
                         var int Einschaltzeit = aktuelle Uhrzeit
                         if (t_watchdogdrainage === null) {
                            logInfo("Water", "Note: Alarmtimer für {} gestartet", PumpDrainage_vSwitch.label)
                            pushNotification("Note: " + now, PumpDrainage_vSwitch.label + " ist angelaufen.")
                            t_watchdogdrainage = createTimer(now.plusMinutes(2))[|
                            Laufzeit = aktuelleZeit - Startzeit
                         if (PumpDrainage_vSwitch.state == (ON) && Parents.state == OPEN) {
                            pushNotification("ALARM: " + now, PumpDrainage_vSwitch.label + " läuft seit Laufzeit Minuten!")
                            Steckd_OG_Schlafz_Schrank.sendCommand(ON)
                            Lampe_OG_Flur_Deko.sendCommand(ON)
                            Lampe_EG_Deko_Wand.sendCommand(ON)
                            t_watchdogdrainage.reschedule(now.plusMinutes(2))
                         } else if (PumpDrainage_vSwitch.state == (ON) && Parents.state == CLOSED) {
                            pushNotification("ALARM: " + now, PumpDrainage_vSwitch.label + " läuft seit Laufzeit Minuten")
                            t_watchdogdrainage.reschedule(now.plusMinutes(2))
                         } else if (PumpDrainage_vSwitch.state == (OFF)) {
                            t_watchdogdrainage.cancel
                            t_watchdogdrainage = null
                            return;
                         }
                      ]
                   }
                }
                end
                Ich habe schon diverse Formatierungen versucht, sowie auch auf verschiedenste Weise veruscht die Zeiten zu berechnen, aber alles verlief in Fehler :-/
                Die ganzen Versuche hier zu listen wäre wohl etwas zu viel, ich habe die auch nicht alle dokumentiert.

                Frage: Wie könnte ich a) die aktuelle Uhrzeit in eine Variable parken (Startzeit) und dann von der neuen aktuellen Uhrzeit abziehen um eine Dauer zu erhalten??

                Kommentar


                  #23
                  Ich habe das dann jetzt so gelöst

                  Code:
                  var int Starttime
                  var int Length
                  In der Rule rechne ich dann mit

                  Code:
                  Starttime = now.getSecondOfDay
                  logInfo("Water", Starttime.toString)
                  Die Laufzeit (in Sekunden) schicke ich mir dann als PushNachricht
                  Code:
                  Length = now.getSecondOfDay - Starttime
                  pushNotification("Note: " + now, PumpDrainage_vSwitch.label + " lief " + Length.toString + " Sekunden!")

                  Kommentar


                    #24
                    Starttime = now.getSecondOfDay
                    Damit wirst Du Probleme bekommen, wenn Du über die Tagesgrenze gehst. Besser mit (Unix)Timestamps arbeiten. Kann ich ggf. auch in einer meiner Rules mal zu nachschauen...

                    Kommentar


                      #25
                      Zitat von wknx Beitrag anzeigen
                      Damit wirst Du Probleme bekommen, wenn Du über die Tagesgrenze gehst. Besser mit (Unix)Timestamps arbeiten. Kann ich ggf. auch in einer meiner Rules mal zu nachschauen...
                      Das wäre klasse, würde ich mir gerne mal ansehen

                      Kommentar


                        #26
                        Probiere es mal mit
                        Code:
                        now.getMillis
                        Habe es es jetzt allerdings nicht selbst ausprobiert, da ich das bei mir doch etwas anderes gelöst habe und jeweils ein eigenes Item vom Type DtaeTime zum Speichern von Zeitpunkte (und senden auf den Bus) verwendet habe...

                        Kommentar


                          #27
                          Ich messe die Laufzeit des Badezimmerlichts um davon abhängig die Nachlaufzeit des Lüfters zu steuern. Im Groben:
                          Code:
                          var Number StartTime
                          var Number StopTime
                          var Number RunTime
                          
                          rule "Einschaltzeit"
                          when
                              Item MyItem changed
                          then
                              if(MyItem.state == ON)
                                  StartTime = now.millis
                              else {
                                  StopTime = now.millis
                                  RunTime = ((StopTime - StartTime)/1000).intValue
                                  logInfo("onTime","Einschaltzeit: {} Sekunden",RunTime)
                              }
                          end
                          Natürlich kann man auf alle Variablen bis auf StartTime verzichten, hier nur der Übersichtlichkeit wegen...

                          Kommentar


                            #28
                            Hmmm, welchen Bezugspunkt (also Nullpunkt) hat denn now.millis ?? Zählt der immer vom Anfang eines Jahres?
                            Dann hätte man also rein theoretisch ein "Problem" wenn über den Jahreswechsel gezählt würde?

                            Nicht, dass die Wahrscheinlichkeit hoch ist, und definitiv geringer als bei einem täglichen zählen.
                            Vor Allem, weil bei mir die Pumpe durchaus über den Tageswechsel laufen kann.

                            Kommentar


                              #29
                              Zitat von JoergA Beitrag anzeigen
                              Hmmm, welchen Bezugspunkt (also Nullpunkt) hat denn now.millis ?? Zählt der immer vom Anfang eines Jahres?
                              Millisekunden seit dem 1. Januar 1970 0:00 UTC ("Unix-Expoche").

                              Das https://de.wikipedia.org/wiki/Jahr-2038-Problem hast Du bei dieser Zeitbasis zum Glück auch nicht, und kannst Dich für die nächsten 290 Mio Jahre entspannt zurück-lehnen (wenn die Pumpen so lange mitspielen) ;-)

                              Kommentar


                                #30
                                Zitat von wknx Beitrag anzeigen
                                Millisekunden seit dem 1. Januar 1970 0:00 UTC ("Unix-Expoche").

                                Das https://de.wikipedia.org/wiki/Jahr-2038-Problem hast Du bei dieser Zeitbasis zum Glück auch nicht, und kannst Dich für die nächsten 290 Mio Jahre entspannt zurück-lehnen (wenn die Pumpen so lange mitspielen) ;-)
                                Die Pumpen evtl. schon, ich weiß nicht, ob ich die so lange überwachen möchte
                                Heißt dann also durch 1000 runden um in Sekunden zu rechnen, richtig? Denn schließlich möchte ich mir nicht die gelaufenen millisekunden anzeigen lassen ;-)

                                Kommentar

                                Lädt...
                                X