Gelöst: FRM_IN ($EVENT) mit HourCounter verarbeiten

Begonnen von sabom.2d, 11 November 2016, 13:45:21

Vorheriges Thema - Nächstes Thema

sabom.2d

Hallo Zusammen,

ich häng jetzt schon seit über zwei Wochen an dem Thema, und krieg es nicht zum Laufen.
Auch über die Suche und das WIKI bin ich nicht weitergekommen.
Also hier mein Problem:
Ich frage folgendermaßen an PIN13 meines Arduinos den Schaltzustand des Brenners ab:

# PIN 13 ist der Kontakt des Ölbrennerrelais
define PIN13 FRM_IN 13
attr PIN13 IODev Arduino
attr PIN13 room testsys
attr PIN13 stateFormat reading
attr PIN13 verbose 1


Funktioniert auch soweit, wenn der Brenner an geht, schaltet PIN13 auf on.

Aber jetzt kommts, ich schaffe es nicht, diesen Status im CN weiterzuverarbeiten:

#HourCounter für PIN13
define CN.Test_10a HourCounter PIN13:on PIN13:off
attr CN.Test_10a event-on-change-reading .*
attr CN.Test_10a room testsys
attr CN.Test_10a verbose 5


Hab schon alle möglichen verschiedenen Definitionen für CN.Test durch,
- PIN13:STATE:.on/PIN13:state:on und was ich noch so im Forum gefunden hab -
aber alles ohne Erfolg.

Auch ein zwischengeschaltetes notify liefert keine Werte auf das FRM_IN:

define act_on_PIN13_on notify PIN13:STATE:on set Testmeldung message Brenneran
attr act_on_PIN13_on room testsys



zu Testzwecken hab ich mir ein Dummy definiert, wenn ich das per CN abfrage funktioniert es sofort und die Schaltwerte werden gefüllt:

#Dummy zur Übergabe an die Berechnung
define PIN13_State dummy
attr PIN13_State room testsys
attr PIN13_State setList on off

#HourCounter für PIN13_State
define CN.Test_10a HourCounter PIN13_State:on PIN13_State:off
attr CN.Test_10a event-on-change-reading .*
attr CN.Test_10a room testsys
attr CN.Test_10a verbose 5





Was also mache ich falsch, wie muß der CN def code genau aussehen, um einen FRM_IN PIN (on/off) abzufragen, kann mir da jemand helfen.

Gruß

und Danke

Sabom




rippi46

#1
Hallo sabom.2d,

versuche es mal mit

define CN.Test_10a HourCounter PIN13:reading:.on PIN13:reading:.off

Gruß

rippi46

FHEM, LMS, VDR ,Dell 9010 Ubuntu 20.04,Raspimatic, HM/HMIP, Max, Elro, Brennenstuhl u. Intertechno mit Connair.
Picoreplayer, Raspi IR-Lanadapter, Firmata(wifi), LaCrosse,
nanocul433, nanocul868, Signalduino, Connexoon,
MySensor-GW+Sensoren, RGBWW, Zigbee2mqtt,Xiaomi,Nextion,LEDMatrix,Alexa

sabom.2d

#2
Hallo Rippi46,

hab ich probiert, jetzt scheints zu funktionieren, zumindest die Werte werden gefüllt:

2016-11-11_14:06:44 CN.Test_10a 30
2016-11-11_14:06:44 CN.Test_10a tickUpdated: 176
2016-11-11_14:06:44 CN.Test_10a tickChanged: 59
2016-11-11_14:06:44 CN.Test_10a pulseTimeEdge: 0
2016-11-11_14:06:44 CN.Test_10a pauseTimeIncrement: 0
2016-11-11_14:06:44 CN.Test_10a value: 0
2016-11-11_14:06:44 CN.Test_10a tickUpdated: 177
2016-11-11_14:06:44 CN.Test_10a tickChanged: 60
2016-11-11_14:09:20 CN.Test_10a countsPerDay: 31
2016-11-11_14:09:20 CN.Test_10a countsOverall: 31
2016-11-11_14:09:20 CN.Test_10a pauseTimeIncrement: 156
2016-11-11_14:09:20 CN.Test_10a pauseTimeEdge: 156
2016-11-11_14:09:20 CN.Test_10a pauseTimePerDay: 45392
2016-11-11_14:09:20 CN.Test_10a pauseTimeOverall: 135161
2016-11-11_14:09:20 CN.Test_10a value: 1
2016-11-11_14:09:20 CN.Test_10a 31
2016-11-11_14:09:20 CN.Test_10a tickUpdated: 178
2016-11-11_14:09:20 CN.Test_10a tickChanged: 61
2016-11-11_14:13:40 CN.Test_10a pulseTimeIncrement: 260
2016-11-11_14:13:40 CN.Test_10a pulseTimeEdge: 260
2016-11-11_14:13:40 CN.Test_10a pulseTimePerDay: 547
2016-11-11_14:13:40 CN.Test_10a pulseTimeOverall: 547
2016-11-11_14:13:40 CN.Test_10a pauseTimeIncrement: 0
2016-11-11_14:13:40 CN.Test_10a value: 0
2016-11-11_14:13:40 CN.Test_10a tickUpdated: 179
2016-11-11_14:13:40 CN.Test_10a tickChanged: 62



Edit: das scheints wirklich gewesen zu sein, jetzt kommen auch die Test-Meldungen per Pushbullet an. Danke vielmals.

Aber jetzt hab ich wohl noch einen Fehler im Notify für die Berechnung der Brennerlaufzeit, wärst Du so nett, Dir das auch mal anzusehen, denn die ändern sich nicht?


#notify zur Berechnung
define Brennerlaufzeit_10a notify PIN13{\
  if(ReadingsVal("PIN13","STATE",0) eq "on") {\
   $data{PIN13_last} = time();;\
  } elsif(ReadingsVal("PIN13","STATE",0) eq "off") {\
   $data{PIN13_min} = (time()-$data{PIN13_last});;\
   fhem "trigger Brennerlaufzeit__10a $data{PIN13_min}";;\
    my $temp = ReadingsVal("CN.Test_10a","pulseTimeOverall",0);;\
    fhem "set Brennerlaufzeit_gesammt_10a $temp";;\
    my $temp2 = ((ReadingsVal("CN.Test_10a","pulseTimeOverall",0) )/3600 * 1.45);;\
    fhem" set HeizOelverbrauch_10a $temp2";;\
  }\
}
attr Brennerlaufzeit_10a room testsys



Gruß und schon mal bis hierher vielen Dank.

sabom

rippi46

versuche es mal mit
.... notify PIN13:.*{ ....

Gruß
rippi46

PS: bin gerade im Zug unterwegs
FHEM, LMS, VDR ,Dell 9010 Ubuntu 20.04,Raspimatic, HM/HMIP, Max, Elro, Brennenstuhl u. Intertechno mit Connair.
Picoreplayer, Raspi IR-Lanadapter, Firmata(wifi), LaCrosse,
nanocul433, nanocul868, Signalduino, Connexoon,
MySensor-GW+Sensoren, RGBWW, Zigbee2mqtt,Xiaomi,Nextion,LEDMatrix,Alexa

sabom.2d

Hallo Rippi46,

nee das nimmt er leider auch nicht.
Hab mal für beides Testdevices ( PIN13State / BrennerlaufzeitTest) angelegt und diese auf Verbose 5 geschaltet.
Das notify reagiert absolut nicht auf den Testschalter .

Leider hab ich jetzt auch keine Zeit mehr, aber das muß ich irgendwie gelöst bekommen.
Seltsamer Weise hat die Berechnung vorher mit dem Dummy funktioniert, nur mit dem FRM_IN nicht.

Werd mich übers WE nochmal dahinterklemmen.

Danke erstmal für Deinen Input, bin auf jeden Fall schon weiter.
Wenn Dir allerdings noch was einfällt, immer her damit....

Ansonsten schönes Wochenende

Gruß


Sabom.

rippi46

#5
Hallo sabom.2d,

kannst du mal hier den relevanten Code posten.

Also auch "HeizOelverbrauch_10a"
Woher kommt "PIN13_last" und "PIN13_min"

Dann kann ich mir das ganze mal anschauen.

Gruß

rippi46
FHEM, LMS, VDR ,Dell 9010 Ubuntu 20.04,Raspimatic, HM/HMIP, Max, Elro, Brennenstuhl u. Intertechno mit Connair.
Picoreplayer, Raspi IR-Lanadapter, Firmata(wifi), LaCrosse,
nanocul433, nanocul868, Signalduino, Connexoon,
MySensor-GW+Sensoren, RGBWW, Zigbee2mqtt,Xiaomi,Nextion,LEDMatrix,Alexa

sabom.2d

Hallo Rippi,

die Bezeichnung PIN13_min und PIN13_last hab ich aus dem Wiki, abgewandelt aus der Abfrage für den Betriebstundenzähler:
http://www.fhemwiki.de/wiki/%C3%96lverbrauchsanzeige_/_Betriebsstundenz%C3%A4hler



hier nun der Code meiner Abfrage:



# PIN 13 ist der Kontakt des Ölbrennerrelais
define PIN13 FRM_IN 13
attr PIN13 IODev Arduino
attr PIN13 room testsys
attr PIN13 stateFormat reading
attr PIN13 verbose 1


#Testdummy zum test der Funktionen
define PIN13State dummy
attr PIN13State room testsys
attr PIN13State setList on off

#zusätzlich angelegtes Notify zum Test ob HourCounter verarbeitet wird
define act_on_PIN13_on notify PIN13:reading:.on  set testschalter on
attr act_on_PIN13_on room testsys
define act_on_PIN13_off notify PIN13:reading:.off set testschalter off
attr act_on_PIN13_off room testsys

#Dummy für die gesamtlaufzeit des Brenners
define Brennerlaufzeit_gesammt_10a dummy
attr Brennerlaufzeit_gesammt_10a room testsys

#dummy für Ergebnis der Verbrauchsberechnung
define HeizOelverbrauch_10a dummy
attr HeizOelverbrauch_10a room testsys

#HourCounter für PIN13
define CN.Test_10a HourCounter PIN13:reading:.on PIN13:reading:.off
attr CN.Test_10a event-on-change-reading .*
attr CN.Test_10a room testsys
attr CN.Test_10a verbose 5

#File für Daten
define CN.Test_10a.File FileLog ./log/CN.Test-10a-%Y.log (CN\.Test_10a:.*)
attr CN.Test_10a.File room testsys
attr CN.Test_10a.File userReadings PIN13:STATE

#Plot
define SVG_CN.Test_10a.File_1 SVG CN.Test_10a.File:SVG_CN.Test:10a.File_1:CURRENT
attr SVG_CN.Test_10a.File_1 room testsys2

define Brennerlaufzeit_gesammt_10a dummy
attr Brennerlaufzeit_gesammt_10a room testsys

define HeizOelverbrauch_10a dummy
attr HeizOelverbrauch_10a room testsys

#notify zur Berechnung der Brennerwerte
define Brennerlaufzeit_10a notify PIN13:.*{\
  if("$EVENT" eq "on") {\
   $data{PIN13_last} = time();;\
  } elsif("$EVENT" eq "off") {\
   $data{PIN13_min} = (time()-$data{PIN13_last});;\
   fhem "trigger Brennerlaufzeit__10a $data{PIN13_min}";;\
    my $temp = ReadingsVal("CN.Test_10a","pulseTimeOverall",0);;\
    fhem "set Brennerlaufzeit_gesammt_10a $temp";;\
    my $temp2 = ((ReadingsVal("CN.Test_10a","pulseTimeOverall",0) )/3600 * 1.45);;\
    fhem" set HeizOelverbrauch_10a $temp2";;\
  }\
}
attr Brennerlaufzeit_10a room testsys





Was mich stutzig macht ist nun, dass die speziellen Test-notifys act_on_PIN13_on /  act_on_PIN13_off funktionieren, und zwar genau mit der Definition: PIN13:reading:.on

In der Berechnung der Verbrauchswerte funktioniert es aber eben nicht. Ich denke die If Abfrage wird gar nicht erst durchlaufen.
Mit verbose 5 gitb es jedenfalls keine Meldungen.

Die ganze If Abfrage scheint das Problem zu sein.


Gruß

und Danke dass Du dir die Zeit nimmst.

sabom

rippi46

#7
Hallo sabom.2d

im notify hast du
fhem "trigger Brennerlaufzeit__10a $data{PIN13_min}";;\
stehen.

eigentlich müsste es so lauten:
fhem "trigger Brennerlaufzeit_10a $data{PIN13_min}";;\

und statt:
define Brennerlaufzeit_10a notify PIN13:.*{
so:
define Brennerlaufzeit_10a notify PIN13:.* {

Was ich aber nicht verstehe, wofür du das notify überhaupt brauchst. Die Werte, die du hier in Brennerlaufzeit_gesamt_10a schreibst hast du eigentlich schon im HourCounter.

Ich würde die Sets aus dem Notify raus werfen, und ein Log zum Notify erstellen um anschließend die werte in einem Plot darzustellen.

define Brennerlaufzeit_10a notify PIN13:.* {
  if("$EVENT" eq "on") {$data{PIN13_last} = time()}
  elsif("$EVENT" eq "off") {$data{PIN13_min} = (time()-$data{PIN13_last});
   fhem "trigger Brennerlaufzeit_10a $data{PIN13_min}"}
}
attr Brennerlaufzeit_10a room testsys


und als Log:
define Brennerlaufzeit_10a_log FileLog ./log/Brennerlaufzeit_10a_log-%Y-%m.log Brennerlaufzeit_10a
attr Brennerlaufzeit_10a_log room testsys


In der Log-Datei stehen dann die Werte aus dem Notify. Diese Werte kannst du dann in einem Plot darstellen.


Gruß

rippi46


zB:
FHEM, LMS, VDR ,Dell 9010 Ubuntu 20.04,Raspimatic, HM/HMIP, Max, Elro, Brennenstuhl u. Intertechno mit Connair.
Picoreplayer, Raspi IR-Lanadapter, Firmata(wifi), LaCrosse,
nanocul433, nanocul868, Signalduino, Connexoon,
MySensor-GW+Sensoren, RGBWW, Zigbee2mqtt,Xiaomi,Nextion,LEDMatrix,Alexa

sabom.2d

#8
Hallo Rippi,

danke dass Du dranbleibst und mir bei meinen Problemen weiterhilfst.

Zitatfhem "trigger Brennerlaufzeit__10a $data{PIN13_min}";;\

Hast recht, das ist natürlich Peinlich, sowas sollte dann eigentlich nicht mehr vorkommen.

Zitatdefine Brennerlaufzeit_10a notify PIN13:.* {

Ja das mit den Leerzeichen ist mir Mittlerweile auch aufgegangen.
Heute hab ich versucht ein Log auszugeben, um zu überprüfen, was der $EVENT überhaupt rauswirft, aber erst noch etwas zu den Leerzeichen.
Beim Log(3,$NAME,$EVENT) hab ich lange gebraucht das überflüssige Leerzeichen hinter dem Komma zu eliminieren.

Zitat
Was ich aber nicht verstehe, wofür du das notify überhaupt brauchst.

Muß ich mir nochmal Gedanken zu machen, vor lauter Testerei hab ich mir wohl eine Lösung von hinten durch die Brust ins Auge zurechtgebastelt.

Allerdings möchte ich die Werte nicht in einem Log sehen sondern einfach als Wert anzeigen.

Bin auch dank Deiner Unterstürtzung gut weitergekommen, aber das mit den Leerzeichen hat mich echt in der letzten Woche Zeit gekostet.

Im Wiki zum Betriebsstundenzähler ist ja ursprünlich der $EVENT in der If Abfrage, aber sowohl mit $EVENT als auch ReadingsVal komm ich nicht zu m gewünschten Ergebnis, das die Abfragen gar nicht erst durchlaufen.
Nun stell ich mir die Frage, wie ich mit einem $EVENT bzw. ReadingsVal umgehe und diesen weiterverarbeite.

Ich hab mir z.B. parallel zum FRM_IN PIN13 notify einen Testdummy PIN13State angelegt, den ich per Notify anbhandle,
beim Dummy liefert der $EVENT nur on/off zurück
beim FRM_IN liefert der $EVENT aber reading:on/reading:off
Das ist auch der Grund, warum die If Abfrage nicht funktioniert, da $EVENT nur auf "on"/"off" abgefragt wird, aber "reading:on"/"reading:off" beinhaltet.
Auch mit $EVTPART bin ich dabei nicht weitergekommen.
Hab die Suche rauf und runter genutzt, aber nichts dazu gefunden.
Kannst Du mir das irgendwie erklären?

Ebenso hab ich noch nicht herausgefunden, wovon es abhängt, ob man:
PIN13, PIN13:.* oder PIN13:reading:.* im Notify einsetzt? Hab dazu leider keine Infos gefunden. Kannst Du mich diesbezüglich erleuchten?

Gruß

Sabom

rippi46

Hallo Sabom,

ich bin jetzt nicht gerade der Programmierer und mache viel mit Copy und Paste. Zu Event habe ich folgendes gefunden.

ZitatDas Suchmuster (auch Regexp = regulärer Ausdruck) ist sehr wichtig. Es ist entweder der Name des auslösenden ("triggernden") Gerätes oder die Kombination aus Gerät und auslösendem Ereignis (Event) Gerätename:Event. Die Events kann man dem Event-Monitor entnehmen. Wenn da z.B. Rollo1 steht, dann reagiert notify auf Rollo1 on und off und was es sonst noch alles gibt.

Wenn man mehrere Suchmuster möchte, kann man diese in Klammer schreiben (Rollo1|Rollo2|Steckdose5) als Trenner wird dann Pipe (|) genutzt.

Man kann auch mit Platzhaltern arbeiten.

    Rollo. ==> das notify reagiert auf alles was mit Rollo und einem weiteren beliebigen Zeichen anfängt. Also auf Rollo1 wie auch auf RolloG, aber nicht auf Rollo_wischundweg
    Rollo.* ==> das notify reagiert auf alles das mit Rollo beginnt.
    .*isch ==>; Reagiere auf alles das mit isch aufhört (Tisch, Fisch)

Suchmuster/Regex kann man im Internet beispielsweise auf http://regexpal.com/ testen.

vielleicht hilft dir das weiter.

In dem Notify wird grundsätzlich die Zeitspanne zwischen on und off berechnet.
Dies kann man wiederum in ein log schreiben oder anzeigen lassen.

Gruß

rippi46
FHEM, LMS, VDR ,Dell 9010 Ubuntu 20.04,Raspimatic, HM/HMIP, Max, Elro, Brennenstuhl u. Intertechno mit Connair.
Picoreplayer, Raspi IR-Lanadapter, Firmata(wifi), LaCrosse,
nanocul433, nanocul868, Signalduino, Connexoon,
MySensor-GW+Sensoren, RGBWW, Zigbee2mqtt,Xiaomi,Nextion,LEDMatrix,Alexa

sabom.2d

Hallo Rippi,

ich muß noch das Endergenis mitteilen. Der Fehler lag wie schon vermutet in der IF Abfrage, allerdings anders als gedacht. Ich hatte ja schon erwähnt, dass $EVENT unterschiedliche Ergebnis liefert  und genau hier lag das Problem, Abfrage auf "on", wenn $EVENT "reading: on " liefert , bringt natürlich gar nichts, und das nur "on" bzw "off" abgefragt werden und kein anderer Zustand, ha ich nicht bemerkt, dass die Abfrage überhaupt nicht durchlaufen wird. Nachdem diese Groschen dann gefallen war, war der Rest ein Kinderspiel.

So sieht das notify jetzt aus, und liefert schön bei jedem Abschalten des Brenners aktuelle Werte:


PIN13:.* {
if($EVENT eq "reading: on") {
   $data{PIN13_last} = time();
  } elsif($EVENT eq "reading: off") {
   $data{PIN13_min} = (time()-$data{PIN13_last});
   fhem ("trigger Brennerlaufzeit_10a $data{PIN13_min}");
    my $temp = ((ReadingsVal("CN.Test_10a","pulseTimeOverall",0))/3600);
    fhem ("set Brennerlaufzeit_gesammt_10a $temp");
    my $temp2 = (($temp * 1.45) + (Value("HeizOelverbrauch_10a_Korrektur")));
    fhem ("set HeizOelverbrauch_10a $temp2");
  }
else {fhem ("set AlarmMeldung message Fehler bei Verarbeitung Brennerlaufzeit-$EVENT")};
}


Aber ohne Deine Unterstützung bzgl. der Platzhalter hätte ich noch Ewig gebraucht.

Danke nochmals dafür

Gruß

sabom