Homematic Stromzähler HM-ES-TX-WM auf Tag und Nachttrarif aufteilen

Begonnen von Gunther, 22 Dezember 2018, 22:45:08

Vorheriges Thema - Nächstes Thema

Gunther

Ich brauche mal Eure Hilfe. Stehe auf dem Schlauch.

Ich habe einen Homematic Stromzähler HM-ES-TX-WM mit einem Ferrariszähler.
Funktioniert soweit auch. Nun habe ich Tag- und Nachtstrom (HT und NT), die mein uralter Zähler zeitabhängig auch auswertet (2 Anzeigen).

Wie kann ich das realisieren?

Ich muss gestehen, ich bin nicht der Programmierer. Anbei meine Deinitionen. Zuerst Hauptdevice und dann die beiden Channel:

Hauptdevice:

defmod kg_sk_Stromzaehler CUL_HM 4D16FB
attr kg_sk_Stromzaehler IODev HMLAN1
attr kg_sk_Stromzaehler IOgrp vccu:HMLAN1
attr kg_sk_Stromzaehler actCycle 000:10
attr kg_sk_Stromzaehler actStatus alive
attr kg_sk_Stromzaehler autoReadReg 4_reqStatus
attr kg_sk_Stromzaehler expert 2_raw
attr kg_sk_Stromzaehler firmware 1.0
attr kg_sk_Stromzaehler model HM-ES-TX-WM
attr kg_sk_Stromzaehler room 00_KG_Sicherungskasten
attr kg_sk_Stromzaehler serialNr NEQ0863699
attr kg_sk_Stromzaehler subType powerSensor
attr kg_sk_Stromzaehler webCmd getConfig:clear msgEvents

setstate kg_sk_Stromzaehler CMDs_done
setstate kg_sk_Stromzaehler 2018-12-22 22:06:32 .D-devInfo 010101
setstate kg_sk_Stromzaehler 2018-12-22 22:06:32 .D-stc 51
setstate kg_sk_Stromzaehler 2018-12-22 22:38:40 .protLastRcv 2018-12-22 22:38:40
setstate kg_sk_Stromzaehler 2018-12-22 22:06:32 Activity alive
setstate kg_sk_Stromzaehler 2018-12-22 21:59:22 CommandAccepted no
setstate kg_sk_Stromzaehler 2018-12-22 22:06:32 D-firmware 1.0
setstate kg_sk_Stromzaehler 2018-12-22 22:06:32 D-serialNr NEQ0863699
setstate kg_sk_Stromzaehler 2018-12-22 21:28:40 R-pairCentral set_0xA00001
setstate kg_sk_Stromzaehler 2018-12-22 22:06:24 state CMDs_done


Channel 1:

defmod kg_sk_Stromzaehler_IEC_01 CUL_HM 4D16FB01
attr kg_sk_Stromzaehler_IEC_01 comment E ist kummuliert kWh\
P ist aktueller Verbrauch in Watt
attr kg_sk_Stromzaehler_IEC_01 model HM-ES-TX-WM
attr kg_sk_Stromzaehler_IEC_01 peerIDs
attr kg_sk_Stromzaehler_IEC_01 room 00_KG_Sicherungskasten
attr kg_sk_Stromzaehler_IEC_01 userReadings kWh {sprintf("%.1f",ReadingsVal("kg_sk_Stromzaehler_IEC_01","energyCalc","???")/1000+253003.1)}, \
Kosten {(sprintf("%.1f",ReadingsVal("kg_sk_Stromzaehler_IEC_01","energyCalc","???")/1000+253003.1))*0.333}

setstate kg_sk_Stromzaehler_IEC_01 2018-12-22 22:38:40 Kosten 84250.2654
setstate kg_sk_Stromzaehler_IEC_01 2018-12-22 22:38:40 boot off
setstate kg_sk_Stromzaehler_IEC_01 2018-12-22 22:38:40 eState E: 718.7 P: 1060
setstate kg_sk_Stromzaehler_IEC_01 2018-12-22 22:38:40 energy 718.7
setstate kg_sk_Stromzaehler_IEC_01 2018-12-22 22:38:40 energyCalc 718.7
setstate kg_sk_Stromzaehler_IEC_01 2018-12-22 22:38:40 kWh 253003.8
setstate kg_sk_Stromzaehler_IEC_01 2018-12-22 21:39:32 peerList
setstate kg_sk_Stromzaehler_IEC_01 2018-12-22 22:38:40 power 1060


Channel 2:

defmod kg_sk_Stromzaehler_IEC_02 CUL_HM 4D16FB02
attr kg_sk_Stromzaehler_IEC_02 model HM-ES-TX-WM
attr kg_sk_Stromzaehler_IEC_02 room 00_KG_Sicherungskasten

setstate kg_sk_Stromzaehler_IEC_02 791.6
setstate kg_sk_Stromzaehler_IEC_02 2018-12-22 22:41:37 state 791.6



FHEM@Proxmox@Nuc: TabletUI als User-Interface (4 Wandtablets) / IOs per ser2net gekapselt
Homematic: Heizung, Fenster, Bewegung | Jeelink: Temperatur | Z-Wave: Bewegung, Temperatur | FS20: Temperatur, Fenster | Viessmann-Heizung eingebunden

Pfriemler

Ich würde für beide Tarife eigene Zähler programmieren.
Beim Wechsel des Tarifs:
1. Differenz von Zählerstand (energyCalc oder dein Reading kWh) zum Zählerstand der letzten Berechnung errechnen
2. zum Summenzähler für diesen Tarif addieren, Kosten berechnen und für diesen Tarif addieren
3. aktuellen Zählerstand in Variable (reading) sichern (für die nächste Berechnung nach 1.)
Wenn Du eine Fernumschaltung hast, müsstest Du das noch am Zähler erfassen und bei jeder Tarifumschaltung diese Berechnung auslösen.
Wenn zeitgesteuert, dann über Zeitsteuerung in FHEM auslösen.

Nun darfst Du entscheiden, ob Du das in einem DOIF, einem Notify und zusätzlich wahlweise in einer SUB in myUtils unterbringst.

Nur als Anregung hier der Quelltext meines DOIFs, was in der 59. Minute jeder Stunde den Verbrauch der letzten Stunde errechnet und zusammen mit dem Endzählerstand in einem Reading meines TX-WM speichert (ich nutze auch ein kWh-Userreading), welches in einer Logdatei landet und für die Anzeige im Web-GUI von FHEM verwendet wird.
defmod di_SaveEZaehler DOIF ([:59]) (setreading EZaehler_IEC_01 enHr {(sprintf("%.2f", [EZaehler_IEC_01:kWh]-[EZaehler_IEC_01:lastHourCount]))." -> ".[EZaehler_IEC_01:kWh]}, setreading EZaehler_IEC_01 lastHourCount [EZaehler_IEC_01:kWh])\


Dein Userreading "Kosten" ist momentan natürlich eh witzlos, wenn Du unterschiedliche Tarife hast.
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Gunther

Danke für Deine Anregung!

Ich habe nun folgendes gemacht:
Es gibt zu meinem Kanal 1 eine statistics Definition:
defmod stat_kg_sk_Stromzaehler_IEC_01 statistics kg_sk_Stromzaehler_IEC_01
attr stat_kg_sk_Stromzaehler_IEC_01 deltaReadings kg_sk_Stromzaehler_IEC_01:energyCalc
attr stat_kg_sk_Stromzaehler_IEC_01 group Statistics
attr stat_kg_sk_Stromzaehler_IEC_01 room 00_KG_Sicherungskasten,Logik
attr stat_kg_sk_Stromzaehler_IEC_01 singularReadings kg_sk_Stromzaehler_IEC_01:energyCalc:Delta:(Hour)


Mit dem singularReading (statEnergyCalcHour) arbeite ich dann im DOIF weiter.
Hier die Frage, ob die Zeitpunkte zu Ungenauigkeiten führen und ggf. das Reading statEnergyCalcHourLast besser wäre um die ganze Stunde abzufragen.
defmod doif_stromverbrauch DOIF ([06:00-21:59:59] and ([:59:50])) (setreading kg_sk_Stromzaehler_IEC_01 HT {(sprintf("%.2f", [kg_sk_Stromzaehler_IEC_01:HT]+[kg_sk_Stromzaehler_IEC_01:statEnergyCalcHour/1000]))}) DOELSEIF ([22:00-05:59:59] and ([:59:50])) (setreading kg_sk_Stromzaehler_IEC_01 NT {(sprintf("%.2f", [kg_sk_Stromzaehler_IEC_01:NT]+[kg_sk_Stromzaehler_IEC_01:statEnergyCalcHour/1000]))})
attr doif_stromverbrauch room 00_KG_Sicherungskasten,Logik


Passt das oder habe ich da Ungenauigkeiten oder sonstige Böcke drin?

Der Vollständigkeit halber:
Mein Kanal 1 schaut so aus:
defmod kg_sk_Stromzaehler_IEC_01 CUL_HM 4D16FB01
attr kg_sk_Stromzaehler_IEC_01 comment E ist kummuliert kWh\
P ist aktueller Verbrauch in Watt\
\
NT und HT Zählerstände eingeben:\
\
setreading kg_sk_Stromzaehler_IEC_01 HT 2222.1\
setreading kg_sk_Stromzaehler_IEC_01 NT 3333.1
attr kg_sk_Stromzaehler_IEC_01 model HM-ES-TX-WM
attr kg_sk_Stromzaehler_IEC_01 peerIDs
attr kg_sk_Stromzaehler_IEC_01 room 00_KG_Sicherungskasten
attr kg_sk_Stromzaehler_IEC_01 userReadings KostenNT {(sprintf("%.1f",ReadingsVal("kg_sk_Stromzaehler_IEC_01","NT","???")/1000))*0.2374}\
KostenHT {(sprintf("%.1f",ReadingsVal("kg_sk_Stromzaehler_IEC_01","HT","???")/1000))*0.1723}

FHEM@Proxmox@Nuc: TabletUI als User-Interface (4 Wandtablets) / IOs per ser2net gekapselt
Homematic: Heizung, Fenster, Bewegung | Jeelink: Temperatur | Z-Wave: Bewegung, Temperatur | FS20: Temperatur, Fenster | Viessmann-Heizung eingebunden

Gunther

Das hat schonmal wunderbar nicht funktioniert.
Wie kann ich sagen, dass er immer am Ende einer Stunde, also um xx:59:50 etwas tun soll?

([:59:50])) klappt nicht

([:59])) klappt, aber natürlich 50 Sekunden zu früh
FHEM@Proxmox@Nuc: TabletUI als User-Interface (4 Wandtablets) / IOs per ser2net gekapselt
Homematic: Heizung, Fenster, Bewegung | Jeelink: Temperatur | Z-Wave: Bewegung, Temperatur | FS20: Temperatur, Fenster | Viessmann-Heizung eingebunden

Pfriemler

Ich habe saisonbedingt gerade wenig Muße, deine Vorgänge detailliert nachzuvollziehen, das kommt erst später.
Ob DOIF-Zeitpunkte auch auf Sekunden festgelegt werden können, müsste ich jetzt auch erst erlesen - aber wenn Du es so genau brauchst, verwende doch die volle Stunde. ([:00]). Das ist dann auch nicht ungenauer als 10 Sekunden vorher ... oder gibt das Probleme mit der Statistik?
Vielleicht geht ein "at" genauer...
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."