Verbrauch HMIP-PSM

HMIP lokale Installation

Moderator: Co-Administratoren

TheCrusher
Beiträge: 75
Registriert: 28.05.2020, 10:21
System: CCU
Hat sich bedankt: 14 Mal

Verbrauch HMIP-PSM

Beitrag von TheCrusher » 27.06.2020, 00:46

Hallo,

neues Projekt, neues Problem.

Die Gartenpumpe soll den Verbrauch bei 2 Parteien ein wenig aufschlüsseln.

Partei 1 schaltet die Pumpe über Kanal 3 an. Partei 2 über Kanal 4

wenn nur ein Kanal an bzw ausgeschaltet wird, habe ich kein Problem, den generierten Verbruch in die jeweilige Variable zu schreiben. Allerdings gibt es ja nicht nur

3 aus, 4 an-> 4 aus -> Verbrauch in 4
4 aus, 3 an-> 3 aus-> Verbrauch in 3

4 weitere szenarien sind ja noch relevant.

3an, 4 aus-> 4 an -> Verbrauch 3
4 an, 3 aus-> 3 an -> Verbrauch 4

4 an, 3 an -> 3 aus -> beide zur hälfte
4 an, 3 an -> 4 aus -> beide zur hälfte

habe dazu folgendes Programm geschrieben, aber irgendwie funktioniert das nicht wirklich. Wo da mein Fehler liegt ist mir auch nicht klar
Bildschirmfoto 2020-06-27 um 00.34.47.png
Bildschirmfoto 2020-06-27 um 00.34.33.png
Bildschirmfoto 2020-06-27 um 00.34.12.png

Vielleicht hat ja einer den entscheidenden Tip parat.

Vielen Dank schon mal

VG Stefan

MichaelN
Beiträge: 9677
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1625 Mal

Re: Verbrauch HMIP-PSM

Beitrag von MichaelN » 27.06.2020, 08:47

Ich weiß nicht, was deine skripte machen, aber ich würde das ganz anders aufbauen :

Je ein Skript das beim ein und beim ausschalten der Pumpe aufgerufen wird.

Beim einschalten schreibst du Kanal Nummer und Zählerstand oder Zeitstempel oder wie auch immer du den Verbrauch misst, in eine Werte liste.

Beim ausschalten holst du den Zählerstand des betroffenen Kanal wieder aus der Werteliste und berechnest den Verbrauch.

Dann ist es egal in welcher Kombination ein oder ausgeschaltet wird.

Es ist ja auch noch möglich :

Kanal 3 ein, Kanal 4 halbe Stunde später ein, Kanal 4 aus, Kanal 3 halbe Stunde später aus... Etc
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

dondaik
Beiträge: 12927
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1603 Mal
Danksagung erhalten: 222 Mal

Re: Verbrauch HMIP-PSM

Beitrag von dondaik » 27.06.2020, 10:44

und es ist ja auch möglich die gleichzeitigkeit einfach zu unterbinden.....
( solch langen logik-"tabellen" ) mag die ccu eh nicht wirklich... )
-------
!!! der download der handbüchern auf den seiten von eq3 und das lesen der tips und tricks kann das hm-leben sehr erleichtern - das nutzen der suche nach schlagworten ebenso :mrgreen: !!!
wer schreibfehler findet darf sie behalten.

TheCrusher
Beiträge: 75
Registriert: 28.05.2020, 10:21
System: CCU
Hat sich bedankt: 14 Mal

Re: Verbrauch HMIP-PSM

Beitrag von TheCrusher » 27.06.2020, 12:18

MichaelN hat geschrieben:
27.06.2020, 08:47
Ich weiß nicht, was deine skripte machen, aber ich würde das ganz anders aufbauen :

Je ein Skript das beim ein und beim ausschalten der Pumpe aufgerufen wird.

Beim einschalten schreibst du Kanal Nummer und Zählerstand oder Zeitstempel oder wie auch immer du den Verbrauch misst, in eine Werte liste.

Beim ausschalten holst du den Zählerstand des betroffenen Kanal wieder aus der Werteliste und berechnest den Verbrauch.

Dann ist es egal in welcher Kombination ein oder ausgeschaltet wird.

Es ist ja auch noch möglich :

Kanal 3 ein, Kanal 4 halbe Stunde später ein, Kanal 4 aus, Kanal 3 halbe Stunde später aus... Etc
meine Skript sieht dazu so aus aktuell
Bildschirmfoto 2020-06-27 um 12.13.11.png

Code: Alles auswählen

!Verbrauch Pumpe EG
!-------------------------------------------------------

real a = dom.GetObject("svEnergyCounter_1439_0001D3C99C9B5B:6").Value();
a = a/1000;
real b = dom.GetObject("PumpeEG").Value();
real c = a+b;
dom.GetObject("PumpeEG").State(c);

!CCU Zähler Pumpe reset
!---------------------------------------------------

dom.GetObject("svEnergyCounter_1439_0001D3C99C9B5B:6").State(0);

analog das gleiche zum Kanal 3, dementsprechend angepasst.

Dann ist es egal in welcher Kombination ein oder ausgeschaltet wird.
das wäre quasi das Endprodukt. aber wie ich da hin komme, habe ich keine Idee bzw Ansatz.

MichaelN
Beiträge: 9677
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1625 Mal

Re: Verbrauch HMIP-PSM

Beitrag von MichaelN » 27.06.2020, 12:58

Habe ich doch beschrieben. Was ist noch unklar?
Wenn das mit der Werte Liste zu komplex ist - für nur 2 Verbraucher wäre es wohl auch Overkill - es geht auch einfacher mit 2 getrennten Systemvariablen je Verbraucher
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

MichaelN
Beiträge: 9677
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1625 Mal

Re: Verbrauch HMIP-PSM

Beitrag von MichaelN » 27.06.2020, 21:14

Da ich eine kleine intellektuelle Herausforderung brauchte:

Du brauchst genau dieses eine Programm: (EDIT: entgegen dem Scrrenshot muss bei AUSschalten "nur prüfen" gewählt werden)
Unbenannt.jpg
Dort fügst Du dieses Skript ein und passt noch die Namen deiner SV an:

Code: Alles auswählen

!- Strom getrennt nach Kanal abrechnen / MN 26.06.2022
!- https://homematic-forum.de/forum/viewtopic.php?f=60&t=59546&p=590070#p590070
!- WENN Pumpe:3 Schaltzustand EIN bei Änderung auslösen
!- ODER Pumpe:3 Schaltzustand AUS nur prüfen
!- ODER Pumpe:4 Schaltzustand EIN bei Änderung auslösen
!- ODER Pumpe:4 Schaltzustand AUS nur prüfen
!- DANN dieses SKRIPT _verzögert_ um 3 Sekunden OHNE Retriggerung

!- Definitionen, ggf. anpassen
string Zaehlername = "svEnergyCounter_15140_0001D3C99CAC8A:6";
string NameSV3_gesamt = "Zaehler3ges";
string NameSV4_gesamt = "Zaehler4ges";
string NameSV3_ein = "Zaehlerstand3ein";
string NameSV4_ein = "Zaehlerstand4ein";
real Einheit = 1000; !- 1 für Wh, 1000 für kWh

!- hier nichts mehr anpassen
string kanal;
object oSrc;
real ZaehlerGesamt;
real ZaehlerAktuell;
real ZaehlerAlt3;
real ZaehlerAlt4;
real Diff3;
real Diff4;
real DiffTeilen;
real DiffRest;

!dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: START"); ! debug
!- welcher Kanal?
oSrc = dom.GetObject("$src$");
kanal = (dom.GetObject(oSrc.Channel())).ChnNumber();
!- aktueller Status 0 = aus / 1 = ein
string sVal = "$val$";

ZaehlerAktuell = dom.GetObject(Zaehlername).Value();
ZaehlerAktuell = ZaehlerAktuell/Einheit;
ZaehlerAlt3 = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV3_ein).State();
ZaehlerAlt4 = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV4_ein).State();

if ( kanal == "3" )
   {
   !- Kanal 3 betätigt
   !dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: Kanal 3 betätigt"); ! debug
   if ( sVal == "0" )
      {
      !- ausgeschaltet
      !dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: 3 ausgeschaltet"); ! debug
      ZaehlerGesamt = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV3_gesamt).State();
      Diff3 = ( ZaehlerAktuell -  ZaehlerAlt3 );
      if ( ZaehlerAlt4 > 0 )
         {
         !- Zaehler 4 läuft parallel, hälftig abrechnen
         !dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: hälftig abrechnen"); ! debug
         Diff4 = ( ZaehlerAktuell -  ZaehlerAlt4 );
         DiffTeilen = Diff4.Min(Diff3);
         DiffRest = Diff3 - DiffTeilen;
         Diff3 = DiffRest + ( DiffTeilen / 2 );
         ZaehlerAlt4 = ZaehlerAlt4 + ( DiffTeilen / 2 );
         dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV4_ein).State(ZaehlerAlt4);
         }
       !- hochzählen
       !dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: hochgezählt " #Diff3); ! debug
       ZaehlerGesamt = ZaehlerGesamt + Diff3;

      dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV3_gesamt).State(ZaehlerGesamt);
      dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV3_ein).State(0);
      } else {
      !- eingeschaltet, Zählerstand merken
      dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: 3 eingeschaltet"); ! debug
      dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV3_ein).State(ZaehlerAktuell);
      }
   }

if ( kanal == "4" )
   {
   !- Kanal 4 betätigt
   !dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: Kanal 4 betätigt"); ! debug
   if ( sVal == "0" )
      {
      !- ausgeschaltet
      !dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: 4 ausgeschaltet"); ! debug
      ZaehlerGesamt = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV4_gesamt).State();
      Diff4 = ( ZaehlerAktuell -  ZaehlerAlt4 );
      if ( ZaehlerAlt3 > 0 )
         {
         !- Zaehler 3 läuft parallel, hälftig abrechnen
         !dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: hälftig abrechnen"); ! debug
         Diff3 = ( ZaehlerAktuell -  ZaehlerAlt3 );
         DiffTeilen = Diff3.Min(Diff4);
         DiffRest = Diff4 - DiffTeilen;
         Diff4 = DiffRest + ( DiffTeilen / 2 );
         ZaehlerAlt3 = ZaehlerAlt3 + ( DiffTeilen / 2 );
         dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV3_ein).State(ZaehlerAlt3);
         }
       !- hochzählen
       !dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: hochgezählt " #Diff4); ! debug
       ZaehlerGesamt = ZaehlerGesamt + Diff4;

      dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV4_gesamt).State(ZaehlerGesamt);
      dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV4_ein).State(0);
      } else {
      !- eingeschaltet, Zählerstand merken
      !dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: 4 eingeschaltet"); ! debug
      dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV4_ein).State(ZaehlerAktuell);
      }
   }
!dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: ENDE"); ! debug


Also diesen Block an deine Gegebenheiten anpassen (das was zwischen den "" steht):

Code: Alles auswählen

!- Definitionen, ggf. anpassen
string Zaehlername = "svEnergyCounter_1123456789ABCDEFG:6";
string NameSV3_gesamt = "Zaehler3ges";
string NameSV4_gesamt = "Zaehler4ges";
string NameSV3_ein = "Zaehlerstand3ein";
string NameSV4_ein = "Zaehlerstand4ein";
real Einheit = 1000; !- 1 für Wh, 1000 für kWh
EDIT: 26.06.2022 an RaspberryMatic angepasst
Zuletzt geändert von MichaelN am 26.06.2022, 11:07, insgesamt 5-mal geändert.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

TheCrusher
Beiträge: 75
Registriert: 28.05.2020, 10:21
System: CCU
Hat sich bedankt: 14 Mal

Re: Verbrauch HMIP-PSM

Beitrag von TheCrusher » 28.06.2020, 17:37

Code: Alles auswählen

!- Definitionen: Variablennamen zwischen den "" an eigene Gegebenheiten anpassen
string Zaehlername = "svEnergyCounter_1439_0001D3C99C9B5B:6";
string NameSV3_gesamt = "PumpeOG_ges";
string NameSV4_gesamt = "PumpeEG_ges";
string NameSV3_ein = "PumpeOG_EIN";
string NameSV4_ein = "PumpeEG_EIN";
geht so halb :?:
OG ein -> schreibt den aktuellen Zählerstand in die var OG_EIN...OG aus->addiert dann den Verbrauch zu OG_ges dazu.

bei EG ein .-> schreibt er nix in EG_EIN (bleibt auf 0) -> dadurch bei EG aus -> addiert den Wert "Zählername" zu EG_ges.
ob die Halbierungen bei soweit funktionieren kann ich noch nicht sagen.

wo muss die Anpassung rein, das ich statt zb 10000,00 wh, 10,00 kWh angezeigt bekomme

Code: Alles auswählen

ZaehlerAktuell = dom.GetObject(Zaehlername).Value();
da muss doch dann noch irgendwie nen "/1000" rein?

Code: Alles auswählen

ZaehlerAktuell = dom.GetObject(Zaehlername).Value();
ZaehlerAktuell = ZaehlerAktuell/1000;

TheCrusher
Beiträge: 75
Registriert: 28.05.2020, 10:21
System: CCU
Hat sich bedankt: 14 Mal

Re: Verbrauch HMIP-PSM

Beitrag von TheCrusher » 28.06.2020, 17:49

wo muss die Anpassung rein, das ich statt zb 10000,00 wh, 10,00 kWh angezeigt bekomme

Code: Alles auswählen

ZaehlerAktuell = dom.GetObject(Zaehlername).Value();
da muss doch dann noch irgendwie nen "/1000" rein?

Code: Alles auswählen

ZaehlerAktuell = dom.GetObject(Zaehlername).Value();
ZaehlerAktuell = ZaehlerAktuell/1000;

der teil funktioniert ...


hab mal im Skript die beiden Teile "if Kanal 3" mit "if Kanal 4" verglichen, aber nix gefunden, was das Fehlerbild erklären könnte

Code: Alles auswählen

!- Strom getrennt nach Kanal abrechnen / MN 27.06.2020
!- https://homematic-forum.de/forum/viewtopic.php?f=60&t=59546&p=590070#p590070
!- WENN Pumpe:3 Schaltzustand EIN bei Änderung auslösen
!- ODER Pumpe:3 Schaltzustand AUS bei Änderung auslösen
!- ODER Pumpe:4 Schaltzustand EIN bei Änderung auslösen
!- ODER Pumpe:4 Schaltzustand AUS bei Änderung auslösen
!- DANN dieses SKRIPT

!- Definitionen: Variablennamen zwischen den "" an eigene Gegebenheiten anpassen
string Zaehlername = "svEnergyCounter_1439_0001D3C99C9B5B:6";
string NameSV3_gesamt = "PumpeOG_ges";
string NameSV4_gesamt = "PumpeEG_ges";
string NameSV3_ein = "PumpeOG_EIN";
string NameSV4_ein = "PumpeEG_EIN";

!- hier nichts mehr anpassen
string kanal;
object oSrc;
real ZaehlerGesamt;
real ZaehlerAktuell;
real ZaehlerAlt3;
real ZaehlerAlt4;
real Diff3;
real Diff4;
real DiffTeilen;
real DiffRest;


!- welcher Kanal?
oSrc = dom.GetObject("$src$");
kanal = (dom.GetObject(dom.GetObject(oSrc)).Channel()).Name();
kanal = kanal.Substr((kanal.Length()-1),1);
!- aktueller Status 0 = aus / 1 = ein
string sVal = "$val$";

ZaehlerAktuell = dom.GetObject(Zaehlername).Value();
ZaehlerAktuell = ZaehlerAktuell/1000;
ZaehlerAlt3 = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV3_ein).State();
ZaehlerAlt4 = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV4_ein).State();

if ( kanal == "3" )
   {
   !- Kanal 3 betätigt

   if ( sVal == "0" )
      {
      !- ausgeschaltet

      ZaehlerGesamt = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV3_gesamt).State();
      Diff3 = ( ZaehlerAktuell -  ZaehlerAlt3 );
      if ( ZaehlerAlt4 > 0 )
         {
         !- Zaehler 4 läuft parallel, hälftig abrechnen
         Diff4 = ( ZaehlerAktuell -  ZaehlerAlt4 );
         DiffTeilen = Diff4.Min(Diff3);
         DiffRest = Diff3 - DiffTeilen;
         Diff3 = DiffRest + ( DiffTeilen / 2 );
         ZaehlerAlt4 = ZaehlerAlt4 + ( DiffTeilen / 2 );
         dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV4_ein).State(ZaehlerAlt4);
         }
       !- hochzählen
       ZaehlerGesamt = ZaehlerGesamt + Diff3;

      dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV3_gesamt).State(ZaehlerGesamt);
      dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV3_ein).State(0);
      } else {
      !- eingeschaltet, Zählerstand merken

      dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV3_ein).State(ZaehlerAktuell);
      }
   }

if ( kanal == "4" )
   {
   !- Kanal 4 betätigt

   if ( sVal == "0" )
      {
      !- ausgeschaltet

      ZaehlerGesamt = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV4_gesamt).State();
      Diff4 = ( ZaehlerAktuell -  ZaehlerAlt4 );
      if ( ZaehlerAlt3 > 0 )
         {
         !- Zaehler 3 läuft parallel, hälftig abrechnen
         Diff3 = ( ZaehlerAktuell -  ZaehlerAlt3 );
         DiffTeilen = Diff3.Min(Diff4);
         DiffRest = Diff4 - DiffTeilen;
         Diff4 = DiffRest + ( DiffTeilen / 2 );
         ZaehlerAlt3 = ZaehlerAlt3 + ( DiffTeilen / 2 );
         dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV3_ein).State(ZaehlerAlt3);
         }
       !- hochzählen
       ZaehlerGesamt = ZaehlerGesamt + Diff4;

      dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV4_gesamt).State(ZaehlerGesamt);
      dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV4_ein).State(0);
      } else {
      !- eingeschaltet, Zählerstand merken
      dom.GetObject("Protokolleintrag").State("xxxTest: Kanal 4 ein");
      dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV4_ein).State(ZaehlerAktuell);
      }
   }

MichaelN
Beiträge: 9677
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1625 Mal

Re: Verbrauch HMIP-PSM

Beitrag von MichaelN » 28.06.2020, 18:10

Ich sehe gerade, ich habe noch ein

Code: Alles auswählen

dom.GetObject("Protokolleintrag").State("xxxTest: Kanal 4 ein");
Im Code vergessen. Wenn du nicht auch eine Systemvariable namens Protokolleintrag hast, sollte es eigentlich einen Fehler geben.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

TheCrusher
Beiträge: 75
Registriert: 28.05.2020, 10:21
System: CCU
Hat sich bedankt: 14 Mal

Re: Verbrauch HMIP-PSM

Beitrag von TheCrusher » 28.06.2020, 18:15

zur Halbierung hab ich das mal grad getestet.

Zählerstand 8,6
EG ein -> Zählerstand steigt(schreibt hier wie oben geschrieben nix in die var EG_ein)
OG ein bei 10,1 -> 10,1 schreibt er in var OG_ein

bei Zählerstand 13,10 -> OG aus -> addiert hier 3,0 zum OG-ges statt 1,5
bei Zählerstand 13,10 -> jetzt auch EG aus -> addiert 13,1 zum EG-ges

Antworten

Zurück zu „HomeMatic IP mit CCU“