HmIP-ESI per Script auslesen - Versuch scheitert

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

jemue
Beiträge: 94
Registriert: 08.10.2013, 14:44
Hat sich bedankt: 4 Mal
Danksagung erhalten: 1 Mal

Re: HmIP-ESI per Script auslesen - Versuch scheitert

Beitrag von jemue » 17.04.2024, 07:58

Will das Thema mal wieder angehen und muss es noch einmal ansprechen:

Hat jemand hier im Forum eine Idee, wie man die Messdaten (Zählerstand und Verbrauchsdaten) vom HmIP-ESI-Gas in Variable schreiben und somit auslesen kann?
Würde mich über eine Lösung sehr freuen - vorab ein Danke ins Forum.
LG jemue
--------------------------------------------------------------------
CCU3 mit RaspberryMatic

Benutzeravatar
Baxxy
Beiträge: 10865
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 611 Mal
Danksagung erhalten: 2235 Mal

Re: HmIP-ESI per Script auslesen - Versuch scheitert

Beitrag von Baxxy » 17.04.2024, 08:48

jemue hat geschrieben:
17.04.2024, 07:58
eine Idee
Ja, besser mitarbeiten. :wink:
Baxxy hat geschrieben:
29.02.2024, 14:40
Punkt 1 um weiterzukommen wäre erstmal die beiden zum Zähler gehörenden internen Programme zu suchen, zu öffnen und deren jeweilige Scripte zu zeigen.

Eins dürfte "counter" im Namen tragen, das andere "ValuesAtMidnight".

Einigmamatic
Beiträge: 3
Registriert: 19.04.2024, 11:00
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 2 Mal

Re: HmIP-ESI per Script auslesen - Versuch scheitert

Beitrag von Einigmamatic » 20.04.2024, 23:22

Hallo zusammen,

nage gerade an demselben Problem. Versuche über ein Script den Gaszählerstand auszulesen. Liefert aber leider "0" zurück. Die Idee ist einfach den Zählerstand an eine Systemvariable zu übergeben und dann im Programm damit weiter zu arbeiten.

Code: Alles auswählen

var srcobj = dom.GetObject("HmIP-RF.xxxxxxxxxxxx:2.GAS_VOLUME").Value();
var dstobj = dom.GetObject("Gaszaehler");
var srcval = srcobj.Value();
if (srcval != dstobj.Value()) {
  dstobj.State(srcval);
}
Hat jemand eine Idee was da klemmt? Danke vorab.
Zuletzt geändert von alchy am 21.04.2024, 09:10, insgesamt 1-mal geändert.
Grund: Code in Codetags posten

Benutzeravatar
Baxxy
Beiträge: 10865
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 611 Mal
Danksagung erhalten: 2235 Mal

Re: HmIP-ESI per Script auslesen - Versuch scheitert

Beitrag von Baxxy » 20.04.2024, 23:37

Einigmamatic hat geschrieben:
20.04.2024, 23:22
Hat jemand eine Idee was da klemmt?
Ja, deine Scriptfähigkeiten sind wohl etwas eingerostet. :wink:

Code: Alles auswählen

object srcobj = dom.GetObject("HmIP-RF.xxxxxxxxxxxx:2.GAS_VOLUME");
object dstobj = dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Gaszaehler");
var srcval = srcobj.Value();
if (srcval != dstobj.Value()) {
dstobj.State(srcval);
}
Warum wollen alle immer den "Zählerstand" aus dem Gerät auslesen?
- der entspricht nie dem realen Zählerstand der Messstelle
- er ist flüchtig, beginnt also nach Batteriewechsel bei 0

Die zum Zähler gehörende systeminterne SysVar ist da doch viel besser geeignet.

Xel66
Beiträge: 14174
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 589 Mal
Danksagung erhalten: 1501 Mal

Re: HmIP-ESI per Script auslesen - Versuch scheitert

Beitrag von Xel66 » 21.04.2024, 10:05

Baxxy hat geschrieben:
20.04.2024, 23:37
Warum wollen alle immer den "Zählerstand" aus dem Gerät auslesen?
Weil sie eben nichts von der Datenhaltung im Hintergund wissen, weil das System nur benutzt, aber nicht verstanden wird. Und weil die Daten beim Gerät dargestellt werden. Bei vielen Dingen kommt man mit "ich lese keine Anleitungen, ich drücke solange Knöpfe, bis es funktioniert" weiter. Bei Homematic kommt man mit dieser Einstellung nun mal schnell an Grenzen.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

Einigmamatic
Beiträge: 3
Registriert: 19.04.2024, 11:00
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 2 Mal

Re: HmIP-ESI per Script auslesen - Versuch scheitert

Beitrag von Einigmamatic » 21.04.2024, 14:14

Hallo Baxxy,

danke, das hilft weiter. Eingerostet nehme ich als Kompliment. :)
Blutiger Anfänger passt besser. Ich versuche mich gerade an das Thema heranzutasten.

magnum1795
Beiträge: 268
Registriert: 13.05.2020, 17:56
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 48 Mal
Danksagung erhalten: 23 Mal

Re: HmIP-ESI per Script auslesen - Versuch scheitert

Beitrag von magnum1795 » 22.04.2024, 16:53

möchte mich hier mal mit anhängen. Auch ich möchte gern die Werte "Verbrauch Heute, Verbrauch Gestern, Verbrauch 7 Tage und Verbrauch 30 Tage in SYstemvariablen schreiben lassen. Klappt aber bei mir auch nicht. Wie könnte ich die SV anlegen und was muss dann drin stehen? Vielen Dank schon mal.

Die SV sollten dann so heißen

GVerbrauchH
GVerbrauchG
GVerbrauch7
GVerbrauch30


Das interne Programm sieht so aus wie auf den Bild und das dazugehörige Script so

Code: Alles auswählen

object chn = dom.GetObject('46331');
object oEnergyCounter = chn.DPByControl('POWERMETER_PSM.GAS_VOLUME');
object oSysVarEnergyCounter = dom.GetObject('svEnergyCounter_46331_003FA2698AB51A:2');
object oSysVarEnergyCounterOldVal = dom.GetObject('svEnergyCounterOldVal_46331');
real devVal = oEnergyCounter.Value();
real devValMax = oEnergyCounter.ValueMax();
real oldDevVal = oSysVarEnergyCounterOldVal.Value();
real diffVal = 0.0;
real sysVarVal = oSysVarEnergyCounter.Value();
integer tmp_devVal = (devVal.ToString().ToFloat() * 1000).ToInteger();
integer tmp_oldDevVal = (oldDevVal.ToString().ToFloat() * 1000).ToInteger();
real energy0 = chn.MetaData('energy0').ToFloat();
if (tmp_oldDevVal > tmp_devVal) {
! An device overflow has occured
! diffVal = (devVal + devValMax) - oldDevVal;
} else {
diffVal = devVal - oldDevVal;
}
if (tmp_devVal != 0) {oSysVarEnergyCounterOldVal.State(devVal);
oSysVarEnergyCounter.State(sysVarVal + diffVal);
! Save todays energy consumption
chn.MetaData('energy0',energy0 + diffVal);
}
Dateianhänge
gas1.jpg
gas3.jpg

Benutzeravatar
Baxxy
Beiträge: 10865
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 611 Mal
Danksagung erhalten: 2235 Mal

Re: HmIP-ESI per Script auslesen - Versuch scheitert

Beitrag von Baxxy » 22.04.2024, 17:07

magnum1795 hat geschrieben:
22.04.2024, 16:53
Das interne Programm sieht so aus wie auf den Bild und das dazugehörige Script so
Damit kann ich arbeiten, danke.

Eine Idee habe ich schon, wenn's fertig ist gebe ich bescheid. :)


magnum1795
Beiträge: 268
Registriert: 13.05.2020, 17:56
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 48 Mal
Danksagung erhalten: 23 Mal

Re: HmIP-ESI per Script auslesen - Versuch scheitert

Beitrag von magnum1795 » 22.04.2024, 18:17

@ Baxxy
erstmal einen großen Dank für deine Mühen. Habe mal meine Scripts so angepasst wie du geschrieben hast in der HoTo. Leider werden aber die SV (noch) nicht beschrieben.

mein Script sieht jetzt so aus

Code: Alles auswählen

object chn = dom.GetObject('46331');
object oEnergyCounter = chn.DPByControl('POWERMETER_PSM.GAS_VOLUME');
object oSysVarEnergyCounter = dom.GetObject('svEnergyCounter_46331_003FA2698AB51A:2');
object oSysVarEnergyCounterOldVal = dom.GetObject('svEnergyCounterOldVal_46331');
real devVal = oEnergyCounter.Value();
real devValMax = oEnergyCounter.ValueMax();
real oldDevVal = oSysVarEnergyCounterOldVal.Value();
real diffVal = 0.0;
real sysVarVal = oSysVarEnergyCounter.Value();
integer tmp_devVal = (devVal.ToString().ToFloat() * 1000).ToInteger();
integer tmp_oldDevVal = (oldDevVal.ToString().ToFloat() * 1000).ToInteger();
real energy0 = chn.MetaData('energy0').ToFloat();
if (tmp_oldDevVal > tmp_devVal) {
! An device overflow has occured
! diffVal = (devVal + devValMax) - oldDevVal;
} else {
diffVal = devVal - oldDevVal;
}
if (tmp_devVal != 0) {oSysVarEnergyCounterOldVal.State(devVal);
oSysVarEnergyCounter.State(sysVarVal + diffVal);
! Save todays energy consumption
chn.MetaData('energy0',energy0 + diffVal);
object oOwnZaehlerstand_SysVar = dom.GetObject ('46331').Get ("Gaszähler - Zählerstand");
object oOwnVerbrauchHeuteSysVar = dom.GetObject ('46331').Get ("Gaszähler - Verbrauch heute");
 if (oOwnZaehlerstand_SysVar) { oOwnZaehlerstand_SysVar.State(sysVarVal + diffVal); }
 if (oOwnVerbrauchHeuteSysVar) { oOwnVerbrauchHeuteSysVar.State(energy0 + diffVal); } 
}

Code: Alles auswählen

integer loop = 0;
string last30Days = '';
string val;
real energy7 = 0.0;
real energy30 = 0.0;
object chn = dom.GetObject('46331');
! Retrieve energyCounter30Days
string energyCounter30Days = chn.MetaData('energyCounter30Days');
! Retrieve todays value
real energy0 = chn.MetaData('energy0').ToFloat();
! Move the values of the array energyCounter30Days one position to the right
foreach (val, energyCounter30Days.Split(',')) {
if (loop <= 28 ) {
last30Days = last30Days + val + ',';
} else {
if (loop == 29) {
last30Days = last30Days + val;
}
}
loop = loop + 1;
}
! Set the first position of the array energyCounter30Days to todays value.
last30Days = energy0.ToString(1) + ',' + last30Days;
!Store energyCounter30Days as meta data
chn.MetaData('energyCounter30Days', last30Days);
! Set the meta data of energy1 (yesterday), energy7 (week) and energy30 (months)
loop = 0;
foreach (val, last30Days.Split(',')) {
val = val.ToFloat();
if (loop == 0) {chn.MetaData('energy1', val);}
if (loop <= 6) {
energy7 = energy7 + val;
}
energy30 = energy30 + val;
loop = loop +1;
}
object oOwnVerbrauchHeuteSysVar = dom.GetObject ('46331').Get ("Gaszähler - Verbrauch heute");
object oOwnVerbrauchGesternSysVar = dom.GetObject ('46331').Get ("Gaszähler - Verbrauch gestern");
object oOwnVerbrauchLetzte7SysVar = dom.GetObject ('46331').Get ("Gaszähler - Verbrauch letzte 7 Tage");
object oOwnVerbrauchLetzte30SysVar = dom.GetObject ('46331').Get ("Gaszähler - Verbrauch letzte 30 Tage");
if (oOwnVerbrauchLetzte7SysVar) { oOwnVerbrauchLetzte7SysVar.State(energy7); }
if (oOwnVerbrauchLetzte30SysVar) { oOwnVerbrauchLetzte30SysVar.State(energy30); }
if (oOwnVerbrauchGesternSysVar) { oOwnVerbrauchGesternSysVar.State(energy0); }
if (oOwnVerbrauchHeuteSysVar) { oOwnVerbrauchHeuteSysVar.State(0.0); }
chn.MetaData('energy7', energy7);
chn.MetaData('energy30', energy30);
! Reset energy0 (today) - a new day begins
chn.MetaData('energy0', 0.0);
 
müssen denn die Gänzefüße mit rein oder nicht? ('46331') und Sorry für meine Dummen Fragen, verstehe aber nichts vom Scripten
Dateianhänge
gas sv leer.jpg
gas sv.jpg

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“