Howto - Zähler-Skripte für HM-ES-TX-WM (per zPNP)

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

dtp
Beiträge: 10660
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 321 Mal
Danksagung erhalten: 501 Mal

Re: Howto - Zähler-Skripte für HM-ES-TX-WM, V3.5

Beitrag von dtp » 03.10.2020, 18:12

sailor79 hat geschrieben:
03.10.2020, 15:58
Was meinst Du mit "Es könnten aber auch einfach dessen Einstellungen nicht mit denen des Zählers übereinstimmen.",
vielleicht das hier?
Ja, genau. Ich meinte die Einstellungen zur Zählersensor-Sendeeinheit:
2020-10-03 18-09-31.png
2020-10-03 18-09-31.png (6.71 KiB) 1823 mal betrachtet
Bei dir stimmen die Werte da so gar nicht, wenn ich mir den Aufdruck deines Zählers ansehe. 8)

Ich nutze übrigens auch den ES-LED-Sensor. Und das seit einigen Jahren. Der geht bei mir absolut genau, ohne dass ich ihn jemals nachjustieren musste.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

Benutzeravatar
sailor79
Beiträge: 51
Registriert: 08.12.2017, 12:47
System: CCU
Wohnort: Berlin
Hat sich bedankt: 12 Mal
Danksagung erhalten: 4 Mal

Re: Howto - Zähler-Skripte für HM-ES-TX-WM, V3.5

Beitrag von sailor79 » 03.10.2020, 20:05

Oh Shit :roll: :roll: :roll:

DANKE :mrgreen:
CCU3@3.59.6 - Dual-Beam Ant. | Geräte (119): 54 Hm-RF/ 27 HmIP-RF/ 16 HmIP-W/ 6 CuxD/ 17 Virt/, 765 Kanäle | Sysvars:108 | Progs: 70 | ioBroker@Ubuntu_20.04 | Addons: CuxD & NEO |

Benutzeravatar
sailor79
Beiträge: 51
Registriert: 08.12.2017, 12:47
System: CCU
Wohnort: Berlin
Hat sich bedankt: 12 Mal
Danksagung erhalten: 4 Mal

Re: Howto - Zähler-Skripte für HM-ES-TX-WM, V3.5

Beitrag von sailor79 » 05.10.2020, 11:02

Nachtrag: Seit der korrigierten Impulse/kwH-Einstellung läuft alles wie es soll.

Vielen Dank nochmal.
Gruß, Marc
CCU3@3.59.6 - Dual-Beam Ant. | Geräte (119): 54 Hm-RF/ 27 HmIP-RF/ 16 HmIP-W/ 6 CuxD/ 17 Virt/, 765 Kanäle | Sysvars:108 | Progs: 70 | ioBroker@Ubuntu_20.04 | Addons: CuxD & NEO |

Shuo
Beiträge: 216
Registriert: 18.09.2014, 23:19
Danksagung erhalten: 6 Mal

Re: Howto - Zähler-Skripte für HM-ES-TX-WM, V3.5

Beitrag von Shuo » 28.12.2020, 15:46

Hi Thorsten,

da ich ein begeisterter Fan bin von Deinen Skripten bin, wollte ich nun auch diese integrieren.
Folgendes Problem. Ich habe die Initialisierung durchgeführt und den den Wert eingefügt:

Code: Alles auswählen

! Berechnet den tagesaktuellen Stand des Wasserzählers mittels der Zählersensor-
! Sendeinheit HM-ES-TX-WM und sendet eine Übersicht als Push-Nachricht mittels zPNP
! Version 3.5.2, Autor: dtp

! +++++ Startwert des Wasserzählers als reelle Zahl (Ersteinrichtung und Reset: -1.0) +++++
! real offset = 476.044;
real offset = -1.0;

! +++++ Zählerstand setzen +++++ 
! sofort bei Ausführung des Programms: false; Regelbetrieb (täglich um setTime): true
boolean regular = true;
string setTime = "23:59";

! +++++ Bargraph-Anzeige (range = 0 schaltet die Anzeige aus) +++++
real range = 1.0; ! Maximaler Verbrauchswert in m³ 
real bars = 10.0; ! Anzahl der Bars innerhalb range

! +++++ Parameter der Zählersensor-Sendeeinheit +++++ 
string channel = "Energiezaehler Wasser:1";
string iecFlag = false; ! Für Sendeeinheit ab FW-Version 2.2 mit ES-IEC-Sensor auf true setzen

! +++++ Liste der Wochen- oder Monatstage, an dem eine Push-Nachricht gesendet werden soll (Trennung beliebig) +++++
! z.B. "1 6 10 20", "1 Sonntag", "Montag Mittwoch Freitag", "täglich"; keine Nachricht: ""
string sendDatesList = "täglich";

! +++++ Anzahl der Tage, für die die zurückliegenden Verbrauchswerte angezeigt werden sollen +++++
integer numDays = 7;

! +++++ Name einer anzufügenden Bilddatei (wenn auf "" gesetzt, wird kein Bild übertragen) +++++
! die Datei muss zuvor in das tmp-Verzeichnis der CCU gespeichert worden sein
string image = "";

! +++++ Benötigte Systemvariablen +++++
string svDay = "Haus SV Wasserverbrauch Tag"; ! Wasserverbrauch des aktuellen Tags
string svList = "Haus SV Wasserverbrauch Liste"; ! Liste der täglichen Wasserverbräuche
string svValue = "Haus SV Wasserzähler Stand"; ! Tagesaktueller Stand des Wasserzählers
string svPushText = "CCU SV Push Text"; ! Text der zu übertragenden Push-Nachricht gem. zPNS-xx
string svPushPrio = "CCU SV Push Prio"; ! Priorität der Push-Nachricht gem. zPNS-xx
string svPushImage = "CCU SV Push Bild"; ! Link für ein zu sendendes Bild gem. zPNS-xx

! +++++ Name des zentralen Push-Nachrichten-Programms +++++
string zPNP = "CCU PRG Push-Nachrichten";

! #####################################################################
! ##### ab hier bitte keine weiteren Einstellungen mehr vornehmen #####
! #####################################################################

! +++++ weitere Variablendeklarationen +++++
real meterDiff; real meterValue; real barIndex = 0.0;
string list = ""; string listMod = ""; string listElement; string bargraph = ""; string message;
string weekday; string monthday; string week = "Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag";
integer cnt = 0;
object svObject; object svObjectList;

! +++++ Systemvariablen erzeugen bzw. falls vorhanden, auslesen +++++
if(!svDay){svDay = "Haus SV Wasserverbrauch Tag";}
svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svDay);
if(!svObject){   
  svObjectList = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectList.Add(svObject.ID()); 
  svObject.Name(svDay); svObject.DPInfo("Wasserverbrauch aktueller Tag"); svObject.Internal(false); svObject.Visible(true); 
  svObject.ValueType(ivtFloat); svObject.ValueSubType(istGeneric); svObject.ValueUnit("m³"); svObject.ValueMin(0); svObject.ValueMax(65000); dom.RTUpdate(true);
}

if(!svList){svList = "Haus SV Wasserverbrauch Liste";}
svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svList);
if(!svObject){   
  svObjectList = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectList.Add(svObject.ID());
  svObject.Name(svList); svObject.DPInfo("Liste der täglichen Wasserverbräuche"); svObject.Internal(false); svObject.Visible(true);
  svObject.ValueType(ivtString); svObject.ValueSubType(istChar8859); svObject.ValueUnit("m³"); dom.RTUpdate(true);
}
else{list = (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svList)).Value(); if(list.Contains("???")){list = "";}}

if(!svValue){svValue = "Haus SV Wasserzähler Stand";}
svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svValue);
if(!svObject){   
  svObjectList = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectList.Add(svObject.ID());
  svObject.Name(svValue); svObject.DPInfo("Tagesaktueller Stand des Wasserzählers"); svObject.Internal(false); svObject.Visible(true);
  svObject.ValueType(ivtFloat); svObject.ValueSubType(istGeneric); svObject.ValueUnit("m³"); svObject.ValueMin(0); svObject.ValueMax(99999); dom.RTUpdate(true);
}
else{
  if(!iecFlag){meterValue = offset + (dom.GetObject(ID_CHANNELS).Get(channel)).DPByHssDP("GAS_ENERGY_COUNTER").Value();}
  else{meterValue = offset + (dom.GetObject(ID_CHANNELS).Get(channel)).DPByHssDP("IEC_ENERGY_COUNTER").Value();}  
  meterDiff = meterValue - (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svValue)).Value();
}

! +++++ Auslesen der aktuellen Datumswerte +++++
weekday = week.StrValueByIndex(" ", system.Date("%w")); ! Wochentag
monthday = system.Date("%d").LTrim("0"); ! Monatstag
 
! +++++ Korrektur im Falle des COUNTER-Überlaufs +++++
while(meterDiff <= -0.01){meterValue = meterValue + 838860.7; meterDiff = meterDiff + 838860.7;}
meterDiff = meterDiff.Abs();

! +++++ Zurücksetzen, falls offset = -1 +++++
if(offset == -1.0){
  meterValue = 0; 
  if(!iecFlag){meterDiff = (dom.GetObject(ID_CHANNELS).Get(channel)).DPByHssDP("GAS_ENERGY_COUNTER").Value();}
  else{meterDiff = (dom.GetObject(ID_CHANNELS).Get(channel)).DPByHssDP("IEC_ENERGY_COUNTER").Value();}
  regular = false;
}

! +++++ Ausgabe als Bargraph +++++
if(range > 0){
  while((barIndex < meterDiff) && (barIndex <= (range - range/bars))){
    bargraph = bargraph#"|"; 
    barIndex = barIndex + range/bars;
  }
  if(meterDiff > range){bargraph = "<font color=orange>"#bargraph#"</font>";}
  bargraph = bargraph#" ";
}
 
! +++++ Liste auf Zeitfenster begrenzen und vermeiden aufeinanderfolgender Einträge am Sendetag +++++
if(list){
  foreach(listElement, list.Split("\n")){
    if((cnt == 0) && (listElement.Contains(weekday))){listElement = "";}
    else{listElement = listElement#"\n";}
    if(cnt >= numDays-1){listElement = "";}
    listMod = listMod#listElement;
    cnt = cnt + 1;
  }
}
list = bargraph#meterDiff.ToString(2)#" m³, "#weekday#", "#system.Date('%d')#"."#system.Date('%m')#".\n"#listMod;
 
! +++++ Setzen der Systemvariablen +++++
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svList)).State(list);
if(regular){
  if(system.Date("%H:%M") == setTime){
    (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svValue)).State(meterValue);
    (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svDay)).State(meterDiff);
  }
  else{regular = false;}
}
else{
  (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svValue)).State(meterValue);
  (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svDay)).State(meterDiff);
}

! +++++ Senden der Push-Nachricht +++++
if((sendDatesList.Contains(weekday)) || (sendDatesList.Contains(monthday)) || (sendDatesList.Contains("täglich")) || (!regular)){
  ! ----- Erzeugen der Nachricht -----
  if(offset == -1.0){message = "Initialisierung Wasserzähler\noffset = Zählerstand - "#meterDiff#" m³ eintragen!";}
  else{
    message = meterValue.ToString(2)#" m³ Wasser verbraucht.\nTagesverbrauchswerte:\n"#list;
    if(!regular){
      if(system.Date("%H:%M") != setTime){message = "<font color=red>Fehler Wasserzähler: Für den regulären Betrieb Zeitmodul des Programms auf "#setTime#" Uhr setzen!</font>";}
      else{message = message#"<font color=orange>Achtung: ggf. regular wieder auf true setzen!</font>";}
    }
  }
  
  ! ----- Setzen der Priorität für die Push-Nachricht ------
  (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushPrio)).State("-1");
 
  ! ----- zPNP ausführen -----
  (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushText)).State(message);
  if(image){(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushImage)).State("/tmp/"#image);}
  (dom.GetObject(ID_PROGRAMS).Get(zPNP)).ProgramExecute();
}
Ergebnis:
Screenshot_20201228-154346_Pushover.jpg
Sobald ich den realen offset eingebe, passiert ncichts.
Der Programmaufruf schaut so aus:
Programm.png
Und das Zeitmodul:
Zeitmodul.png
Zeitmodul.png (22.47 KiB) 1605 mal betrachtet

Wo mache ich denn was falsch?

Viele Grüße
Zuletzt geändert von Shuo am 28.12.2020, 17:45, insgesamt 1-mal geändert.

dtp
Beiträge: 10660
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 321 Mal
Danksagung erhalten: 501 Mal

Re: Howto - Zähler-Skripte für HM-ES-TX-WM, V3.5

Beitrag von dtp » 28.12.2020, 16:16

Ein paar ergänzenden Fragen dazu:

1. Wurden die Systemvariablen korrekt angelegt? Kannst du ggf. mal einen Screenshot posten?

2. Hast du das Programm schon mal über Nacht laufen lassen? Die zugehörigen Systemvariablen werden nämlich nur um 23:59 Uhr befüllt.

3. Hast du es mal mit "regular = false" probiert?
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

Shuo
Beiträge: 216
Registriert: 18.09.2014, 23:19
Danksagung erhalten: 6 Mal

Re: Howto - Zähler-Skripte für HM-ES-TX-WM, V3.5

Beitrag von Shuo » 28.12.2020, 17:53

dtp hat geschrieben:
28.12.2020, 16:16
1. Wurden die Systemvariablen korrekt angelegt? Kannst du ggf. mal einen Screenshot posten?
SV.png
dtp hat geschrieben:
28.12.2020, 16:16
2. Hast du das Programm schon mal über Nacht laufen lassen? Die zugehörigen Systemvariablen werden nämlich nur um 23:59 Uhr befüllt.
ja, aber es steht nichts in der Variable drin
dtp hat geschrieben:
28.12.2020, 16:16
3. Hast du es mal mit "regular = false" probiert?
Ja, dann kommt die Fehlermeldung "Fehler Wasserzähler: Für den regulären Betrieb Zeitmodul des Programms auf 23:59 Uhr setzen"!
Falls ich dann die "Uhrzeit von jetzt setzte", dann funktionert es mit derAnmerkung: "Achtung: ggf regulär wieder auf true setzen"

dtp
Beiträge: 10660
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 321 Mal
Danksagung erhalten: 501 Mal

Re: Howto - Zähler-Skripte für HM-ES-TX-WM, V3.5

Beitrag von dtp » 28.12.2020, 18:23

Nur noch mal, um sicherzugehen. Du benutzt einen HM-ES-TX-WM?

Mit welchem Sensor? Und der liefert auch korrekte Impulse?
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

Shuo
Beiträge: 216
Registriert: 18.09.2014, 23:19
Danksagung erhalten: 6 Mal

Re: Howto - Zähler-Skripte für HM-ES-TX-WM, V3.5

Beitrag von Shuo » 28.12.2020, 18:55

Genau. Ich hab mehrere. Für Wasser:
wasser.png
wasser.png (19.86 KiB) 1549 mal betrachtet
Für Strom einen IEC Sensor:
strom.png
strom.png (22.98 KiB) 1549 mal betrachtet
Da hab ich natürlich das Flag entsprechend gesetzt

Code: Alles auswählen

string iecFlag = true; ! Für Sendeeinheit ab FW-Version 2.2 mit ES-IEC-Sensor auf true setzen

dtp
Beiträge: 10660
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 321 Mal
Danksagung erhalten: 501 Mal

Re: Howto - Zähler-Skripte für HM-ES-TX-WM, V3.5

Beitrag von dtp » 29.12.2020, 11:20

Kannst du noch mal einen Screenshot der angezeigten Sensorwerte posten? Bei mir sieht's z.B. so aus:
2020-12-29 11-17-32.png
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

Shuo
Beiträge: 216
Registriert: 18.09.2014, 23:19
Danksagung erhalten: 6 Mal

Re: Howto - Zähler-Skripte für HM-ES-TX-WM, V3.5

Beitrag von Shuo » 29.12.2020, 11:35

Klar:
Strom_1.png
Strom_1.png (16.21 KiB) 1490 mal betrachtet
wasser_1.png
wasser_1.png (13.76 KiB) 1490 mal betrachtet

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“