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

Einrichtung, Nutzung und Hilfe zu RaspberryMatic (OCCU auf Raspberry Pi)

Moderatoren: jmaus, Co-Administratoren

fischmir
Beiträge: 972
Registriert: 03.02.2014, 18:04
Wohnort: Münsterland
Hat sich bedankt: 27 Mal
Danksagung erhalten: 8 Mal

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

Beitrag von fischmir » 28.05.2018, 14:21

...so...und wenn ich nun den geschachtelten Befehl "auseinanderpflücke", dann kommt folgendes dabei raus:

Code: Alles auswählen

string tmp_devVal_string = devVal.ToString();
float tmp_devVal_float = tmp_devVal_string.ToFloat();
...und die 2. Zeile wird angemckert. Wie mache ich es denn richtig?

Code: Alles auswählen

Error 1 at row 18 col 27 near ^ tmp_devVal_float = tmp_devVal_string.ToFloat();
integer tmp_devVal = (devVal.To
Parse following code failed:
Danke und Gruß,
Christian

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

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

Beitrag von alchy » 28.05.2018, 14:40

Datentyp float ?
Schau mal in die Sprachbeschreibung. (link zur Doku in meiner Signatur)

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Benutzeravatar
Black
Beiträge: 5480
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 424 Mal
Danksagung erhalten: 1074 Mal
Kontaktdaten:

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

Beitrag von Black » 28.05.2018, 15:15

fischmir hat geschrieben: .....
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?
Ja, Seit Monaten laufen die beiden Werte (Zählwerk im Stromzähler, Energiezähler der CCU und in IObroker ) Synchron. Ich hab da über mehrer Monate nen jitter gehabt in der summe vom + 0.05 etwa... also zu vernachlässigen.

Bei mir siehts so aus: (auch etwas modifizierte Originalscripte)
erstmal das versteckte Programm in den Sichtbaren Bereich geholt

Klickibunte geärteauswahl Energiezähler Gerät bei >=0 auf Aktualisierung

Die Kanalnummern gemäß deinem Zähler anpassen


Code: Alles auswählen

!- Stromzähler
!- Modifiziertes Original Script
object oSRC  = dom.GetObject ("$src$");
object chn   = dom.GetObject('4138');
object oBoot = chn.DPByControl('POWERMETER_IGL.BOOT');
object oEnergyCounter = chn.DPByControl('POWERMETER_IGL.ENERGY_COUNTER');

!- triger war der Zähler

if (oSRC) {
	object oSysVarEnergyCounter = dom.GetObject('svEnergyCounter_4138_MEQ0706025:1');
	object oSysVarEnergyCounterOldVal = dom.GetObject('svEnergyCounterOldVal_4138');
	object oSysVarEnergyCounterResetPressed = dom.GetObject('svEnergyCounter_4138_MEQ0706025:1_RESET');
	object oSysVarEnergyCounterTmpOldVal = dom.GetObject('svEnergyCounter_4138_MEQ0706025:1_TMP_OLDVAL');
	object oSysVarEnergyCounterDeviceReset = dom.GetObject('svEnergyCounter_4138_MEQ0706025: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();


	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());

	real rStromZaehler= ((sysVarVal + diffVal)/1000);
	dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Stromzaehler").State (rStromZaehler.Round (2));
	string sZaehlerAlt = dom.GetObject (ID_SYSTEM_VARIABLES).Get ("StromzaehlerStore").State ();
	dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Strom Heute").State ((rStromZaehler- sZaehlerAlt.StrValueByIndex (";",0).ToFloat () ).Round (2));
	dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Strom Monat").State ((rStromZaehler- sZaehlerAlt.StrValueByIndex (";",1).ToFloat () ).Round (2));
	dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Strom Jahr") .State ((rStromZaehler- sZaehlerAlt.StrValueByIndex (";",2).ToFloat () ).Round (2));
}
um 00:01 läuft bei mir ein Programm, welches die Zähler auswertet:

Code: Alles auswählen

!- Stromzähler
!- Modifiziertes Original Script
object oSRC  = dom.GetObject ("$src$");

if (oSRC) {
	object oStore= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("StromzaehlerStore");
	real rStromzaehler= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Stromzaehler").State ();
	real rStromHeute  = dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Strom Heute").State ();
	dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Strom Gestern").State (rStromHeute);
	string sHeute= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Stromzaehler").State ().ToString (2);
	string sMonat= oStore.State ().StrValueByIndex (";",1);
	string sJahr = oStore.State ().StrValueByIndex (";",2);
	dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Strom Heute").State (0);
	if (system.Date ("%d").ToInteger()==1) {
		!- 1. Des Monats, Monatszähler zurücksetzen
		sMonat= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Stromzaehler").State ().ToString (2);
		dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Strom Monat").State (0);
		if (system.Date ("%m").ToInteger () ==1) {
			!- 1. Januar
			sJahr= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Stromzaehler").State ().ToString (2);
			dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Strom Jahr").State (0);
		}	
	}
	!- Nun den SpeicherWert ausrechnen und Zurückschreiben
	oStore.State (sHeute # ";" # sMonat # ";" # sJahr);
}
ich denk mal, hier findest den Ansatz, dein Prog so finzubiegen dass es passt.

Da sind natürlich noch Systemvariablen drin für meine Zählerauswertung !!

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

fischmir
Beiträge: 972
Registriert: 03.02.2014, 18:04
Wohnort: Münsterland
Hat sich bedankt: 27 Mal
Danksagung erhalten: 8 Mal

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

Beitrag von fischmir » 28.05.2018, 18:51

Hallo Black,

vielen Dank dafür! Ich schaue mal, was ich daraus nutzen kann.

Nur zur Sicherheit: CCU oder Raspimatic?

Gruß,
Christian

fischmir
Beiträge: 972
Registriert: 03.02.2014, 18:04
Wohnort: Münsterland
Hat sich bedankt: 27 Mal
Danksagung erhalten: 8 Mal

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

Beitrag von fischmir » 28.05.2018, 19:00

Hallo alchy,

ja vertanden. Lustig dass eine MEthode .ToFloat einen real erwartet.

Ich bekomme das mit dem Casting von Real auf int noch nicht richtig hin. Hast du da einen Tip?

Viele Grüße,
Christian

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

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

Beitrag von alchy » 28.05.2018, 20:59

fischmir hat geschrieben: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.
Sehr lustig,

Code: Alles auswählen

real devVal= 509200.000000;
integer tmp_devVal = (devVal.ToString().ToFloat() * 100000).ToInteger();
ergibt also 2147483647

abgesehen von diesem Konstruktcode ist die Zahl nur bedingt schuldig.

fischmir hat geschrieben:Also muss doch hier irgendwo ein Bug drin sein?
Aber feste.
Ich würde mal sagen, alles oberhalb von 21474.000000

Code: Alles auswählen

real devVal= 21474.000000 ;
integer tmp_devVal = (devVal.ToString().ToFloat() * 100000).ToInteger();
ergibt die achte Mersenne-Primzahl.

Das kannst du EQ3 melden.

Und weil es so lustig ist kannst du gleich mal anmahnen, warum Zahlen die größer als die o.g. Primzahl 2147483647 sind bei .ToInteger()
für Verwirrung stiften. :roll:

Als wie immer gefordertes Beispiel kannst du dann auch das Fragen:

Code: Alles auswählen

real devVal= 2147483648.000000 ;
integer itemp = devVal.ToInteger();
WriteLine("aus dem Wert: " #devVal #" wird integer = " #itemp);  


Alchy
Zuletzt geändert von alchy am 28.05.2018, 21:11, insgesamt 1-mal geändert.
Grund: Beispielcode

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

fischmir
Beiträge: 972
Registriert: 03.02.2014, 18:04
Wohnort: Münsterland
Hat sich bedankt: 27 Mal
Danksagung erhalten: 8 Mal

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

Beitrag von fischmir » 28.05.2018, 21:15

Hallo alchy,

da ich zu diesem Thema schon ein Ticket offen hatte, habe ich nun die Neuen Infos hinterhergeschoben. Mal schauen was da kommt.

Kannst du einschätzen, ob dieses Problem abhängig von der Plattform ist (also CCU2 oder Raspimatic)? Sonst sollte man vielleicht noch Jens informieren?

Viele Grüße,
Christian

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

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

Beitrag von alchy » 28.05.2018, 21:28

Ist *IMHO* wahrscheinlich plattformunabhängig, da eher ein Feature-RegaHss Problem.
Klar kannst du das auch jmaus melden.

Ich habe > H I E R < mal einen Thread im Forum hinterlassen als nun bekannter Bug.
Sollte wer rauskriegen, das ich mit meiner Behauptung falsch liege kann er sich ja da melden.

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

NickHM
Beiträge: 3733
Registriert: 23.09.2017, 12:04
Hat sich bedankt: 66 Mal
Danksagung erhalten: 120 Mal

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

Beitrag von NickHM » 30.05.2018, 07:43

Guten Morgen

ich finde die Grundsatzdiskussion in dem abgespaltenen Beitrag ja auch interessant, frage mich aber grade, warum der Fehler nicht bei jedem CCU User mit Stromzähler auf tritt??

Die Zeile mit der Integer Wandlung ist in dem automatisch angelegten systeminternen Script des Stromzählers. Also müsste die Berechnung bei jeder CCU bei erreichen der Interger Grenze falsch sein.

Nun hat der interne Gerätezähler des Sensors allerdings einen Überlauf bei
2^23 = 8.388.607
die Integer Grenze von 2.147.483.647 wird also nie erreicht.

Warum tritt dann überhaupt der Fehler auf, der hier bemängelt wird? Ich habe es noch nicht verstanden :(

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

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

Beitrag von alchy » 30.05.2018, 16:46

8.388.607 * 100000

Ich habe das Gerät nicht und auch keine Zeit und im Moment vor allem wenig Lust, mir den Code genauer anzuschauen.
Wie schon geschrieben, gehe ich davon aus, das fischmir die geposteten Werte nicht irgendwie anderweitig beeinflusst hat, also muss es ja möglich sein, das Verhalten zu reproduzieren.

Wenn ich den von fischmir geposteten Code mal zusammenstreiche auf das Allernötigste bis zum ersten Auftreten der Integerwandlung

Code: Alles auswählen

object chn = dom.GetObject('3105'); ! Kanalobject ISE_ID oder passender Kanalname HM-ES-TX-WM 
object oEnergyCounter = chn.DPByControl('POWERMETER_IGL.ENERGY_COUNTER'); ! Datenpunkt
real devVal = oEnergyCounter.Value(); ! realWert des Datenpunkt 
integer tmp_devVal = (devVal.ToString().ToFloat() * 100000).ToInteger(); ! Konstrukt und Multiplikation sowie Umwandlung zu integer
würde also theoretisch ab einem Gerätezählerstand von 21474+ in tmp_devVal den falschen Wert zur weiteren Verarbeitung verwendet. (Da ja mit 100000 multipliziert wird).
Dieselbe Wandlung kommt noch mehrmals im Script vor.

Nun könnte ich zwar die Zähler meiner PSM oder BSM usw. so hochtunen, aber das wäre ja das falsche Gerät und damit Script und wahrscheinlich auch nicht aussagekräftig, da künstlich erzeugt.
Ich muss gestehen, das meine Geräte noch nie so einen hohen Zählerstand hatten, da immer wieder auf die ein oder andere Art resettet wurde.
Die Integer Umwandlung ist dort ja auch in anderen Gerätescripten zu finden.

Ich kann fischmir nur raten seine Zähler zu resetten und die Sache zu beobachten. Vielleicht hat sich auch irgendwann bei Ihm etwas verschluckt.
Das würde zumindest erklären, warum es noch nicht zu so einer Meldung kam, zumindest soweit ich mich erinnere.
Vielleicht sind die Scripte in Summe so gut, das alles abgefangen wird - die Programmierer werden schon wissen, warum sie es so gemacht haben.

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Antworten

Zurück zu „RaspberryMatic“