Tarifumschaltung HT/NT erkennen - eHZ EDL21 - SMLUSB.pm - USB-IR-Lesekopf

Begonnen von Omega-5, 20 Februar 2014, 21:05:07

Vorheriges Thema - Nächstes Thema

Omega-5

Bei mir ist ein Stromzähler eHZ EDL21 von EMHmetering eingebaut, den ich über einen USB-IR-Schreiblesekopf (Von Udo vom Volkszählerprojekt) mittels SMLUSB.pm eingebunden habe. Es handelt sich dabei um einen Zähler für zwei Tarife. Zwischen diesen wird durch einen Rundsteuerempfänger umgeschaltet, nicht immer zur gleichen Zeit.
Während des preiswerteren Tarifes (Nachtstrom-Speicherheizung) möchte ich auch ein Heizgerät in meinem Werkraum einschalten.
Leider habe ich im SML-Protokol keinen Eintrag (Flag) für den aktuell gültigen Tarif gefunden. Im Display des Zählers wird die entsprechende OBIS-Kennung unterstrichen.

Hier nun mein Versuch einer Lösung:

Weil die Umschaltung der Einheiten für die Anzeige der Momentanleistung ungünstig ist, habe ich in 70_SMLUSB.pm den Teil für die Umrechnung der Einheit auskommentiert:

70_SMLUSB.pm line 290-294

290| # If value is bigger than 9999 W/h change to kW/h
291|
292| # if (sprintf("%.2f",hexstr_to_signed32int(substr($telegramm,$length_all,$length_value-2))/$scaler) > 9999) {
293| # $scaler = 10000;
294| # $unit = "kW/h"; }


Als nächstes die Schaltsteckdose definieren:
define ke_Heizung FS20 22c9 00
attr ke_Heizung room FS20
define FileLog_ke_Heizung FileLog %L/ke_Heizung-%Y.log ke_Heizung
attr FileLog_ke_Heizung logtype fs20
attr FileLog_ke_Heizung room Logfiles


und jetzt den Zähler:
define zaehler SMLUSB /dev/ttyUSB0@9600
attr zaehler event-min-interval .*:30


Internals:
ZitatSTATE                  opened

Readings
Momentanleistung            4193.40   2014-02-20 17:06:38
Zählerstand-Bezug-Total      24072293.50   2014-02-20 17:06:38
Zählerstand-Tarif-1-Bezug   18547095.10   2014-02-20 17:06:38
Zählerstand-Tarif-2-Bezug   5525198.50   2014-02-20 17:06:38

Zählerstand-Tarif-2-Bezug ist der Tagstrom. Wenn der Wert sich nicht mehr ändert, muss also der NT aktiv sein.

Da die Abfrage mit OldValue(zaehler)  immer nur den STATE opened bringt, also einen eigenen Zwischenspeicher definieren:
define zaehler_T2_old dummy

Und jetzt das notify:
define Strom_NT_on_off notify zaehler:Zählerstand-Tarif-2-Bezug.* {\
if (ReadingsVal("zaehler","Zählerstand-Tarif-2-Bezug",0) eq Value("zaehler_T2_old")){\
if ($value{ke_Heizung} ne "on") {fhem "set ke_Heizung on"}\
} else {\
if ($value{ke_Heizung} ne "off") {fhem "set ke_Heizung off"}\
};; \
fhem "set zaehler_T2_old " . ReadingsVal("zaehler","Zählerstand-Tarif-2-Bezug",0);;}

Die inneren if($value{.... habe ich eingefügt weil sonst alle 30 Sekunden gesendet wird.

So das war wegen der vielen "Klammerei" schon nicht so ganz einfach (Perl und FHEM Anfänger).
Warscheinlich gibt es elegantere Lösungen, aber es klappt erstmal.

Gruß Frieder
RaspberryPi2, nanoCUL, 3x DS18B20, FS20: 4x Funk-Schalter ST-4, LaCrosseGW,
HomeMatic: HMLAN, HM-WDS10-TH-O, HM_MYS_RelaisBoard,
I2C: HYT221 über modifiziertes Modul I2_I2C_SHT21.pm (Q&D),