Neues Modul EMONITOR - EnergieMonitor

Begonnen von Elektrolurch, 06 Dezember 2014, 17:11:34

Vorheriges Thema - Nächstes Thema

Elektrolurch

Hallo zusammen,

bevoer da große Klimzüge gemacht werden, könnte ich den Code ergänzen.
Zunächst einmal das Problem:

1. CUL_HM
Da gibt es wohl devices, die nur schalten können und andere, die auch einen Verbrauchswert liefern können.
Da ich keine Homatic habe, war mir das auch nicht bekannt.
Die jetztige Lösung unterscheidet rein nach dem TYPE des devices, ob die Ein- und Ausschaltvorgänge oder die Verbrauchswerte ausgewertet werden sollen.

Nun wäre also folgende Lösung denkbar:

am Beispiel CUL_HM :

Dieser Typ wird sowohl in der Liste im Code als "measuring devices" (mit energy als reading) eingetragen, als auch per Attribut in die Liste der Typen mit Schaltereignis aufgenommmen.

Hat ein solches device dann das Attribut "poer-on" so werden die Auswertungen "Schaltereignisse" verwendet, fehlt das Attribut, so wird das reading "energy" ausgewertet. Ist dies nicht vorhanden, wird das device ignoriert.

Ich muss mal sehen, wo ich das überall im Code anpassen muss. Dauert ein bisserl. Da ich das mangels HM nicht testen kann, brauche ich dann eurren Response.

Habe hier aus dem thread schon einige Änderungen eingebaut:

1. der state für das  Schaltereignis kann jetzt ein Ein On on ON oN usw. sein (wird mit lc alles in Kleinschreibung verwandelt).
2. 'CUL_HM' => 'energy');
wurde noch mit aufgenommen.
3. Die Erzeugung der readingsGroup wurde geändert, bezüglich:
valueFormat {($READING=~m/mode|typ|view/)?'':'%d Wh'}
Grund: Die readings für die Umschaltung der rg blieben bei der reinen numerischen Definition für die readingsGroup unberücksichtigt und daher erschienen Warnungen im log.
4. Einige kleine Fehlerbeseitigungen und Performanceverbesserungen


Noch zu ändern:
1. Aus EM müsste ich "E_Monitor" machen, da wohl EM als device bereits existiert. Werde für die Konvertierung der Daten eine kleine Routine anbieten.
2. Ist jemand an einem reading "lifetime" interessiert? Wird in Sekunden hochgezält, wenn device auf ein/on geht. Wenn ich schon den Codereview für den CUL_HM durchführe, kann ich das auch noch einbauen.


Gruß

Elektrolurch

configDB und Windows befreite Zone!

dombar

@Elektrolurch
Das hört sich gut an!
Klar teste Ich das dann mit meinen Homematic komponenten!

@Markus
Das verstehe Ich jetzt nicht was du bezweckst? Kann es sein das du das Reading für die spalte lfd Std. bei einem Energy reading haben willst??? Da dieser sich erst in der heute Spalte jede Stunde ändert?
1x FB7490, 2x FBDECT200, 1x RPI als Öltankanzeige mit TEK603, 1x Synology NAS, 1xCUL FS20, 2x CCU3, 1xFS20DWT , 1x FS20 DI22-4, 1x FS20IR, 3x FS20ST, 1 x KS300, 3x HM-LC-Sw1PBU-FM, 6x HM-ES-PMSw1-Pl,  Siemens S7 CPU 315 für Stromzähler auf S0 Basis uvm.

Markus

Ich habe 1 wire zählermodule (OWCOUNT) ein Modul kann zwei Zähler ablesen und in den readings anzeigen.
per attr kann ich zwar den readings/Zählerständen eigene Namen zuweisen aber es bleiben immer noch zwei Zählerstände in einem Gerät.
Ich hab jetzt versucht die readings aus einem Gerät rauszukopieren und in zwei Geräte aufzuteilen.
da ich keinen Dummy verwenden kann da er ja bereits in EM verwendet wird und nur noch auf das attr power-on hört versuche ich es über ein anderes Gerät das ich als Dummy missbrauche.
Hoffe das ist jetzt halbwegs verständlich
zum besseren Verständnis hänge ich mal eine Detailseite an

Internals:
ASYNC
0
CFGFN
/opt/fhem/cfg/one_wire.cfg
DEF
DS2423 B86D0F000000
INTERVAL
900
IODev
OWio1
NAME
Zahler_Kuche
NOTIFYDEV
global
NR
752
NTFY_ORDER
50-Zahler_Kuche
OW_FAMILY
1D
OW_ID
B86D0F000000
PRESENT
1
ROM_ID
1D.B86D0F000000.02
STATE
Energy-Kuhlschrank: 2.544 kWh power-Kuhlschrank: 0.159 kW Energy-E-Herd: 0.017 kWh power: 0.000 kW
TYPE
OWCOUNT
offtime
1422637293
oldenergy
0
oldenergytime
1422637293
ontime
1422637293


readings:
Energy-E-Herd
0.0173
2015-01-30 18:33:32
Energy-Kuhlschrank
2.5443
2015-01-30 18:33:32
day
D29 Energy-Kuhlschrank: 3.33 kWh Energy-KuhlschrankM: 72.09 kWh Energy-E-Herd: 0.43 kWh Energy-E-HerdM: 10.33 kWh
2015-01-29 23:45:05
power
0
2015-01-30 18:33:32
power-E-Herd
0
2015-01-07 02:00:51
power-Kuhlschrank
0.1591
2015-01-30 18:33:32
power-hourly
0
2015-01-30 18:33:40
power-hourly-last
0.0
2015-01-30 18:01:34
state
Energy-Kuhlschrank: 2.544 kWh power-Kuhlschrank: 0.159 kW Energy-E-Herd: 0.017 kWh power: 0.000 kW
2015-01-30 18:33:32


Attributes:

AFactor              0.001                                        deleteattr
AMode              daily                                           deleteattr               
AName              Energy-Kuhlschrank|energy             deleteattr
AOffset             24.33                                         deleteattr
APeriod            hour                                           deleteattr
ARate               power-Kuhlschrank|power               deleteattr
AUnit                kWh|kWh                                   deleteattr
BFactor             0.0008                                      deleteattr
BMode              daily                                          deleteattr
BName             Energy-E-Herd|energy                   deleteattr
BOffset            5.6                                             deleteattr
BPeriod            hour                                          deleteattr
BRate               power|power                            deleteattr
BUnit                kWh|kWh                                  deleteattr
IODev              OWio1                                       deleteattr
LogM                FileLog_Zahler_Kuche                   deleteattr
LogY                 FileLog_Zahler_Kuche                   deleteattr
interval            900                                           deleteattr
model              DS2423                                     deleteattr
room                Energie                                     deleteattr



Gruss Markus
Raspberry Pi2 als FHEM-Plattform
HM, FS20, 1-Wire, PanStamp,LW12,Intertechno,ESPEasy,Alexa

dombar

#33
Mal schauen ob Ich es jetzt verstanden habe!

Aus deinen Readings:
Energy-E-Herd
0.0173
2015-01-30 18:33:32
Energy-Kuhlschrank
2.5443
2015-01-30 18:33:32

Diese Werte willst du dann einfügen lassen!

Wäre das dann nicht eine alternative?

define energiedumm dummy
attr energiedumm room Noah
define energie_lesen at +*01:00:00 { fhem("attr energiedumm power-on ".ReadingsVal("Fritz_Multimedia","energy","")."")}
attr energie_lesen alignTime 00:59:00
define energie_lesennotify at +*01:00:00 set energiedumm off
attr energie_lesennotify alignTime 00:59:01
define energie_lesennotify1 notify energiedumm:off set energiedumm on

Die Zeiten musst du dann natürlich noch angepassen!
Habe gerade einen minutentest gemacht das funktionierte!!!
;-)
1x FB7490, 2x FBDECT200, 1x RPI als Öltankanzeige mit TEK603, 1x Synology NAS, 1xCUL FS20, 2x CCU3, 1xFS20DWT , 1x FS20 DI22-4, 1x FS20IR, 3x FS20ST, 1 x KS300, 3x HM-LC-Sw1PBU-FM, 6x HM-ES-PMSw1-Pl,  Siemens S7 CPU 315 für Stromzähler auf S0 Basis uvm.

dombar

#34
Mir ist da noch was eingefallen!
Du müsstest nachdem du das in die FHEM.cfg eingegeben hast, erst noch in die Komandozeile
"attr energiedumm power-on 0" und "set energiedumm on" eingeben und dein EM Modul neu initialisieren!

Gruß
Dominik
1x FB7490, 2x FBDECT200, 1x RPI als Öltankanzeige mit TEK603, 1x Synology NAS, 1xCUL FS20, 2x CCU3, 1xFS20DWT , 1x FS20 DI22-4, 1x FS20IR, 3x FS20ST, 1 x KS300, 3x HM-LC-Sw1PBU-FM, 6x HM-ES-PMSw1-Pl,  Siemens S7 CPU 315 für Stromzähler auf S0 Basis uvm.

Elektrolurch

Hallo,

die o.g. Änderungen habe ich jetzt mal eingebaut. Kann sie natürlich nicht testen.
Hochladen in den Beitrag 1 mache ich am Sonntag abend.

Nun zu diesem Problem mit den zwei Zählern in einem device:
state:
Energy-Kuhlschrank: 2.544 kWh power-Kuhlschrank: 0.159 kW Energy-E-Herd: 0.017 kWh power: 0.000 kW


Wenn ich das richtig verstanden habe, kann man für den  Teil A und B des Verbrauchsmessgeräts jeweils für den TEil A und B Namen vergeben.

Das EM (nun EMONITOR) Modul reagiert auf events on,off, aus ein usw. und auf das event "power" für den aktuellen Verbrauch.

Wenn man nun für A Kühlschrank und für B Herd definiert hat, kommt das power-Event im notify ann auch als power-Kühlschrank, bzw. power-Herd?
Und die gesamten Verbrauchswerte sind dann in readings mit den Namen energy-Kühlschrank bzw. energy-Herd abgelegt?


Ich könnte natürlich jetz hingehen und die Aufzeichnung der Daten in EM so abändern, dass der Name für die internen readings:

power-horuly, power-daily usw. nun aus dem Event generiert würde, d.h.

kommt das power - Event mit power-Kühlschrank: 2330 W, würde das jetzt in einem reading power-Kührlschrank-daily, power-Kühlschrank-hrourly  usw. hinterlegt werden.
Wäre das ein für Dich sinnvoller Weg?

Ich müsste überall, wo ich das "power" - Event verarbeite, es verfeinern, d.h. schauen, ob hinter dem power noch was steht und das in die readings übernehmen.

Dann muss ich mal schauen, wo ich das reading "energy" benutze und ob ich da auch auf den erweiterten Namen an der Stelle schliessen kann.
Was vielleicht nicht funktioniert, ist das:

set EM measure Gerät Probe

wenn Probe so ein Doppelzähler ist, dass dürfte schwierig werden. Aber allles schön eins nach dem anderen.

Elektrolurch
configDB und Windows befreite Zone!

Markus

#36
Danke erstmal!

@ dombar: den Gedanken finde ich gut aber ich denke ein Notify wäre in diesem Fall besser da es sofort bei Änderung greift und das device doch den wert power aus dem abfrageinterfal (zb. 900 Sekunden) berechnet was nicht identisch mit der Uhrzeit ist (zb. 9:15, 9:30, 9:45, 10:00) somit könne mir ja bis zu 15 min fehlen oder Verstehe ich das Falsch?

@ Elektrolurch: Wenn du das in dein Modul integrierst Zeigt es mir doch den Namen des Zählers an nicht aber den des Gerätes also würde im Modul Zahler_Kuche stehen und nicht Kühlschrank und E-Herd, sehe ich das richtig?

Ja  mann kann man für die Zähler A und B des Verbrauchsmessgeräts jeweils einen eigenen Namen vergeben, also für beide: power und energie.
aber es ist nicht möglich zweimal den gleichen Nahmen zu vergeben also zweimal energie geht nicht.

Wenn man nun für A Kühlschrank und für B Herd definiert hat, kommt das power-Event im notify an, auch als power-Kühlschrank, bzw. power-Herd?
wie meinst du das? ob ein notify power-Kuhlschrank auslöst?

define notifitest notify Zahler_Kuche:power-Kuhlschrank set test on
nein das löst nicht aus

Und die gesamten Verbrauchswerte sind dann in readings mit den Namen energy-Kühlschrank bzw. energy-Herd abgelegt?
Ja, aber wie bereits erwähnt kann ich aber die Namen ändern

Energy-Kuhlschrank: 3.272 ist der Tagesverbrauch in KW
power-Kuhlschrank: 0.138 errechnet sich aus dem verbrauch des letzten Intervalls

Ich könnte natürlich jetzt hingehen und die Aufzeichnung der Daten in EM so abändern, dass der Name für die internen readings:
power-horuly, power-daily usw. nun aus dem Event generiert würde...

wie das genau Funktioniert ist mir egal ich möchte nur sehen wo der Strom so hinfliest  :P
Was währe wenn ich Energy-Kuhlschrank um Mitternacht in einen Dummy als reading power-daily kopieren würde?
könnte ich den Dummy dann in deinem Modul auswerten?
Ist zwar am Tag nicht aktuell aber der Monats und Jahres plot würde schon stimmen...

set EM measure Gerät Probe muss nicht Funktionieren da es sich hier um Hutschienen Zähler handelt die fix verbaut sind wird das wohl niemand nutzen.
Raspberry Pi2 als FHEM-Plattform
HM, FS20, 1-Wire, PanStamp,LW12,Intertechno,ESPEasy,Alexa

Markus

Ich hab es jetzt mal so gelöst ist zwar nicht schön aber besser krieg ich es nicht hin
werde morgen mal testen ob es Funktioniert

@ Elektrolurch was mir gerade eingefallen ist: was währe wen wenn ich den dummy auf off stelle das attr power_off 0.0 setze aber die readings power-daily einfach mit dem reading Energy-Kuhlschrank wert aus dem Zähler befülle.
würde das funktionieren?

Gute Nacht
Markus
Raspberry Pi2 als FHEM-Plattform
HM, FS20, 1-Wire, PanStamp,LW12,Intertechno,ESPEasy,Alexa

Elektrolurch

Zitat:
@ Elektrolurch was mir gerade eingefallen ist: was währe wen wenn ich den dummy auf off stelle das attr power_off 0.0 setze aber die readings power-daily einfach mit dem reading Energy-Kuhlschrank wert aus dem Zähler befülle.
würde das funktionieren?

Hmm, wenn dann:

dummy auf off
attr power-on auf irgendeinen Wert
und power-hourly vor Ablauf der jeweils vollen Stunde befüllen...
Der Wert wird dann abgeholt und in die zeitlich übergeordneten readings übernommen.

Die andere Idee von mir ist nicht ganz so trivial zu lösen.
Zwar habe ich die Funktion, die die übergeordneten zeitlichen readings aktualisiert, parametrisiert bezüglich der Namen (die macht ja nicht nur power-horuly usw, sondern auch <Gruppennamen/Raumnamen>-power-hourly ..-daily usw)
...das müsste also gehen,
aber überall, wo ich direkt power und energy verarbeite, wäre eine Extraktion des Namensanteils notwendig.
Beim event käme der ja im notify mit, wenn aber die Verbrauchsrechnung über "energy" gemacht wird, dann habe ich die Info nicht mehr direkt verfügbar und daher wird es etwas kompliziert.... grübel...

Ich bau jetzt erst einmal die von mir angekündigten Sachen ein....

Elektrolurch
configDB und Windows befreite Zone!

Markus

das hört sich ja gut an!
Ich probiere es jetzt mal so mein obiger code tut leider nicht was er soll, das auslesen aus dem logfile ist ziemlich bugi..
leider schaffe ich es nicht direkt in ein reading zu schreiben darum die vielen dummys vielleicht



define EnergieOffset dummy
attr EnergieOffset room Energie
define EnergieTag dummy
attr EnergieTag room Energie
define power-hourly dummy
attr power-hourly room Energie
define power-daily-old dummy
attr power-daily-old room Energie

define EnergieOffsetReset at *23:59:51 {\
  my $kucheoffset = ReadingsVal("Zahler_Kuche", "Energy-Kuhlschrank", 0);;\
  fhem("set EnergieOffset $kucheoffset");; \
}

define EnergieOffsetNotify notify Zahler_Kuche {\
  my $kucheday = (ReadingsVal("Zahler_Kuche", "Energy-Kuhlschrank", 0) - ReadingsVal("EnergieOffset", "state", 0));;\
  fhem("set EnergieTag $kucheday");;\
}

define energie_kucheoffsetlastH at +*01:00:00 {\
  my $kuchehour = (ReadingsVal("Zahler_Kuche", "Energy-Kuhlschrank", 0) - ReadingsVal("power-daily-old", "state", 0));;\
  fhem("set power-hourly $kuchehour");;\
  my $kuchehouroffset = ReadingsVal("Zahler_Kuche", "Energy-Kuhlschrank", 0);;\
  fhem("set power-daily-old $kuchehouroffset");; \
}


attr energie_offsetlastH alignTime 00:59:01

attr power-hourly userReadings power-hourly:state {ReadingsVal($name,"state",0)}

Gruß Markus
Raspberry Pi2 als FHEM-Plattform
HM, FS20, 1-Wire, PanStamp,LW12,Intertechno,ESPEasy,Alexa

Elektrolurch

Hallo Markus,
viel zu umständlich. Ich glaube, ich werde EM so erweitern, dass EM bei einem dummy nicht nur auf on of ein aus reagiert, sondern auch auf events mit dem Wert "power + aktWert".

Senden Deine Doppelmeßeinheiten denn regelmäßig power-events?

Dann würde man das so bauen:

define Herd dummy

define Wireone_herd_not notify WireOne:Herd-power.* set Herd power $EVTPART2

oder heißt das Event dann:

power-herd? =>
define Wireone_herd_not notify WireOne:power-Herd.* set Herd power $EVTPART2

$EVTPART2 - ? muss ich aber erst nachsehen, ob das wirklich so heißt.
Das wäre wahrscheinlich die universellste Lösung, denn damit kann man über notify und dummy alles in den EM integrieren.
Ich schaue mal morgen, was ich dazu in EM anpassen muss....

Elektrolurch


configDB und Windows befreite Zone!

Markus

#41
Danke das schaut viel besser aus

Senden Deine Doppelmeßeinheiten denn regelmäßig power-events?
du meinst wie oft das reading aktualisiert wird?
der intervall ist über attribute einstellbar, ich hab jetzt mal 900 Sekunden genommen

oder heißt das Event dann:?
der Name des Events ist auch über attribute einstellbar ich hab power-Herd genommen

wenn es für dich besser ist kann ich den zähler auch umstellen das nur der gesamt Zählerstand angezeigt wird also genau das was auf dem Zähler auch draufsteht das Gerät generiert einfach pro Watt einen Impuls der in Fhem hochgezählt wird.

das sind 1 wire DS2523 module ich verwende das OWCOUNT modul http://fhem.de/commandref.html#OWCOUNT


Gruß Markus
Raspberry Pi2 als FHEM-Plattform
HM, FS20, 1-Wire, PanStamp,LW12,Intertechno,ESPEasy,Alexa

Elektrolurch

#42
Hallo Markus,

wenn es ein reading gibt, wird in der Regel auch ein Event generiert.
Das hier:
define notifitest notify Zahler_Kuche:power-Kuhlschrank set test on

kann so auch nicht funktionieren, denke ich.
define notifitest notify Zahler_Kuche:power-Kuhlschrank.* set test on

Mach das mal so:
define notifitest notify Zahler_Kuche:power-Kuhlschrank.* {Log(1,"notifitest : $NAME event. $EVENT");;}

und schau dann mal im log nach.
Mit dem dummy wäre nämlich die eleganteste und universellste Variante für EM. Dort erscheint natürlich nur der Name des dummys und nicht Deine Hutschine.

Alternativ zu der Sache mit dem notify gibt es natürlich auch die Lösung über
ein Objekt vom Typ readingsProxy.
Damit kann man die Namen von readings quasi "übersetzen".
Vielleicht löst das das Problem auf elegante Weise. Ich müsste dann nur bei den measuring-Typen im Modul den Objekttyp "readingsProxy" noch ergänzen.

Elektrolurch
configDB und Windows befreite Zone!

Markus

ja die Zünden beide.

define notifitest notify Zahler_Kuche:power-Kuhlschrank.* set Licht_Wohnzimmer on
define notifitest notify Zahler_Kuche:power-Kuhlschrank.* {Log(1,"notifitest : $NAME event. $EVENT");;}

log:
2015.01.31 17:33:03 1: notifitest : Zahler_Kuche event. power-Kuhlschrank: 0.1878
2015.01.31 17:33:04 3: CUL_HM set Licht_Wohnzimmer on
Raspberry Pi2 als FHEM-Plattform
HM, FS20, 1-Wire, PanStamp,LW12,Intertechno,ESPEasy,Alexa

Tobias

@Markus: am besten teilt man die 2 Zähler im OWCOUNT mittels ReadingsProxy auf 2 neue Devices auf. Mit denen kann man dann besser arbeiten als mit dem owcount-Device
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter