Stromzähler mit HomeMatic auswerten

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

Moderator: Co-Administratoren

Benutzeravatar
JPS
Beiträge: 1093
Registriert: 07.08.2010, 22:51
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 8 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Stromzähler mit HomeMatic auswerten

Beitrag von JPS » 23.02.2013, 21:51

HINWEIS:
Eine etwas einfachere Variante mit Hilfe des HomeMatic Strom-/Gassensors HM-ES-TX-WM ist in einem neueren Tutorial beschrieben.

Bitte beachten:
Aufgrund eines Fehlers im Skript (vor 10.10.2015) stimmten nach einem Batteriewechsel bei dem HM-ES-TX-WM die Zählerstände nicht mehr. Der Fehler wurde im Tutorial auf meinem Blog korrigiert. Nutzer, die das Skript vor diesem Datum eigesetzt haben, sollten vor einem Batteriewechsel das Tutorial nochmal durchlesen. Dort wurde ein Workaround eingefügt, mit dem sich die Bestandsdaten der Zeitraumzähler bei einem Batteriewecksel übernehmen lassen.

Mit Stand 31.01.2016 wurde das HM-ES-TX-WM-Tutorial so angepasst, dass der Überlauf des Datenpunktes ENERGY_COUNTER berücksichtigt wird. Bei einem Überlauf und dem Zurücksetzen des Datenpunktes auf NULL laufen die Zeitraumzähler nun problemlos weiter. "Bestandsnutzer" fnden hier ein Workaround zur Anpassung.


Im Folgenden geht es mit der "alten" Anleitung weiter...

Bei Verwendung eines FS20 Zähler-Sensors kann man mit einem an der CCU angeschlossenen CUL über CuxD recht einfach diesbezügliche Daten abgreifen, das wurde an anderer Stelle schon einige Male beschreiben.

Da ich aber keine FS20 Geräte nutze, den CUL also nur für diesen Zweck benötigen würde und aufgrund des Standortes der CCU (für den HM-Funk verwende ich LAN-Adapter) wohl auch eine recht schlechte Funkverbindung zwischen CUL und Zählerkasten hätte, habe ich eine Lösung gewählt, wie ich sie in ähnlicher Art und Weise auch zur Auswertung des Heizölverbrauchs http://homematic-forum.de/forum/viewtop ... 31&t=11974 einsetze.

Der folgende Beitrag beschreibt die Funktionen:

1. Abgriff des Stromzählerstandes und Übertragung in die HomeMatic

2. Zählerauswertung
- Aktueller Zählerstand
- Stromverbrauch seit letzter Ablesung
- Tages-, Wochen-, Monats- und Jahreszähler
- Aktuelle Leistungsaufnahme
- Stromverbrauch der letzten Stunde, 24 Stunden, 7 Tage

3. Statusinformation


1. Abgriff des Stromzählerstandes und Übertragung in die HomeMatic

Da hier im Haus noch ein klassischer Stromzähler verbaut ist, benötigte ich einen Sensor zum Abgriff der roten Markierung auf der Zählerscheibe. Hierzu gibt es von ELV verschiedene Typen von Funksensoren. Ich habe mich für den Funk-Sensor für Wechselstromzähler "EM 1000 WZ" entschieden, da dieser einen +5 V Impulsausgang besitzt, dessen Signale man unmittelbar weiter verarbeiten kann. Ich habe keine wired-Geräte und mich daher für ein "HomeMatic Schließerkontakt-Interface für Öffner und Schließerkontakte" (HM-SCI-3-FM) entschieden, um die Impulse in die CCU zu bekommen. Natürlich kann man z.B. auch eine HM-PBI-4-FM "Funk-Tasterschnittstelle" nehmen.

Meine Zählerscheibe benötigt für 1 kWh 96 Umdrehungen. Bei einer hohen Last (z.B. wenn der Saunaofen an ist) kommen die Impulse so schnell hintereinander, dass die Verarbeitung für die CCU zum Problem wird. Ein Frequenzteiler schafft hier Abhilfe. Ich nutze einen Teiler im Verhältnis 16:1, sodass an der CCU pro kWh statt 96 nur 6 Impulse ankommen. Im Schnitt muss die CCU das Auswertescript so nur alle 8 bis 14 Minuten einmal ausrechnen. Für andere Zähler sind möglicherweise andere Teiler-Verhältnisse sinnvoller.

Zur Realisierung eines solchen Teilers, gibt es unterschiedliche Methoden. Man kann ihn aus integrierten Logikschaltungen oder fertigen Zähler-ICs aufbauen oder einen Microcontroller entsprechend programmieren. Meine Lösung ist die Verwendung eines fertigen, programmierbaren Vorwahlzählers aus der Industrie. Konkret nutze ich einen Omron H7CX-AWD1-N, den ich in der Bucht aus einer Lagerauflösung sehr günstig erstanden habe. Dieser Zähler läuft mit 12 V und kann daher aus dem gleichen Netzteil versorgt werden, wie der EM 1000 WZ. Außerdem kann man die Eingänge auf "PNP-Voltage" einstellen, wodurch der Zähler die +5 V Impulse aus dem EM 1000 WZ direkt (ohne vorgeschalteten Optokoppler/Relais) verarbeiten kann. Natürlich kann man auch andere Vorwahlzähler nehmen.

In ein professionelles Gehäuse eingebaut, sieht das Ganze so aus...
Bild 1.png
Bild 2.png
Der Taster ganz links dient dem Reset nach dem Ablesen des Stromzählers (s.u.) und auf der Lochrasterplatine befindet sich ein 3 V Spannungsregler zur Versorgung des HM-SCI-3-FM.

Den Zähler habe ich so eingestellt, dass er nach dem 16. Impuls das HM-SCI-3-FM (heißt bei mir "UE Flur Stromzähler Taktung") für 10 Sekunden einschaltet und sich wieder auf 0 zurücksetzt.

2. Zählerauswertung

Die Auswertung habe ich in Anlehnung an diesen Beitrag (danke!) realisiert: http://homematic-forum.de/forum/viewtop ... zen#p85333.

Zunächst sind folgende Systemvariablen anzulegen...
  • "Strom Zaehlerstand", Zahl
    "Strom Verbrauch seit letzter Ablesung", Zahl
    "Strom Verbrauch laufendes Kalenderjahr", Zahl
    "Strom Verbrauch laufender Monat", Zahl
    "Strom Verbrauch laufende Woche", Zahl
    "Strom Verbrauch heute", Zahl
    "Strom Leistungsaufnahme aktuell", Zahl
Zur Auswertung ermittelt das nachfolgende Script den IST-Wert der jeweiligen Systemvariable und rechnet den zwischenzeitlich verbrauchten Wert nach der folgenden Formel hinzu:
"neuer Wert" = "alter Wert" + ("Teiler"/"Zähler")
Hierbei ist "Teiler" das Teilerverhältnis des Vorwahlzählers (in meinem Fall 16) und "Zähler" die Anzahl der Scheibenrotationen pro kWh (in meinem Fall 96):
"neuer Wert" = "alter Wert" + (16.0/96)
und gekürzt...
"neuer Wert" = "alter Wert" + (1.0/6)
Im Script sieht das wie folgt aus...

Code: Alles auswählen

var zA = dom.GetObject('Strom Zaehlerstand');
var aA = dom.GetObject('Strom Leistungsaufnahme aktuell');
var vLg = dom.GetObject('Strom Verbrauch seit letzter Ablesung');
var vTg = dom.GetObject('Strom Verbrauch heute');
var vWg = dom.GetObject('Strom Verbrauch laufende Woche');
var vMg = dom.GetObject('Strom Verbrauch laufender Monat');
var vJg = dom.GetObject('Strom Verbrauch laufendes Kalenderjahr');
zA.State(zA.State()+(1.0/6));
vLg.State(vLg.State()+(1.0/6));
vTg.State(vTg.State()+(1.0/6));
vWg.State(vWg.State()+(1.0/6));
vMg.State(vMg.State()+(1.0/6));
vJg.State(vJg.State()+(1.0/6));
var ts1 = zA.Timestamp();
var ts2 = aA.Timestamp();
var tz = aA.State(600000/(ts1.ToInteger()-ts2.ToInteger()));
Neben dem Verbrauch je Zeiteinheit ermittelt das Script auch die aktuelle Leistungsaufnahme im Zeitraum zwischen den Ausgangsimpulsen des Vorwahlzählers auf folgender Grundlage:
1 Impuls = 1kWh * "Teiler" / "Zähler" = 1000 *3600 Ws * "Teiler" / "Zähler"
bei meinen Werten ergibt sich also...
1 Impuls = 1000 * 3600 * 16 / 96 = 600000 Ws
Die aktuelle Leistungsaufnahme in Watt im Zeitraum zwischen den Ausgangsimpulsen des Vorwahlzählers wird dann wie folgt errechnet...
600000 Ws / "Zeitraum zwischen den Impulsen in Sekunden"
Aufgerufen wird das Script mit folgendem Programm...
Auto SV Stromzähler Auswertung.png
Auto SV Stromzähler Auswertung.png (16.29 KiB) 31921 mal betrachtet
Da ich mit dem HM-SCI-3-FM sowohl Ein- als auch Ausschaltimpulse auswerten kann, nutze ich den um 10 Sekunden verzögerten (s.o.) Ausschaltimpuls des Vorwahlzählers als Korrekturmöglichkeit, falls mal ein Einschaltimpuls verloren geht. Hierzu dient die zusätzliche Systemvariable "Strom Zaehler Trigger" als Prüfmedium. Die "oder-Verknüpfung" in der "wenn-Bedingung" und die letzten beiden Zeilen in der "dann-Bedingung" können aber auch weggelassen werden, z.B. bei Verwendung eines HM-PBI-4-FM an Stelle des HM-SCI-3-FM oder wenn der genutzte Teiler / Vorwahlzähler den Ausgang nur kurz schalten kann.

Die Anfangswerte für die jeweiligen CCU-Zähler setzt man manuell, am Besten über WebMatic.

Wer möchte, kann ergänzend den Verbrauch der letzten Stunde, der letzten 24 Stunden und der letzten 7 Tage über das "Universal Wrapper Device" von CuxD auswerten. Wie das grundsätzlich funktioniert, habe ich schon hier beschrieben: http://homematic-forum.de/forum/viewtop ... t=8#p90246.

Hierzu werden zusätzlich folgende Systemvariablen benötigt...
  • "Strom Verbrauch letzte 7 Tage", Zahl
    "Strom Verbrauch letzte 24 Std", Zahl
    "Strom Verbrauch letzte Stunde", Zahl
Das folgende Script schreibt die Daten aus CuxD in die Variablen...

Code: Alles auswählen

object oZSCux1 = dom.GetObject("Energiemonitor:1");
object o001ZSwT = oZSCux1.DPByHssDP("SWITCH_1H").Value();
object oZSCux2 = dom.GetObject("Energiemonitor:2");
object o024ZSwT = oZSCux2.DPByHssDP("SWITCH_24H").Value();
object o168ZSwT = oZSCux2.DPByHssDP("SWITCH_168H").Value();
var SV001h = dom.GetObject("Strom Verbrauch letzte Stunde");
var SV024h = dom.GetObject("Strom Verbrauch letzte 24 Std");
var SV168h = dom.GetObject("Strom Verbrauch letzte 7 Tage");
real x = SV001h.State(o001ZSwT/6);
x = SV024h.State(o024ZSwT/6);
x = SV168h.State(o168ZSwT/6);
und wird so aufgerufen...
Auto SV Zaehler Auswertung CUxD.png
Auto SV Zaehler Auswertung CUxD.png (10.92 KiB) 31921 mal betrachtet
So sieht das Ergebnis aus...
wm1.png
wm2.png
wm2.png (18.74 KiB) 31921 mal betrachtet
Leistungsaufnahme.png
Nach einem Reboot der CCU kann man die fehlenden Impulse einfach durch manuelles Ausführen des Auswerteprogramms nachholen (allerdings stimmt für diesen Zeitbereich dann die Leitungsaufnahmeberechnung natürlich nicht).

Zum Reset der Jahres-, Monats-, Wochen und Tageszähler auf "0" verwende ich Programme, die über das Zeitmodul der CCU kurz nach Mitternacht ausgeführt werden. Hier ein Beispiel für den Tageszähler...
Auto SV Reset Tageszähler Pushover CuXD.png
Auto SV Reset Tageszähler Pushover CuXD.png (13.06 KiB) 31921 mal betrachtet
Über die erste Zeile des Programms wird eine Pushnachricht verschickt, mit der die Werte vor dem Reset übermittelt werden. Hierzu verwende ich Pushover, das ich hier (http://homematic-forum.de/forum/viewtop ... 31&t=11579) schon im Detail beschrieben habe. Bei Bedarf kann man die Daten aber natürlich auch per Mail oder über einen anderen Dienst verschicken. Die folgenden Scripte müssen dann entsprechend angepasst werden.

Code: Alles auswählen

string zA = dom.GetObject("Strom Zaehlerstand").Value();
string vJg = dom.GetObject("Strom Verbrauch laufendes Kalenderjahr").Value();
var zeitraum;
! Zeitwert um 1 subtrahieren
time t = system.Date("%Y").ToInteger();
var zeitraum = t - 1;
! Push-Text zusammensetzen
string MailText;
string sDate = zeitraum.ToString();
MailText = "Achtung, der Stromverbrauch-Jahreszaehler wird zurueckgesetzt. Verbrauchswerte am Tag " # sDate # " vor dem Reset: ";
MailText = MailText # "Zaehlerstand: " # zA # "kWh, Strom Verbrauch laufendes Kalenderjahr: " # vJg # "kWh.  ";
string teilstr;
string sendmail = "";
! Mailtext erstellen (Wörter am Leerzeichen trennen)
foreach(teilstr, MailText.Split(" "))
{
sendmail = sendmail # "+" # teilstr;
}
! Eigentliche Mail absenden
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("curl -s -d token=TOKEN -d user=USER -d message='"#sendmail#"' -d sound=pushover http://api.pushover.net/1/messages.json");
}

Code: Alles auswählen

string zA = dom.GetObject("Strom Zaehlerstand").Value();
string vMg = dom.GetObject("Strom Verbrauch laufender Monat").Value();
var zeitraum;
! Zeitwert um 1 subtrahieren
time t = system.Date("%m").ToInteger();
if (t == 1) {zeitraum = 12;}
else {zeitraum = t - 1;}
! Push-Text zusammensetzen
string MailText;
string sDate = zeitraum.ToString();
MailText = "Achtung, der Stromverbrauch-Monatszaehler wird zurueckgesetzt. Verbrauchswerte am Tag " # sDate # " vor dem Reset: ";
MailText = MailText # "Zaehlerstand: " # zA # "kWh, Verbrauch laufender Monat: " # vMg # "kWh.  ";
string teilstr;
string sendmail = "";
! Mailtext erstellen (Wörter am Leerzeichen trennen)
foreach(teilstr, MailText.Split(" "))
{
sendmail = sendmail # "+" # teilstr;
}
! Eigentliche Mail absenden
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("curl -s -d token=TOKEN -d user=USER -d message='"#sendmail#"' -d sound=pushover http://api.pushover.net/1/messages.json");
}

Code: Alles auswählen

string zA = dom.GetObject("Strom Zaehlerstand").Value();
string vWg = dom.GetObject("Strom Verbrauch laufende Woche").Value();
var zeitraum;
! Zeitwert um 1 subtrahieren
time t = system.Date("%V").ToInteger();
if (t == 1) {zeitraum = "Letzte KW im Vorjahr";}
else {zeitraum = t - 1;}
! Push-Text zusammensetzen
string MailText;
string sDate = zeitraum.ToString();
MailText = "Achtung, der Stromverbrauch-Wochenzaehler wird zurueckgesetzt. Verbrauchswerte am Tag " # sDate # " vor dem Reset: ";
MailText = MailText # "Zaehlerstand: " # zA # "kWh, Verbrauch laufende Woche: " # vWg # "kWh.  ";
string teilstr;
string sendmail = "";
! Mailtext erstellen (Wörter am Leerzeichen trennen)
foreach(teilstr, MailText.Split(" "))
{
sendmail = sendmail # "+" # teilstr;
}
! Eigentliche Mail absenden
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("curl -s -d token=TOKEN -d user=USER -d message='"#sendmail#"' -d sound=pushover http://api.pushover.net/1/messages.json");
}

Code: Alles auswählen

string zA = dom.GetObject("Strom Zaehlerstand").Value();
string vTg = dom.GetObject("Strom Verbrauch heute").Value();
var zeitraum;
! Zeitwert um 1 subtrahieren
time t = system.Date("%j").ToInteger();
if (t == 1) {zeitraum = "Letzter Tag im Vorjahr";}
else {zeitraum = t - 1;}
! Push-Text zusammensetzen
string MailText;
string sDate = zeitraum.ToString();
MailText = "Achtung, der Stromverbrauch-Tageszaehler wird zurueckgesetzt. Verbrauchswerte am Tag " # sDate # " vor dem Reset: ";
MailText = MailText # "Zaehlerstand: " # zA # "kWh, Verbrauch heute: " # vTg # "kWh.  ";
string teilstr;
string sendmail = "";
! Mailtext erstellen (Wörter am Leerzeichen trennen)
foreach(teilstr, MailText.Split(" "))
{
sendmail = sendmail # "+" # teilstr;
}
! Eigentliche Mail absenden
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("curl -s -d token=TOKEN -d user=USER -d message='"#sendmail#"' -d sound=pushover http://api.pushover.net/1/messages.json");
}
Der Reset des Ablesezählers erfolgt manuell mit dem Taster an der Seite des Gerätes, der über einen freien Kanal des HM-SCI-3-FM das Reset-Programm triggert. Alternativ kann das Reset-Programm natürlich auch über andere Wege gestartet werden...
Auto SV Reset Ablseszähler Pushover CuXD.png
Auto SV Reset Ablseszähler Pushover CuXD.png (13.3 KiB) 31921 mal betrachtet
Auch hier lasse ich mir die Daten vor dem Reset schicken...

Code: Alles auswählen

string zA = dom.GetObject("Strom Zaehlerstand").Value();
string vLg = dom.GetObject("Strom Verbrauch seit letzter Ablesung").Value();
! Push-Text zusammensetzen
string MailText;
string sDate = system.Date("Tag %j/%Y, %A, %d.%m.%Y, %T Uhr");
MailText = "Achtung, der Stromverbrauch-Ablesezaehler wird zurueckgesetzt. Verbrauchswerte am Tag " # sDate # " vor dem Reset: ";
MailText = MailText # "Zaehlerstand: " # zA # "kWh, Verbrauch seit letzter Ablesung: " # vLg # "kWh.  ";
string teilstr;
string sendmail = "";
! Mailtext erstellen (Wörter am Leerzeichen trennen)
foreach(teilstr, MailText.Split(" "))
{
sendmail = sendmail # "+" # teilstr;
}
! Eigentliche Mail absenden
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("curl -s -d token=TOKEN -d user=USER -d message='"#sendmail#"' -d sound=pushover http://api.pushover.net/1/messages.json");
}
3. Statusinformation

Über ein mittels Zeitmodul getriggertes Programm können in regelmäßigen Abständen Informationen zum Zählerstand verschickt werden.

Code: Alles auswählen

string zA = dom.GetObject("Strom Zaehlerstand").Value();
string aA = dom.GetObject("Strom Leistungsaufnahme aktuell").Value();
string vLg = dom.GetObject("Strom Verbrauch seit letzter Ablesung").Value();
string vTg = dom.GetObject("Strom Verbrauch heute").Value();
string vWg = dom.GetObject("Strom Verbrauch laufende Woche").Value();
string vMg = dom.GetObject("Strom Verbrauch laufender Monat").Value();
string vJg = dom.GetObject("Strom Verbrauch laufendes Kalenderjahr").Value();
string MailText;
string sDate = system.Date("%d.%m.%Y, %T");
MailText = "Stromzahlerstatus vom " # sDate # ", ZaeStdAkt: " # zA # "kWh ";
MailText = MailText # "LstAfnAkt: " # aA # "W, VbrAbl: " # vLg # "kWh, VbrT: " # vTg # "kWh, VbrW: " # vWg # "kWh, VbrM: " # vMg # "kWh, VbrJ: " # vJg # "kWh.  ";
string teilstr;
string sendmail = "";
foreach(teilstr, MailText.Split(" "))
{
sendmail = sendmail # "+" # teilstr;
}
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("curl -s -d token=TOKEN -d user=USER -d message='"#sendmail#"' -d sound=bike http://api.pushover.net/1/messages.json");
}
Hier nutze ich bewusst nur Abkürzungen für die Bezeichnungen der Werte, damit die Pushnachrichten nicht zu lang werden. Das kann natürlich individuell angepasst werden.
Zuletzt geändert von JPS am 01.02.2016, 07:46, insgesamt 6-mal geändert.
Verwendung meiner Hinweise und Skripte auf eigenes Risiko | Ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung

Benutzeravatar
JPS
Beiträge: 1093
Registriert: 07.08.2010, 22:51
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 8 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Stromzähler mit HomeMatic auswerten - Teiler mit Arduino

Beitrag von JPS » 10.03.2013, 15:26

Einen Vorwahlzähler (Teiler) kann man alternativ zu der in o.a. Anleitung genutzten Industrievariante auch sehr leicht und kostengünstig auf einem Arduino-Board abbilden. Hier die Anleitung für zwei verschiedene Varianten...
  • Variante 1 - Zähler 16 zu 1 Schaltausgang schaltet auf HIGH
    Variante 2 - Zähler 16 zu 1 Schaltausgang schaltet auf LOW
Vorweg:
Wenn das Arduino-Board aus dem gleichen Netzteil versorgt wird wie der "EM 1000 WZ"und damit die gleiche Masse benutzt, kann der +5V Schaltausgang des "EM 1000 WZ" direkt an einem Eingang des Arduino-Boards verwendet werden. Die nachfolgende Beschreibung geht hiervon aus. Ansonsten sollte der Eingang über einen Optokoppler galvanisch getrennt werden.

Ich habe den Zähler mit dem Arduino UNO Klon "SainSmart UNO" aufgebaut, das Ganze sollte aber mit allen Arduinos (auch mit der kleinen Bauart NANO) funktionieren. Die Grundlagen zur Arduino-Programmierung kann man überall (z.B. bei http://arduino.cc/) nachlesen, weswegen ich hier im HomeMatic-Forum auf diesbezügliche Erläuterungen verzichte.


Variante 1 - Zähler 16 zu 1 Schaltausgang schaltet auf HIGH

Diese Variante kann z.B. verwendet werden, um das HM-SCI-3-FM über einen Optokoppler am Ausgang des Arduino zu schalten. Auch ein fertiges Ralais-Modul, das bei HIGH (+5V) schaltet, lässt sich so ansteuern.

Bauteileliste:
1 Arduino (z.B. Arduino UNO)
1 Optokoppler oder Ralais-Modul, das bei HIGH (+5V) schaltet
1 10k Ω Widerstand
1 220 Ω Widerstand

Schaltung:
Zaehler_16_zu_1_Schaltausgang_HIGH_Schaltplan.png
Aufbau:
Zaehler_16_zu_1_Schaltausgang_HIGH_Steckplatine.png
Arduino Programm (Sketch):

Code: Alles auswählen

/*
  Zähler 16 zu 1 Schaltausgang HIGH für Arduino 1.0.3 (getestet mit dem Arduino UNO Klon "SainSmart UNO") 
  
  Das Programm zählt die HIGH (+5V) Impulse am entprellten Pin 2. 
  Jeder Zählimpuls wird über eine LED am Pin 13 angezeigt.
  Nach dem 16. Impuls werden Pin 12 für 10 Sekunden auf HIGH (+5V) und der Zähler zurück gesetzt.
 */

#include <Bounce.h> // Entprell-Library einbeziehen

const int ledPin =  13; // Pin 13 (interne LED -> Zähltakt)
const int relaisPin =  12; // Pin 12 (Schaltausgang)

int inputPin = 2; // Pin 2 (Zähler-Eingang)
int counter = 0;  // Zähler-Variable initialisieren und auf 0 setzen
Bounce bouncer = Bounce(inputPin,5); // Entprell-Objekt mit 5 Millisekunden Entprellzeit initialisieren

void setup() // Setup-Routine (wird nur einmal durchlaufen)
{
  pinMode(ledPin, OUTPUT); // Pin 13 als Output
  pinMode(relaisPin, OUTPUT); // Pin 12 als Output
  pinMode(inputPin, INPUT); // Pin 2 als Input (kann weggelassen werden, da INPUT standard für alle Pins ist)
}

void loop() // Schleifen-Routine (wird unendlich oft wiederholt)
{
  if (bouncer.update()) // WENN der Eingang aktualisiert wird...
  {
    if (bouncer.read() == HIGH) // WENN der Eingang auf HIGH (+5V) steht, DANN...
    {
      counter++; // Zähler um 1 erhöhen
      digitalWrite(ledPin, HIGH); // Zähltakt-LED (Pin 13) einschalten
      delay(500); // 500 Millisekunden warten
      digitalWrite(ledPin, LOW); // Zähltakt-LED (Pin 13) ausschalten
    }
  }
  if (counter == 16) // WENN der Zähler auf 16 steht, DANN...
  {
    digitalWrite(relaisPin, HIGH); // Schaltausgang (Pin 12) +5V
    delay(10000); // 10 Sekunden warten
    digitalWrite(relaisPin, LOW); // Schaltausgang (Pin 12) 0V
  }
  counter = counter % 16; // Den Zähler beim Zählerstand 16 zurücksetzen
}
Variante 2 - Zähler 16 zu 1 Schaltausgang schaltet auf LOW

Diese Variante kann ist z.B. erforderlich, wenn das HM-SCI-3-FM über ein bereits fertig aufgebautes Ralais-Modul geschaltet werden soll, dessen Eingang auf Masse (LOW, 0V) geschaltet werden muss...
Opto gegen Masse.png
Opto gegen Masse.png (4.25 KiB) 31631 mal betrachtet
Solch ein Ralais-Modul ist beispielsweise das hier bei meinem Prototyp verwendete "SainSmart 2 Channel 5V Relay Module for Arduino"...
Zaehler_16_zu_1_Schaltausgang_LOW_Prototyp_Forum.png
Bauteileliste:
1 Arduino (z.B. Arduino UNO)
1 Ralais-Modul, das bei LOW (0V) schaltet, z.B. "SainSmart 2 Channel 5V Relay Module for Arduino"
1 10k Ω Widerstand

Schaltung:
Zaehler_16_zu_1_Schaltausgang_LOW_Schaltplan.png
Aufbau:
Zaehler_16_zu_1_Schaltausgang_LOW_Steckplatine.png
Arduino Programm (Sketch):

Code: Alles auswählen

/*
  Zähler 16 zu 1 Schaltausgang LOW für Arduino 1.0.3 (getestet mit dem Arduino UNO Klon "SainSmart UNO"
  und dem "SainSmart 2 Channel 5V Relay Module for Arduino") 
  
  Das Programm zählt die HIGH (+5V) Impulse am entprellten Pin 2. 
  Jeder Zählimpuls wird über eine LED am Pin 13 angezeigt.
  Nach dem 16. Impuls werden Pin 12 für 10 Sekunden auf LOW (0V) und der Zähler zurück gesetzt.
 */

#include <Bounce.h> // Entprell-Library einbeziehen

const int ledPin =  13; // Pin 13 (interne LED -> Zähltakt)
const int relaisPin =  12; // Pin 12 (Schaltausgang)

int inputPin = 2; // Pin 2 (Zähler-Eingang)
int counter = 0;  // Zähler-Variable initialisieren und auf 0 setzen
Bounce bouncer = Bounce(inputPin,5); // Entprell-Objekt mit 5 Millisekunden Entprellzeit initialisieren

void setup() // Setup-Routine (wird nur einmal durchlaufen)
{
  pinMode(ledPin, OUTPUT); // Pin 13 als Output
  pinMode(relaisPin, OUTPUT); // Pin 12 als Output
  pinMode(inputPin, INPUT); // Pin 2 als Input (kann weggelassen werden, da INPUT standard für alle Pins ist)
  digitalWrite(relaisPin, HIGH); // Schaltausgang (Pin 12) +5V
}

void loop() // Schleifen-Routine (wird unendlich oft wiederholt)
{
  if (bouncer.update()) // WENN der Eingang aktualisiert wird...
  {
    if (bouncer.read() == HIGH) // WENN der Eingang auf HIGH (+5V) steht, DANN...
    {
      counter++; // Zähler um 1 erhöhen
      digitalWrite(ledPin, HIGH); // Zähltakt-LED (Pin 13) einschalten
      delay(500); // 500 Millisekunden warten
      digitalWrite(ledPin, LOW); // Zähltakt-LED (Pin 13) ausschalten
    }
  }
  if (counter == 16) // WENN der Zähler auf 16 steht, DANN...
  {
    digitalWrite(relaisPin, LOW); // Schaltausgang (Pin 12) 0V
    delay(10000); // 10 Sekunden warten
    digitalWrite(relaisPin, HIGH); // Schaltausgang (Pin 12) +5V
  }
  counter = counter % 16; // Den Zähler beim Zählerstand 16 zurücksetzen
}
Beide Programme können leicht auf andere Teilerverhältnisse angepasst werden. Hierzu muss im Code an folgenden Stellen die Zahl "16" geändert werden.
(...)
if (counter == 16) // WENN der Zähler auf 16 steht, DANN...
(...)
counter = counter % 16; // Den Zähler beim Zählerstand 16 zurücksetzen
(...)
Zu beachten ist dabei, dass der Zähler während der Wartezeiten (delay) nicht zählt. Wenn die Impulse vom Zähler schneller kommen, als die Programmschleife durchläuft, wird er daher nicht richtig zählen können. In diesem Fall müssen die Wartezeiten ggf. reduziert werden.

Die Schaltpläne und Steckbrettbilder wurden mit Fritzing http://fritzing.org erstellt.
Zuletzt geändert von JPS am 12.03.2013, 23:12, insgesamt 1-mal geändert.
Verwendung meiner Hinweise und Skripte auf eigenes Risiko | Ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung

Benutzeravatar
JPS
Beiträge: 1093
Registriert: 07.08.2010, 22:51
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 8 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Stromzähler mit HomeMatic auswerten - Teiler mit Arduino

Beitrag von JPS » 19.03.2013, 23:02

Mit ein paar wenigen Euro Mehrinvestition für ein HD44780-kompatibles LCD-Display (z.B, eines vom Typ 1602), kann man den Zähler sehr einfach um eine Anzeige erweitern...
LCD00.jpg
Variante 3 - Zähler 16 zu 1 Schaltausgang schaltet auf LOW mit LCD-Anzeige

Bauteileliste:
1 Arduino (z.B. Arduino UNO)
1 LCD Anzeige 16*2 HD44780-kompatibel (z.B.Typ 1602)
1 Ralais-Modul, das bei LOW (0V) schaltet, z.B. "SainSmart 2 Channel 5V Relay Module for Arduino"
1 10k Ω Widerstand
1 220 Ω Widerstand
1 10k Ω Trimmer Potentiometer
1 Schalter (optional)

Schaltung:
Zaehler_16_zu_1_Schaltausgang_LOW_mit_Display_Schaltplan.png
Aufbau:
Zaehler_16_zu_1_Schaltausgang_LOW_mit_Display_Steckplatine.png
Arduino Programm (Sketch):

Code: Alles auswählen

/*
  Zähler 16 zu 1 Schaltausgang LOW für Arduino 1.0.3 mit LCD-Anzege
  getestet mit dem Arduino UNO Klon "SainSmart UNO", dem "SainSmart 2 Kanal 5V Relais Modul für Arduino"
  und einem HD44787-kompatiblen 16*2 LCD-Display.
  
  Das Programm zählt die HIGH (+5V) Impulse am entprellten Pin 2. 
  Jeder Zählimpuls wird über eine LED am Pin 13 angezeigt.
  Nach dem 16. Impuls wird Pin 12 für 10 Sekunden auf LOW (0V) und der Zähler zurück gesetzt.
*/

#include <Bounce.h> // Entprell Bibliothek einbeziehen
#include <LiquidCrystal.h> // LCD Bibliothek einbeziehen

LiquidCrystal lcd(11, 10, 6, 5, 4, 3); //LCD Bibliothek mit den entsprechenden Pins initialisieren

const int ledPin =  13; // Pin 13 (interne LED -> Zähltakt)
const int relaisPin =  12; // Pin 12 (Schaltausgang)

int inputPin = 2; // Pin 2 (Zähler-Eingang)
int counter = 0;  // Zähler-Variable initialisieren und auf 0 setzen
float kwh = 0; // Variable für den Verbrauch initialisieren und auf 0 setzen
Bounce bouncer = Bounce(inputPin,5); // Entprell-Objekt mit 5 Millisekunden Entprellzeit initialisieren

void setup() // Setup-Routine (wird nur einmal durchlaufen)
{
  pinMode(ledPin, OUTPUT); // Pin 13 als Output
  pinMode(relaisPin, OUTPUT); // Pin 12 als Output
  pinMode(inputPin, INPUT); // Pin 2 als Input (kann weggelassen werden, da INPUT standard für alle Pins ist)
  digitalWrite(relaisPin, HIGH); // Schaltausgang (Pin 12) +5V
  lcd.begin(16, 2); // Größe des LCD einstellen
  lcd.print("Zaehler bis 16"); // Begrüßungstext schreiben
  lcd.setCursor(0, 1); // Cursor positionieren
  lcd.print("fuer HomeMatic"); // Begrüßungstext schreiben
  delay(3000); // 3 Sekunden warten
  lcd.clear(); // Display löschen
  lcd.print("0"); // Zähler auf 0 setzen
  lcd.setCursor(0, 1); // Cursor positionieren
  lcd.print("0.00000 kWh"); // Verbrauch auf 0 setzen
}

void loop() // Schleifen-Routine (wird unendlich oft wiederholt)
{
  if (bouncer.update()) // WENN der Eingang aktualisiert wird UND...
  {
    if (bouncer.read() == HIGH) // ...WENN der Eingang auf HIGH (+5V) steht, DANN...
    {
      counter++; // Zähler um 1 erhöhen
      kwh = (counter * 0.0104167); // Verbrauch * Zählimpulse berechnen (für Zähler mit 96 Impulsen (Umdrehungen) / kwh)
      lcd.setCursor(0, 0); // Cursor positionieren
      lcd.print(counter); // Zähler anzeigen
      lcd.setCursor(0, 1); // Cursor positionieren
      lcd.print(kwh,5); // Verbrauch anzeigen (mit 5 Nachkommastellen)
      lcd.print(" kWh"); // Einheit "kwh" anzeigen
      digitalWrite(ledPin, HIGH); // Zähltakt-LED (Pin 13) einschalten
      delay(500); // 500 Millisekunden warten
      digitalWrite(ledPin, LOW); // Zähltakt-LED (Pin 13) ausschalten
    }
  }
  if (counter == 16) // WENN der Zähler auf 16 steht, DANN...
  {
    lcd.setCursor(3, 0); // Cursor positionieren
    lcd.print("Senden an CCU"); // "Senden an CCU" anzeigen
    digitalWrite(relaisPin, LOW); // Schaltausgang (Pin 12) 0V
    delay(10000); // 10 Sekunden warten
    digitalWrite(relaisPin, HIGH); // Schaltausgang (Pin 12) +5V
    lcd.clear(); // Display löschen
    lcd.print("0"); // Zähler auf 0 setzen
    lcd.setCursor(0, 1); // Cursor positionieren
    lcd.print("0.00000 kWh"); // Verbrauch auf 0 setzen
    counter = counter % 16; // Den Zähler beim Zählerstand 16 zurücksetzen
  }
 }
Impressionen:
LCD02.jpg
LCD01.jpg
LCD03.jpg
LCD04.jpg
LCD05.jpg
Die Schaltpläne und Steckbrettbilder wurden mit Fritzing http://fritzing.org erstellt.
Verwendung meiner Hinweise und Skripte auf eigenes Risiko | Ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung

Benutzeravatar
JPS
Beiträge: 1093
Registriert: 07.08.2010, 22:51
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 8 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Re: Stromzähler mit HomeMatic auswerten

Beitrag von JPS » 02.07.2013, 20:57

Ein kurzer Hinweis für alle, die bei den o.a. Scripten die Pushover-Funktionalität übernommen haben und auf die CCU2 aufrüsten.

Bei Verwendung der CCU2 funktioniert der hier http://homematic-forum.de/forum/viewtop ... 579#p86241 beschriebene Weg zur Installation des "Client for URLs" (CURL) nicht mehr. Der CURL lässt sich zwar installieren, läuft dann aber nicht.

Mittlerweile beinhaltet aber auch der CUxD (sollte ja ohnehin installiert sein :wink: ) einen CURL, der hierfür problemlos genutzt werden kann (natürlich auch als Alternative für die CCU1).
Der Aufruf für Pushover lautet dann z.B. wie folgt, die o.a. Skripte müssen entsprechend angepasst werden...

Code: Alles auswählen

dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -s -d token=TOKEN -d user=USER -d message='"#sendmail#"' -d sound=bike http://api.pushover.net/1/messages.json");
Verwendung meiner Hinweise und Skripte auf eigenes Risiko | Ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung

MarcMatic
Beiträge: 322
Registriert: 02.03.2014, 10:06
Danksagung erhalten: 2 Mal

Re: Stromzähler mit HomeMatic auswerten

Beitrag von MarcMatic » 05.05.2014, 06:30

Guten Morgen!
Hossa, das ist ja mal eine Anleitung. Sieht sehr interessant aus. Ich würde auch gerne den "alten" Stromzähler zum sprechen bringen, allerdings ist mir dann dieser Lösungsansatz doch noch etwas zu viel Gebastelei. So weit bin ich noch nicht ;-)

Gibt es zwischenzeitlich vielleicht noch einen einfacheren Ansatz? Hat sich auf dem Gebiet etwas getan? Oder kommt gar wieder ein Fertigprodukt auf den Markt, welches sich direkt in HM einbinden lässt?

Alternativ:
Welcher neue/digitale Zähler wäre denn geeignet, um ihm sehr einfach mit der HM sprechen zu lassen?

Lg,
Marc

Benutzeravatar
anli
Beiträge: 4326
Registriert: 10.06.2009, 14:01
Wohnort: 20 Min. nördlich von Hannover und bei Bremen
Hat sich bedankt: 1 Mal
Danksagung erhalten: 23 Mal
Kontaktdaten:

Re: Stromzähler mit HomeMatic auswerten

Beitrag von anli » 05.05.2014, 23:04

Schau dir mal http://www.tq-group.com/produkte/produk ... extb/Main/ an, irgendwo gab es in den vergangenen zwei, drei Wochen auch einen Thread zu einem ähnlichen Thema.
Herzliche Grüße, anli

Alle Angaben ohne Gewähr und Haftung meinerseits. Verwendung der von mir zur Verfügung gestellten Downloads auf eigene Gefahr. Ich bitte um Verständnis, dass ich aus zeitlichen Gründen keine unaufgeforderte Hilfestellung per PN/Mail geben kann. Bitte allgemeine Fragen ins Forum stellen, hier können viele fähige User viel schneller helfen.

Homematic-Manager v2: einfaches Tool zum Erstellen von Direktverknüpfungen und Bearbeiten von Gerätenamen, -parametern etc. für Homematic und HomematicIP (Alternative diesbzgl. zur WebUI)

Einsteiger-Hilfeerweiterter Skript-Parser


Benutzeravatar
JPS
Beiträge: 1093
Registriert: 07.08.2010, 22:51
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 8 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Re: Stromzähler mit HomeMatic auswerten

Beitrag von JPS » 22.11.2014, 10:20

Für die Veröffentlichung im ELVjournal 1/2015 wurde der Bausatz für einen drahtlosen Strom-/Gassensor (HM-ES-Tx-WM) angekündigt, der bereits in die aktuellen Firmwareversionen von CCU 2 und CCU 1 aufgenommen ist und die hier beschriebene Lösung obsolet machen dürfte.

Wer sich mit dem Gedanken trägt, seine Zählerstände in HomeMatic zu integrieren, sollte die Lösung mittels HM-ES-Tx-WM im Auge behalten.
Verwendung meiner Hinweise und Skripte auf eigenes Risiko | Ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung

Benutzeravatar
JPS
Beiträge: 1093
Registriert: 07.08.2010, 22:51
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 8 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Re: Stromzähler mit HomeMatic auswerten

Beitrag von JPS » 08.02.2015, 14:15

JPS hat geschrieben:Für die Veröffentlichung im ELVjournal 1/2015 wurde der Bausatz für einen drahtlosen Strom-/Gassensor (HM-ES-Tx-WM) angekündigt, der bereits in die aktuellen Firmwareversionen von CCU 2 und CCU 1 aufgenommen ist und die hier beschriebene Lösung obsolet machen dürfte.

Wer sich mit dem Gedanken trägt, seine Zählerstände in HomeMatic zu integrieren, sollte die Lösung mittels HM-ES-Tx-WM im Auge behalten.
Ich habe mir den HM-ES-TX-WM jetzt mal besorgt und hierzu ein angepasstes Tuorial geschrieben, das ihr unter dem Link auf meinem Blog findet.
Verwendung meiner Hinweise und Skripte auf eigenes Risiko | Ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung

Benutzeravatar
JPS
Beiträge: 1093
Registriert: 07.08.2010, 22:51
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 8 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Re: Stromzähler mit HomeMatic auswerten

Beitrag von JPS » 20.02.2015, 20:10

Nach zwei Wochen Abwesenheit habe ich eben mal die Werte aus der Systemvariablen, die von dem Skript aus dem Tutorial mit den Daten des HM-ES-TX-WM (Ferrarissensor) geschrieben wurden, mit der Anzeige des Stromzählers verglichen, schaut doch gar nicht so übel aus :D ...
Zwischenablage03.png
Zwischenablage02.png
Zwischenablage02.png (3.66 KiB) 21219 mal betrachtet
Verwendung meiner Hinweise und Skripte auf eigenes Risiko | Ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung

Antworten

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