FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: kermitthefrog am 10 Oktober 2016, 21:55:34

Titel: Userreadings auf Basis von readings innerhalb eines devices mit IF Bedingung
Beitrag von: kermitthefrog am 10 Oktober 2016, 21:55:34
Hallo zusammen,

ich bin absoluter Perl unwissender :( und folgendes Problem, bei dem mir sicher jemand gaaanz fix helfen kann.
Ich habe meine Viessmann Heizung über VControl erfolgreich eingebunden.

Das device heißt Heizung

Ich habe ein Reading BrennerLeistung, ein Reading Pumpe und ein Reading Umschaltventil. Jetzt möchte ich 4 zusätzliches Reading erzeugen (mit userreadings? ) im Device Heizung.
Wenn Umschaltventil = 1 ist, soll BrennerLeistung im neuen Reading BrennerLeistungWW dupliziert werden ( analog Pumpe in PumpeWW). Sonst soll 0 im Reading stehen.
Wenn Umschaltventil = 3 ist, soll BrennerLeistung im neuen Reading BrennerLeistungHZ dupliziert werden ( analog Pumpe in PumpeHZ). Sonst soll 0 im Reading stehen.

Ich habe es mal soweit versucht:


attr Heizung userReadings BrennerLeistungHZ {\
my $BL=ReadingsVal("Heizung","Brennerleistung","");;\
my $Umschalt=ReadingsVal("Heizung","Umschaltventil","");;\
if ($Umschalt == 3) { return $BL;;} else {return 0}\
};;\
BrennerLeistungWW {\
my $BL=ReadingsVal("Heizung","Brennerleistung","");;\
my $Umschalt=ReadingsVal("Heizung","Umschaltventil","");;\
if ($Umschalt == 1) { return $BL;;} else {return 0}\
}


Es werden schon mal nicht beide neuen readings angelegt... wie muss es richtig heißen??? :(

Danke...
Titel: Antw:Userreadings auf Basis von readings innerhalb eines devices mit IF Bedingung
Beitrag von: Otto123 am 10 Oktober 2016, 22:04:23
Hi,

ohne Deinen Code zu kontrollieren kann ich schon mal zitieren--> (commandref):
ZitatKomma getrennte Liste von benutzerdefinierten Readings. Jede Definition hat folgendes Format:
<reading>[:<trigger>] [<modifier>] { <perl code> }
Du hast zwei semikolons dazwischen  ???

Gruß Otto
Titel: Antw:Userreadings auf Basis von readings innerhalb eines devices mit IF Bedingung
Beitrag von: kermitthefrog am 11 Oktober 2016, 06:47:08
Danke... Da war ich ja doch schon recht weit. Jetzt funktioniert es wie folgt :

attr Heizung userReadings BrennerLeistungHZ {\
my $BL=ReadingsVal("Heizung","BrennerLeistung","");;\
my $Umschalt=ReadingsVal("Heizung","Umschaltventil","");;\
if ($Umschalt == 1) { return $BL} else {return 0}\
},BrennerLeistungWW {\
my $BL=ReadingsVal("Heizung","BrennerLeistung","");;\
my $Umschalt=ReadingsVal("Heizung","Umschaltventil","");;\
if ($Umschalt == 3) { return $BL} else {return 0}\
},SolldrehzahlInternePumpeHZ {\
my $DP=ReadingsVal("Heizung","SolldrehzahlInternePumpe","");;\
my $Umschalt=ReadingsVal("Heizung","Umschaltventil","");;\
if ($Umschalt == 1) { return $DP} else {return 0}\
},SolldrehzahlInternePumpeWW {\
my $DP=ReadingsVal("Heizung","SolldrehzahlInternePumpe","");;\
my $Umschalt=ReadingsVal("Heizung","Umschaltventil","");;\
if ($Umschalt == 3) { return $DP} else {return 0}\
}


Vielleicht geht es noch viel schlanker oder hübscher? Das wäre aber rein optional, es läuft ja schließlich.

Schönen Tag noch...
Titel: Antw:Userreadings auf Basis von readings innerhalb eines devices mit IF Bedingung
Beitrag von: Otto123 am 11 Oktober 2016, 11:18:55
Moin,

naja Du fragst in jedem reading ja fast die identischen Werte ab. Du könntest das alles in eine Routine in die 99_myUtils packen und diese dann einfach mit einem Parameter aufrufen. da sparst du ein paarmal das Auslesen der Werte und hast nicht so einen langen "userreading Wurm" in der DEF.

Gruß Otto
Titel: Antw:Userreadings auf Basis von readings innerhalb eines devices mit IF Bedingung
Beitrag von: kermitthefrog am 11 Oktober 2016, 13:29:03
D.h. durch die Routine würden die "modifizierten" Daten nicht zwangsweise geloggt werden sondern für den Plot nur nach Bedarf generiert?

Da ich mit der Variantenart noch so gar nicht beschäftigt habe, kommt das ans Ende der Agenda :)

Danke trotzdem für den Hinweis...
Titel: Antw:Userreadings auf Basis von readings innerhalb eines devices mit IF Bedingung
Beitrag von: Otto123 am 11 Oktober 2016, 13:51:19
Von der Grundlage her steht hier alles -> http://www.fhemwiki.de/wiki/99_myUtils_anlegen
Alles was etwas mehr Platz als "eine Zeile" einnimmt packt man die diese Datei. Sie ist quasi die eigene Programmbibliothek.

Du schreibe eine Routine Namens Bla
In der Routine berechnest Du Deine vier Readings oder eines von vieren bei Bedarf.
Dort steht sinngemäß drin:
Wenn Aufruf=1 dann Reading1; Wenn Aufruf=2 dann Reading2 usw...
my $BL=ReadingsVal("Heizung","BrennerLeistung","");;\
my $DP=ReadingsVal("Heizung","SolldrehzahlInternePumpe","");;\
my $Umschalt=ReadingsVal("Heizung","Umschaltventil","");;\
if ($Umschalt == 1) { return $BL} else {return 0}\
if ($Umschalt == 3) { return $BL} else {return 0}\
if ($Umschalt == 1) { return $DP} else {return 0}\
if ($Umschalt == 3) { return $DP} else {return 0}\


Dann steht in Deiner Def
attr Heizung userReadings BrennerLeistungHZ {Bla(1)},BrennerLeistungWW {Bla(2)},SolldrehzahlInternePumpeHZ {Bla(3)},SolldrehzahlInternePumpeWW {Bla(4)}

Sieht hübscher aus  ;) lässt sich leichter verändern oder warten.