Seite 1 von 3

HM-ES-TX-WM - wieso 2 Zähler?

Verfasst: 13.05.2018, 14:18
von fischmir
Hallo zusammen,

ich schlage mich seit Monaten mit dem o.g. Gerät auseinandern; nun möchte ich es aber endlich mal nutzen können.

Ich habe das Gefühl, dass nicht richtig gezählt wird; daher meine erste Frage: Wieso hat das Gerät 2 Energiezähler?

* Energie-Zähler RaspMatic (welcher sich bei mir nicht updated; steht auf 4795.453 kWh)
* Energie-Zähler Gerät (steht aktuell auf 293440.00 Wh und wird regelmäßig höher)

Kann mir jemand sagen, wieso es zwei Zähler gibt?

Viele Grüße,
Christian

Re: HM-ES-TX-WM - wieso 2 Zähler?

Verfasst: 13.05.2018, 15:55
von DrTob
Der geratezähler ist im Sensor selbst. Er wird bei einem Batteriewechsel zurückgestellt. Der andere wird auf der Zentrale verwaltet und erhöht (über ein Programm, das beim anlernen erstellt wird)

Re: HM-ES-TX-WM - wieso 2 Zähler?

Verfasst: 13.05.2018, 16:39
von Xel66
DrTob hat geschrieben:(über ein Programm, das beim anlernen erstellt wird)
Genauer über ein als systemintern gekennzeichnetes Programm, welches ein Script ausführt und die Zählerstände bei Übermittlung der Daten durch den Sensor schreibt. Dieses Programm wird beim Anlernen des Sensors automatisch erstellt.

Gruß Xel66

Re: HM-ES-TX-WM - wieso 2 Zähler?

Verfasst: 13.05.2018, 16:44
von NickHM
Guten Abend

Du kannst das o.g. automatisch erstellte "systeminterne" Programm gefahrlos auf "nicht systemintern" umstellen. Dann siehst Du es auch in Status / Bedienung Programme und dort den Zeitstempel, wann das Programm getriggert wird. So kannst Du fest stellen, ob das darin enthaltene Script überhaupt los läuft, wenn Daten vom Sensor gemeldet werden.

Falls es nicht funktioniert kann man den fehler suchen, oder das Gerät ablernen - Programm wird gelöscht und neu anlernen - Programm wird neu erstellt.

Re: HM-ES-TX-WM - wieso 2 Zähler?

Verfasst: 13.05.2018, 20:16
von fischmir
DrTob hat geschrieben:Der geratezähler ist im Sensor selbst. Er wird bei einem Batteriewechsel zurückgestellt. Der andere wird auf der Zentrale verwaltet und erhöht (über ein Programm, das beim anlernen erstellt wird)
Ich habe mir die Werte anschaut, aber der Energie-Zähler RaspMatic ändert sich nicht mehr, während Energie-Zähler Gerät immer weiter zählt.
NickHM hat geschrieben:Guten Abend

Du kannst das o.g. automatisch erstellte "systeminterne" Programm gefahrlos auf "nicht systemintern" umstellen. Dann siehst Du es auch in Status / Bedienung Programme und dort den Zeitstempel, wann das Programm getriggert wird. So kannst Du fest stellen, ob das darin enthaltene Script überhaupt los läuft, wenn Daten vom Sensor gemeldet werden.

Falls es nicht funktioniert kann man den fehler suchen, oder das Gerät ablernen - Programm wird gelöscht und neu anlernen - Programm wird neu erstellt.
Die Programm werden ausgeführt (zumindest lt. Zeitstempel), aber offentsichtlich passiert nix; der Zähler bleibt ja stehen.

Hat jemand eine Idee, was ich nun tun könnte? Hat jemand das systemintern Script, welches funktioniert? Dann könnte ich die Programm mal ergleichen. Die ist meins:

Danke und Gruß,
Christian

Code: Alles auswählen

object chn = dom.GetObject('3105');
object oBoot = chn.DPByControl('POWERMETER_IGL.BOOT');
object oEnergyCounter = chn.DPByControl('POWERMETER_IGL.ENERGY_COUNTER');
object oSysVarEnergyCounter = dom.GetObject('svEnergyCounter_3105_NEQ0861263:1');
object oSysVarEnergyCounterOldVal = dom.GetObject('svEnergyCounterOldVal_3105');
object oSysVarEnergyCounterResetPressed = dom.GetObject('svEnergyCounter_3105_NEQ0861263:1_RESET');
object oSysVarEnergyCounterTmpOldVal = dom.GetObject('svEnergyCounter_3105_NEQ0861263:1_TMP_OLDVAL');
object oSysVarEnergyCounterDeviceReset = dom.GetObject('svEnergyCounter_3105_NEQ0861263:1_DEVICE_RESET');
boolean bootFlag = oBoot.Value();
real devVal = oEnergyCounter.Value();
real devValMax = oEnergyCounter.ValueMax();
real oldDevVal = oSysVarEnergyCounterOldVal.Value();
real tmpOldDevVal = oSysVarEnergyCounterTmpOldVal.Value();
integer ioldDevVal = (tmpOldDevVal.ToString().ToFloat() * 100000).ToInteger();
real diffVal = 0.0;
real sysVarVal = oSysVarEnergyCounter.Value();
integer tmp_devVal = (devVal.ToString().ToFloat() * 100000).ToInteger();
integer tmp_oldDevVal = (oldDevVal.ToString().ToFloat() * 100000).ToInteger();
if ( oBoot.Value() == true ) {
   oSysVarEnergyCounterDeviceReset.State(true);
   if (ioldDevVal <= 0) {
     oSysVarEnergyCounter.State(0);
   }
} else {
   boolean resetPressed = oSysVarEnergyCounterResetPressed.Value();
   ! boolean devReset = oSysVarEnergyCounterDeviceReset.Value();
   if ( (resetPressed == true) && (oSysVarEnergyCounterDeviceReset.Value() == true) ) {
       oSysVarEnergyCounterTmpOldVal.State(0);
       tmpOldDevVal = 0;
   }
  !Normales Hochzaehlen. Geraetwert > vorheriger Wert
  if ((tmp_devVal >= tmp_oldDevVal) && (oSysVarEnergyCounterDeviceReset.Value() == false)) {
   if (resetPressed == false) {
      diffVal = oEnergyCounter.Value() - oldDevVal;
    } else {
      !Reset pressed
      diffVal = oEnergyCounter.Value() - tmpOldDevVal;
      if ((diffVal.ToString().ToFloat() * 100000).ToInteger() < 0 ) {
		     diffVal = oEnergyCounter.Value();
      }
      oSysVarEnergyCounterResetPressed.State(0);
    }
  } else {
    !Geraetewert ist kleiner vorheriger Wert
   !Entweder Ueberlauf, oder Batterietausch
    if (oSysVarEnergyCounterDeviceReset.Value() == false) {
      !Normaler Geraeteueberlauf
      if(tmp_devVal > 0) {
         diffVal = (oEnergyCounter.Value() + devValMax) - oldDevVal;
      }
    } else {
         !Zaehle Geraetewert zum CCU-Zaehler
          diffVal = oEnergyCounter.Value();
          if ((diffVal.ToString().ToFloat() * 100000).ToInteger() == 0) {
	            oSysVarEnergyCounterDeviceReset.State(true);
           } else {
            oSysVarEnergyCounterDeviceReset.State(false);
          }
    }
  }
  !Erhoehe den CCU-Zaehler
  oSysVarEnergyCounter.State(sysVarVal + diffVal);
  oSysVarEnergyCounterOldVal.State(oEnergyCounter.Value());
  oSysVarEnergyCounterTmpOldVal.State(oEnergyCounter.Value());
}


Re: HM-ES-TX-WM - wieso 2 Zähler?

Verfasst: 17.05.2018, 22:38
von fischmir
Ich habe mir die Werte anschaut, aber der Energie-Zähler RaspMatic ändert sich nicht mehr, während Energie-Zähler Gerät immer weiter zählt.
Ist das ein Bug in RaspMatic?

Re: HM-ES-TX-WM - wieso 2 Zähler?

Verfasst: 27.05.2018, 13:38
von fischmir
*Push*

Re: HM-ES-TX-WM - wieso 2 Zähler?

Verfasst: 27.05.2018, 13:44
von Black
das ist ein dummer effekt... ich hatte den vor ner weile auch. obwohl das programm schlüssig war tats das nicht.

der grund war übel versteckt in der funktion des energiezählers, ich habe mir in IOBroker die Datenpunkte mal angesehen und festgestellt, das aus irgendeinem Grund POWERMETER_IGL.BOOT auf true stand. und dann wird das programm schön und vrav getriggert,
mit

Code: Alles auswählen

if ( oBoot.Value() == true ) {
   oSysVarEnergyCounterDeviceReset.State(true);
   if (ioldDevVal <= 0) {
     oSysVarEnergyCounter.State(0);
   }
} else {
wird aber nix gezählt.

Ich habe die Bedingung getillt, nun tuts alles.

Black

Re: HM-ES-TX-WM - wieso 2 Zähler?

Verfasst: 28.05.2018, 13:28
von fischmir
Hallo Black,

erstmal vielen vielen Dank für deine Antwort. Da schöpfe ich ja wieder Hoffnung, doch noch alle laufen zu bekommen.

Nachdem ich den Code geändert habe auf:

Code: Alles auswählen

! fischmir; 28.05.2018
!if ( oBoot.Value() == true ) {
if ( false == true ) {

   oSysVarEnergyCounterDeviceReset.State(true);
   if (ioldDevVal <= 0) {
     oSysVarEnergyCounter.State(0);
   }
} else {
wird zumindest etwas gezähtl.

Aber in der Zeit, in welcher der "Energie-Zähler Gerät" um 6 kWh gestiegen ist, ist der "Energie-Zähler Gerät" nur um gut kWh gestiegen.

Sind deine Werte konsistent?

Re: HM-ES-TX-WM - wieso 2 Zähler?

Verfasst: 28.05.2018, 14:02
von fischmir
Hmm...ich habe jetzt mal das Script auseinandergenommen und folgende Zeilen hinzugefügt, um die im Kopf definerten Variablen wieder auszugeben:

Code: Alles auswählen

!Ausgabe aller Werte
WriteLine("bootFlag:" # bootFlag);
WriteLine("devVal:" # devVal);
WriteLine("devValMax:" # devValMax);
WriteLine("oldDevVal:" # oldDevVal);
WriteLine("tmpOldDevVal:" # tmpOldDevVal);
WriteLine("ioldDevVal:" # ioldDevVal);
WriteLine("diffVal:" # diffVal);
WriteLine("sysVarVal:" # sysVarVal);
WriteLine("tmp_devVal:" # tmp_devVal);
WriteLine("tmp_oldDevVal:" # tmp_oldDevVal);
Meine Ausgabe sieht wie folgt aus:

Code: Alles auswählen

bootFlag:false
devVal:509200.000000
devValMax:838860.699219
oldDevVal:509200.000000
tmpOldDevVal:509200.000000
ioldDevVal:2147483647
diffVal:0.000000
sysVarVal:4795266.700195
tmp_devVal:2147483647
tmp_oldDevVal:2147483647
Wie man sehen kann, haben die folgenden Variablen einen Wert, welcher nicht korrekt ist (https://de.wikipedia.org/wiki/2147483647):

Code: Alles auswählen

ioldDevVal
tmp_devVal
tmp_oldDevVal
Schauen wir es uns nochmal genauer an:

Code: Alles auswählen

integer tmp_devVal = (devVal.ToString().ToFloat() * 100000).ToInteger();
devVal ist 509200.000000 und als real abgespeichert. Bei der Umwandlung nach integer tmp_devVal scheint etwas schief zu gehen (siehe obrige Zeile), denn der entsprechende int-Wert ist anschließend 2147483647.

Also muss doch hier irgendwo ein Bug drin sein?