Stromverbrauch von Steckdosen per Push melden

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

Moderator: Co-Administratoren

Antworten
duralis
Beiträge: 29
Registriert: 31.12.2015, 15:29
Danksagung erhalten: 4 Mal

Stromverbrauch von Steckdosen per Push melden

Beitrag von duralis » 02.09.2018, 13:03

Hallo Zusammen,

ich stelle euch ein Script zur Verfügung mit dem man sich z.B. täglich eine Push-Nachricht zusenden lassen kann über den Stromverbrauch von Steckdosen welche mit einer Stromverbrauchsmessung ausgelegt sind und die man überwachen will.

Benachrichtigungen kürzer als 1x am Tag führt zu nur minimalen Verbrauchswerten, lohnt sich also meiner Meinung nach nicht wirklich. Dem Script ist es aber egal ob es stündlich, täglich, wöchentlich oder monatlich aufgerufen wird.
Zum Aufruf nutze ich die CCU2 Zeitsteuerung mit einem täglichen Auslöser (CUxD oder andere zeitliche Intervalle sind aber ebenso möglich).

Funktion - bei jedem Script Aufruf werden:
  • die Stromverbräuche der in einem Favoriten angegebenen Steckdosen ausgelesen
  • die abgespeicherten Stromverbräuche der Steckdosen vom letzten Aufruf aus einer Systemvariablen ausgelesen
  • pro Steckdose der Verbrauch, die Kosten und die Summe von allen ermittelt (die Differenz zum letzten Aufruf)
  • das ganze als Text zusammengestellt
  • der Text über das zPNP als Meldung ausgegeben
  • die neuen Verbräuche wieder abgespeichert
Voraussetzungen:
Hardware:
  • Steckdosen mit Verbrauchsmessung
  • Energiezähler Sensor (es wird nur der Preis pro kWh ausgelesen, ohne Sensor ist die Preisangabe im Script möglich)
Software:
  • zentrales Push-Nachrichten-Programm zPNPx zur Push Benachrichtigung der Werte
  • 1 Systemvariable zum abspeichern aller zuletzt ermittelten Stromverbräuche der Steckdosen
  • 1 Favorit für die zu meldenden Steckdosen
  • die Konfiguration dazu erfolgt im Script
Es ist besser die Systemvariable (Werteliste ohne Inhalt) vorher in der CCU2 anzulegen. Das Script legt diese zwar, wenn nicht vorhanden, selber an aber Drittprogramme haben leichte Probleme falls deren Funktionalität genutzt werden sollte.
Alles weitere könnt ihr der Beschreibung im Script entnehmen. Sollten sich noch Fehler eingeschlichen haben bitte ich um Rückinfo.

Code: Alles auswählen

!! Energieverbrauch Steckdosen V0.94
!! ermittelt den (täglichen) Energieverbrauch mehrerer Steckdosen
!!
!!(c) duralis; zur freien Verwendung
!!   Danke noch an andere "Scripter" von denen ich viel übernehmen konnte
!!
!! Das Script ermittelt Energieverbräuche von Steckdosen mit Energiemessung, stellt eine Nachricht zusammen, und ruft dann das zPNPx auf zur Ausgabe der Werte
!!	Bitte Geduld habem, das Script brauch ca. 1 Minute oder auch etwas länger um komplett durchzulaufen
!!		Es wird pro Steckdoese die Differenz des Energieverbrauches vom letzten Aufruf des Scriptes zum aktuellen Aufruf des Scriptes und zusätzlich die Gesamtsumme aller Steckdosen ermittelt
!!			Wenn also das Script einmal täglich aufgerufen wird so werden die Tagesverbräuche ausgegeben,
!!			bei stündlichem Aufruf halt die Verbräuche der letzten Stunde
!!		Die Steckdosen, welche reportet werden sollen, müssen sich in einer Favoritenliste befinden. Dort nicht eingetragene Steckdosen werden ignoriert.
!!			Die Favoritenliste kann noch andere CCU-Geräte enthalten da gezielt nur Steckdosen aus diesem Favoriten beachtet werden. Aktualisierungen dieses Favoriten 
!!			(gelöschte oder hinzugefügte Steckdosen) werden beim nächsten Scriptaufruf berücksichtigt.
!!			Es muss nicht zwingend der Kanal "Messwerte" angegeben werden, es reicht irgend ein Kanal der Steckdose im Favoriten, zu Kontrolle ist der "Messwerte" Kanal aber günstig
!!			Der Name des Favoriten kann frei gewählt werden, er muss etwas weiter unten im Script angegeben werden.
!!		Es wird weiterhin eine Systemvariable zum ablegen der Energieverbräuche (und der SteckdosenID) benötigt. Diese Systemvariable muss den Typ "Werteliste" besitzen.
!!			Die Systemvariable sollte vorhanden sein, ansonsten erzeugt das Script selbst eine Variable. Der Name der Systemvariable kann frei gewählt werden, er muss etwas weiter unten im Script angegeben werden.
!!			Die Variable braucht zu beginn keinen Inhalt zu haben da der Inhalt immer neu erstellt wird (anhand der Geräte aus dem Favoriten).
!!			Nach einem Scriptdurchlauf sind dort die aktuellen Verbräuche und die GeräteID abgelegt um beim nächsten Aufruf eine Differenz der Verbräuche ermitteln zu können.
!!		Die Ermittlung der Stromverbrauchskosten erfolgt durch auslesen des Strompreises aus dem Stromzähler-Energiemessgerät, sofern vorhanden und angegeben, ansonsten muss im Script der Wert in €/kWh eingetragen werden.
!!		Konfiguration:
!!			* Name der Favoritenliste der Steckdosen eintragen in der Zeile -> string FavoritenName = "xxxx";
!!			* Name einer einmalig zu erstellenden Systemvariable in der Zeile -> string svSDMVerbrauch = "xxxx";
!!			* Strompreis pro kWh eintragen in der Zeile -> real ePricekwh=0.23 oder Angabe des Stromverbrauchsenergiemessgerät in Zeile -> string serialCounter = "xxxx";
!!			* Angabe des CUxD Device in der Zeile -> string cuxddevice = "";
!!


! ******* die folgenden Zeilen können angepasst werden ******
! externe Systemvariable zum abspeichern aller Verbrauchswerte (wenn möglich selber anlegen und als Werteliste definieren)
!	Systemvariable wird angelegt wenn diese nicht vorhanden sein sollte
string svSDMVerbrauch = "v_Test_Steckdosen"; ! hier werden von allen Steckdosen die Energieverbräuche in einer Werteliste abgelegt um später die Differenz bilden zu können

! CCU2 Favoriten -> alle Steckdoesen dieses Favoriten werden ausgelesen und dann reportet, die benötigten Steckdosen also bitte diesem Favoriten zuweisen
string FavoritenName = "Test_ScriptSteckdosen";

!Strompreisangabe
string serialCounter = "MEQ0705272";	! die Seriennummer des Energiezählers einragen, wenn nicht vorhanden dann einen leeren String angegben -> ""
! ist "serialCounter" leer, so wird der Strompreis aus dem Wert der hier angegebenen Variablendeklaration "ePricekwh" benutzt
real ePricekwh=0.10;					! hier den Strompreis eintrage sofern kein Stromverbrauchsmessgerät in "serialCounter" angegeben wurde, ansonsten reicht die 0 und der Strompreis wird aus der CCU ausgelesen
string cuxddevice = "CUX2801003";		!das CUXD Device eintragen, leeren String "" angeben wenn nicht vorhanden (für Ermittlung Strompreis aus der CCU)

! Konfiguration für zPNSx (Benachrichtigung)
real pushprio = 0; ! Priorität der Nachricht -2 oder -1 (ohne Ton) oder 0=InfoMeldung, +1=Warnmeldung, +2=Alarmmeldung (gilt für Telegram und Pushover)
string pushservice = "Telegram"; ! Auswahl des Nachrichten Dienstes aus oder alle oder Pushover oder Telegram  aus;alle;Pushover;Telegram (bzw. wer noch nehr konfiguriert hat dann auch angeben)
string pushimage = ""; ! URL zum Bild das versendet werden soll
string pushsound = "gamelan";		! Sound für Pushover
string pushovertitle = "Energieverbrauch Test Hinweismeldung"; ! Titel der Nachricht, wird nur bei Pushover angezeigt 
string pushoverdevice = ""; !Pushover-Gerät(muss ein PO spezifisches Element sein)
string svPushPrio = "CCU SV Push Prio";
string svPushService = "CCU SV Push Dienst"; ! Push-Dienste, Voreinstellung: "CCU SV Push Dienst", gem. zPNS-Po, optional
string svPushImage = "CCU SV Pushover Bild"; ! Link auf ein anzufügendes Bild (z.B. "CCU SV Push Bild"), Voreinstellung: ""
string svPushoverSound = "CCU SV Pushover Sound"; ! Sound der Nachricht (z.B. "CCU SV Pushover Sound"), Voreinstellung: "", gem. zPNS-Po, optional
string svPushoverTitle = "CCU SV Pushover Titel"; ! Titel der Nachricht (z.B. "CCU SV Pushover Titel"), Voreinstellung: "" 
string svPushoverDevice = ""; ! Pushover-Gerät (z.B. "CCU SV Pushover Gerät"), Voreinstellung: "" ich weis nicht wofür ich das Gerät nehmen kann

! +++++ Namen der zwingend benötigten Systemvariablen +++++
string svPushText = "CCU SV Push Text"; ! Text der aktuell zu übertragenden Push-Nachricht, Voreinstellung: "CCU SV Push Text", gem. zPupdown, noneNS-xx, obligatorisch
string svPushTextRef = "CCU SV Push Text Ref"; ! Text der vorherigen Push-Nachricht als Referenz, Voreinstellung: "CCU SV Push Text Ref"
! Name des zentralen Push-Nachrichten-Programms (des WEB-UI Programmes)
string zPNP = "CCU PRG Push-Nachrichten"; ! obligatorisch


!! **********
! ******* ab hier sind keine Anpassungen im Code mehr notwendig ******
!! **********

! interne Variablen
boolean gefunden = false;
string StrVerbrauch; real Verbrauch; string tempVerbrauchsListe = "";
string Zeilenumbruch = "\n"; string TrennzeichenDerListe = ";"; string TrennzeichenGeraetVerbrauch = "|";
string Geraetename = ""; string GeraeteID = "";
integer Fundstelle = 0; string FavGeraeteAdressListe = ""; real SummenVerbrauch;
string dpnEnergieverbrauch = "ENERGY_COUNTER";
!alle auszulesenden Typen vom messenden Steckdosen angeben
string DevicetypMessSteckdosen = "HM-ES-PMSw1-Pl;HM-ES-PMSw1-Pl-DN-R1;HM-ES-PMSw1-Pl-DN-R2;HM-ES-PMSw1-Pl-DN-R3;HM-ES-PMSw1-Pl-DN-R4;HM-ES-PMSw1-Pl-DN-R5;HM-ES-PMSw1-DR;HM-ES-PMSw1-SM;HM-ES-PMSwX";		!hier müssen alle Typen von Funk-Schaltaktoren mit Leistungsmessung eingetragen werden
if (serialCounter != "")
{
	string stdout; string stderr; string part;
	string cmd = "/bin/sh -c 'cat /etc/config/energyPrice|sed -r \"s/\\"//g\"'";
	object devEnergyDP = dom.GetObject("BidCos-RF."#serialCounter#":1."#dpnEnergieverbrauch);
	if (cuxddevice!="") 
	{
		dom.GetObject("CUxD."#cuxddevice#":1.CMD_SETS").State(cmd);
		dom.GetObject("CUxD."#cuxddevice#":1.CMD_QUERY_RET").State(1);
		stdout = dom.GetObject("CUxD."#cuxddevice#":1.CMD_RETS").State();
	} 
	else {system.Exec(cmd, &stdout, &stderr);}
	foreach(part,stdout.Split(Zeilenumbruch)) 
	{
		string key = part.StrValueByIndex(":",0);
		string val = part.StrValueByIndex(":",1);
		if (key=="curPrice"){ePricekwh = val.ToFloat();}
	}
}

string Nachricht = "";
Nachricht = Nachricht#Zeilenumbruch; Nachricht = Nachricht#"Test Energiedaten 2 am "+system.Date("%d.%m.%Y %H:%M:%S")#Zeilenumbruch;
var myFavorite = dom.GetObject(FavoritenName); 
string itemId; object svObject; object svObjectList;
if(!svSDMVerbrauch){ svSDMVerbrauch = "v_SDM-Verbraeuche"; }
svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svSDMVerbrauch);
if(!svObject)
{   
  svObjectList = dom.GetObject(ID_SYSTEM_VARIABLES); 
  svObject = dom.CreateObject(OT_VARDP); svObjectList.Add(svObject.ID());
  svObject.Name(svSDMVerbrauch);
  svObject.DPInfo("letzte gespeicherte Verbrauchswerte");
  svObject.Internal(false); svObject.Visible(true);
  svObject.ValueType(ivtBinary); !ivtBinary	oder ivtInteger
  svObject.ValueSubType(istEnum);
  svObject.ValueUnit("");
  dom.RTUpdate(true);
}

object iObjekt = (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svSDMVerbrauch));
StrVerbrauch = iObjekt.ValueList();
foreach(itemId, myFavorite.EnumUsedIDs()) 
{
	var item = dom.GetObject(itemId);
	if (item.IsTypeOf(OT_CHANNEL))		
	{
		var device = dom.GetObject(item.Device());
		DevicetypMessSteckdosen = DevicetypMessSteckdosen#TrennzeichenDerListe;
		Fundstelle = DevicetypMessSteckdosen.Find(device.HssType()#TrennzeichenDerListe);
		if (Fundstelle > -1)
		{
			Fundstelle = StrVerbrauch.Find(device.Address());
			if (Fundstelle == -1)
			{
				tempVerbrauchsListe = tempVerbrauchsListe#TrennzeichenDerListe#device.Address()#TrennzeichenGeraetVerbrauch#"0.0";
				FavGeraeteAdressListe = FavGeraeteAdressListe#device.Address()#TrennzeichenDerListe;
			}
			else{FavGeraeteAdressListe = FavGeraeteAdressListe#device.Address()#TrennzeichenDerListe;}
		}
	}
}
StrVerbrauch = StrVerbrauch#tempVerbrauchsListe;
dom.GetObject(dom.GetObject(svSDMVerbrauch)).ValueList(StrVerbrauch);
tempVerbrauchsListe = "";
StrVerbrauch = StrVerbrauch.Split(TrennzeichenDerListe);
foreach(itemId, StrVerbrauch) 
{
	GeraeteID = itemId.Substr(0,itemId.Find(TrennzeichenGeraetVerbrauch));
	StrVerbrauch = itemId.Substr(itemId.Find(TrennzeichenGeraetVerbrauch)+1,itemId.Length()-(itemId.Find(TrennzeichenGeraetVerbrauch)+1));
	Fundstelle = FavGeraeteAdressListe.Find(GeraeteID);
	if (Fundstelle == -1){}
	else{tempVerbrauchsListe = tempVerbrauchsListe#GeraeteID#TrennzeichenGeraetVerbrauch#StrVerbrauch#TrennzeichenDerListe;}
}
tempVerbrauchsListe = tempVerbrauchsListe.Substr(0,tempVerbrauchsListe.Length()-1);
dom.GetObject(dom.GetObject(svSDMVerbrauch)).ValueList(tempVerbrauchsListe);
SummenVerbrauch = 0; tempVerbrauchsListe = "";
StrVerbrauch = dom.GetObject(svSDMVerbrauch).ValueList(); StrVerbrauch = StrVerbrauch.Split(TrennzeichenDerListe);
foreach(itemId, StrVerbrauch) 
{
	GeraeteID = itemId.Substr(0,itemId.Find(TrennzeichenGeraetVerbrauch));
	StrVerbrauch = itemId.Substr(itemId.Find(TrennzeichenGeraetVerbrauch)+1,itemId.Length()-(itemId.Find(TrennzeichenGeraetVerbrauch)+1));
	iObjekt = dom.GetObject("BidCos-RF."#GeraeteID#":2."#dpnEnergieverbrauch);
	Verbrauch = iObjekt.Value();
	var iKanal = iObjekt.Channel();
	Geraetename = dom.GetObject(iKanal).Name().Substr(0, dom.GetObject(iKanal).Name().Find(":"));
	tempVerbrauchsListe = tempVerbrauchsListe#GeraeteID#TrennzeichenGeraetVerbrauch#Verbrauch.ToString()#TrennzeichenDerListe;
	Verbrauch = Verbrauch - StrVerbrauch.ToFloat();	SummenVerbrauch = SummenVerbrauch+Verbrauch;
	Nachricht = Nachricht#Geraetename#" Stromverbrauch gestern: "#Verbrauch.ToString(2)#" Wh und Kosten: "#(Verbrauch*ePricekwh/1000).ToString(2)#" Euro"#Zeilenumbruch;
}
tempVerbrauchsListe = tempVerbrauchsListe.Substr(0,tempVerbrauchsListe.Length()-1);
Nachricht = Nachricht # "Stromverbrauch aller Steckdosen: " # (SummenVerbrauch/1000).ToString(2)#" kWh und Kosten: "#((ePricekwh*SummenVerbrauch)/1000).ToString(2)#" Euro"#Zeilenumbruch;
dom.GetObject(dom.GetObject(svSDMVerbrauch)).ValueList(tempVerbrauchsListe);

string message = Nachricht;
object svObject;
integer svPushServiceIndex;
gefunden = false;
string svPushServiceText ="";
string StringExtract;

if(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushService))
{
	gefunden = false;
	svPushServiceIndex = 0;
	svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushService);
	svPushServiceText = svObject.ValueList();
	svPushServiceText = svPushServiceText.Split(";");
	foreach(StringExtract, svPushServiceText)
	{
		if(StringExtract == pushservice){gefunden = true;}
		else{if(!gefunden){svPushServiceIndex = svPushServiceIndex +1;}}
	}
	if(gefunden){svObject.State(svPushServiceIndex);}
}


if(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushImage)){dom.GetObject(svPushImage).State(pushimage);}
if(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverTitle)){dom.GetObject(svPushoverTitle).State(pushovertitle);}
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushPrio)).State(pushprio);
if(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverSound)){dom.GetObject(svPushoverSound).State(pushsound);}
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushText)).State(message);
(dom.GetObject(ID_PROGRAMS).Get(zPNP)).ProgramExecute();


Antworten

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