Hallo, ihr fleißigen Hacker
Ich bin neu im Fhem unterweg und habe auch keine Erfahrungen mit Perl.
Suche mich im Forum durch und komme Schritt für Schritt weiter mit meiner Heizungssteuerung.
Ich weiss, das es ein ZHK gibt. Auch von anderen Tools habe ich gelesen.
Ich möchte aber von Grund auf selber Programieren, damit ich später weiss, wie die Zusammenhänge sind.
Auf meine jetzige Frage habe ich im Forum leider keine (für mich verständliche) Antwort bekommen.
Ich habe verschiedene Fühler/Dummy-Werte (state). Diese möchte ich in einer Formel berechnen und in
einem weiteren Dummy als state anlegen, um damit eine Mischersteuerung zu verwirklichen.
Wo denke ich Falsch? Hat das was mit Reading zu tun? Kann ich die Formel aus dem Perl-Editor so übernehmen?
Hat hier jemand einen Sinnvollen und für mich als Newbee verständlichen Vorschlag.
PS. Dieses Forum hat mir bis jetzt echt oft weiter geholfen. Daumen hoch. :-)
Gruß Jörg
So richtig verstehe ich deine Frage nicht...
Du kannst in einer sub, in myUtils z.B. alles berechnen lassen und das Ergebnis dann mit z.B. "fhem set <name vom dummy der das Ergebnis enthalten soll> $Ergebnis" in das dummy schreiben.
VG
Frank
Danke für deine schnelle Antwort.
Habe das auch schon versucht. Und bräuchte (Weil Anfänger, Newbee) eine etwas genauere Antwort.
Ja, ich habe mir die Anfängertutorials durchgelesen und ja ich weiss es gibt bestimmt irgendwo eine
Antwort, die für einen efahrenen User logisch ist.
Aber noch mal zur Verständnis. Es würde mir sehr helfen, zu verstehen, wie das mit diesen MyUtils geht.
1. Wie bekomme ich da die Daten rein (zB States von Fühlern oder Dummy usw)
2. Wie binde ich solch eine Datei da letztendlich ein, ohne diese ganzen Fehlermeldungen bei meinen
Versuchen. Im 1. Post habe ich meine Datei abgebildet.
Wenn es eine, für einen Anfänger logische Erklärung gibt, würde ich mich wirklich über einen Link freuen.
Wie gesagt, SUB und MYUTILS als Tip ist mir zu wenig. Da bekomme ich das leider nicht hin.
Es wäre wirklich super, wenn mich da mal jemand an die Hand nimmt und es mir Schritt für Schritt erklärt.
Vielen lieben Dank
Jörg
Zitat von: Bobsonbob am 26 März 2017, 15:00:32
Danke für deine schnelle Antwort.
Habe das auch schon versucht. Und bräuchte (Weil Anfänger, Newbee) eine etwas genauere Antwort.
Ja, ich habe mir die Anfängertutorials durchgelesen und ja ich weiss es gibt bestimmt irgendwo eine
Antwort, die für einen efahrenen User logisch ist.
Aber noch mal zur Verständnis. Es würde mir sehr helfen, zu verstehen, wie das mit diesen MyUtils geht.
1. Wie bekomme ich da die Daten rein (zB States von Fühlern oder Dummy usw)
2. Wie binde ich solch eine Datei da letztendlich ein, ohne diese ganzen Fehlermeldungen bei meinen
Versuchen. Im 1. Post habe ich meine Datei abgebildet.
Wenn es eine, für einen Anfänger logische Erklärung gibt, würde ich mich wirklich über einen Link freuen.
Wie gesagt, SUB und MYUTILS als Tip ist mir zu wenig. Da bekomme ich das leider nicht hin.
Es wäre wirklich super, wenn mich da mal jemand an die Hand nimmt und es mir Schritt für Schritt erklärt.
Vielen lieben Dank
Jörg
Hallo Jörg,
Readings liest man mit ReadingsVal aus. Damit auch am besten den state vom Dummy auslesen.
my $erg = ReadingsVal ('dummyName1','state', 0) + ReadingsVal ('dummyName2','state', 0);
Das Ergebnis steht dann in $erg
OK, hier mal eine sub aus meiner Utils, diese berechnet eine Differenz aus einem Temp Sensor (etwas anderes, passendes hab ich iMo nicht zur Hand bzw. meine anderen sub´s sind ziemlich komplex)
sub diff()
{
my $x1 = ReadingsVal("Diff_Sensor_WZ_T2","temperature","99" );
my $x2 = ReadingsVal("Diff_Sensor_WZ_T1","temperature","99" );
my $x3 = ($x1/$x2);
my $x4 = int(100 * $x3 + 0.5) / 100;
fhem "set diff_dummy $x4";
}
Huten Morgen
Jetzt habe ich das mal in die 99_myutils geschrieben.
Ich bekomme nach dem Abspeichern der Datei einen Falschen Wert angezeigt.
Der ausgegebene Wert ist unterschiedlich, wenn Ich die letzte zahl in der
Reading Zeile verändere. Wofür steht die "0" oder "99"?
Was sollte bei mir da stehen? Ich bin davon ausgegangen, das diese die Zeit
zwischen den Wiederholungen ist.
Ich schicke Euch mal ein Bild von meinen Einträgen.
Kleiner Nachtrag:
Das Problem muss bei den Readings liegen.
Wenn ich dort Zahlen eingebe, rechnet er richting und gibt den Wert auch richtig in die Reading des Dummys weiter. Wir kommen der Sache näher. :)
Er aktualisiert den Reading auch nur dann, wenn ich die Datei abspeicher. Das skript sollte das reading aber alle 10 Sekunden aktualisieren. Gibt es da einen Eintrag für?
Noch mal vielen Dank für Eure Hilfe.
Guten Morgen,
Schaue mal in die Commandref. Da findest Du Informationen zu ReadingsVal.
Im Bereich Perl specials.
Grüße
Da habe ich schon gesucht. Habe ReadingVal leider nicht gefunden.
Da stehen nur Sachen wie: rereadcfg und readingsChange readingsGroup readingsHistory readingsProxy
Bist du bitte so nett und schickst mir den Link? Dann würde ich nachher mal weiter machen. Ich muss jetzt zur Arbeit. Würde gerne weiter basteln, aber dann sterbe ich am Ende vor Hunger. ;D
Ich weiss, ich wiederhole mich.
Ich bin euch für Eure Hilfe unendlich dankbar. Ohne diese Tips wäre ich noch kein stück weiter.
Und natürlich danke ich euch für euer Verständnis. Es muss schlimm sein, wenn jemand so Fragen stellt, die eigentlich selbstverständlich sind. Ich bin noch nicht so weit, aber ich lese mich jeden Tag 1-2 Stunden in diese Thema ein. Ich werde das schon irgend wann begreifen.
Bis später Jörg
https://fhem.de/commandref_DE.html#perl
Diesen Absatz lesen und dann schauen wir weiter.
Der Link hat mir nicht wirklich geholfen. Da brauch ich wohl noch ein wenig Verständnis. Das mit der Berechnung geht aber, dank Eurer Hilfe jetzt. Ich habe ein wenig rumprobiert und hatte dabei festgestellt, das der später mit alias vergebene Name nicht geht. ich musste den beim define verwendeten Namen nehmen. :-)
Wieder ein wenig weiter. Man denkt halt quer.
Aber nun brauche ich noch mal bitte einen Tip, wie ich die Aktualisierung alle 10 Sekunden hin bekomme.
Sprich, ich hätte gerne, das das Reading in VorlaufSoll alle 10 Sekunden neu berechnet und aktualisiert wird.
Ist wahrscheinlich wieder eine ganz einfache Sache, auf die ich nicht komme.
Ich werde mal ein wenig rumprobieren, bis jemand einen Tip hat. Hat bei der anderen Sache ja auch geholfen. :-)
Zitat von: Bobsonbob am 27 März 2017, 18:07:23
Der Link hat mir nicht wirklich geholfen. Da brauch ich wohl noch ein wenig Verständnis. Das mit der Berechnung geht aber, dank Eurer Hilfe jetzt. Ich habe ein wenig rumprobiert und hatte dabei festgestellt, das der später mit alias vergebene Name nicht geht. ich musste den beim define verwendeten Namen nehmen. :-)
Wieder ein wenig weiter. Man denkt halt quer.
Aber nun brauche ich noch mal bitte einen Tip, wie ich die Aktualisierung alle 10 Sekunden hin bekomme.
Sprich, ich hätte gerne, das das Reading in VorlaufSoll alle 10 Sekunden neu berechnet und aktualisiert wird.
Ist wahrscheinlich wieder eine ganz einfache Sache, auf die ich nicht komme.
Ich werde mal ein wenig rumprobieren, bis jemand einen Tip hat. Hat bei der anderen Sache ja auch geholfen. :-)
Ich würde es abhängig von den verwendeten Devices machen. Also ein Notify und schauen welche Device Reading Kombi die meisten Events aus wirft. Das nimmst du als Trigger für Dein Notify.
Das ist in jedem Fall die AussenTemperatur.
Dann werde ich mal sehen, wie ich mit einem Notify umgehen muss.
oder du triggerst über ein at welches alle 10 sec. deine sub aufruft.
P.S. Das bringt aber nicht viel, wenn die sensoren z.B. nur alle Minuten neue Werte liefern, dann solltest du, wie cooltux schon schrieb, dass mit einem notify machen
VG
Frank
Das würde mir au jeden Fall reichen. Wie sieht denn da der Code aus?
Ich bin wirklich gerade 1 Woche dabei und habe keine Ahnung.
define aufruf_at at +* 00:00:10 {name der sub}
commandref zu at mal ansehen ;) ;)
VG
Frank
Bekomme da leider einen Fehler.
Wrong timespec : either HH:MM:SS or {perlcode}
list DEVICENAME
Und die Ausgabe hier in Codetags (oben Rautesymbol) posten.
Zitatdefine aufruf_at at +* 00:00:10 {name der sub}
da ist mir dummerweise ein Leerzeichen reingerutscht :o
+*00:00:10
define aufruf_at at +*00:00:10 {99_myUtils}
habe ich geschrieben
syntax error at (eval 288) line 1, near "99_myUtils"
und das war das Ergibnis
Name der sub, nicht der utils, oh mann...
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}
# Berechnung der Vorlauftemperatur nach der Aussentemperatur.
# Vorgaben
my $Aussentemp = ReadingsVal("Aussentemp","state","" );
my $Raumsoll = ReadingsVal("RaumSoll","state","" );
my $minVorlauf = ReadingsVal("minVorlauf","state","" );
my $maxVorlauf = ReadingsVal("maxVorlauf","state","" );
my $Steigung = ReadingsVal("Steigung","state","" );
my $Paralel = ReadingsVal("Paralel","state","" );
# Berechnung
my $VorlaufSoll = ($Raumsoll-$Aussentemp)*$Steigung**(1/1.3)+$Paralel;
if($VorlaufSoll > $maxVorlauf)
{ $VorlaufSoll = $maxVorlauf };
if($VorlaufSoll < $minVorlauf)
{ $VorlaufSoll = $minVorlauf };
$VorlaufSoll = int(100 * $VorlaufSoll + 0.5) / 100;
fhem "set VorlaufSoll $VorlaufSoll";
1;
Ich bin noch nicht so weit. Wo muß ich der Sub einen Namen geben?
Ich weiss, das das doof klingt. Aber es ist für einen Anfänger nicht selbstverständlich.
Man nehme das Ganze:
sub Berechnung()
{
# Berechnung der Vorlauftemperatur nach der Aussentemperatur.
# Vorgaben
my $Aussentemp = ReadingsVal("Aussentemp","state","" );
my $Raumsoll = ReadingsVal("RaumSoll","state","" );
my $minVorlauf = ReadingsVal("minVorlauf","state","" );
my $maxVorlauf = ReadingsVal("maxVorlauf","state","" );
my $Steigung = ReadingsVal("Steigung","state","" );
my $Paralel = ReadingsVal("Paralel","state","" );
# Berechnung
my $VorlaufSoll = ($Raumsoll-$Aussentemp)*$Steigung**(1/1.3)+$Paralel;
if($VorlaufSoll > $maxVorlauf)
{ $VorlaufSoll = $maxVorlauf };
if($VorlaufSoll < $minVorlauf)
{ $VorlaufSoll = $minVorlauf };
$VorlaufSoll = int(100 * $VorlaufSoll + 0.5) / 100;
fhem "set VorlaufSoll $VorlaufSoll";
}
und gebe ihm einen Namen!
P.S. und spätestens das:
if($VorlaufSoll > $maxVorlauf)
{ $VorlaufSoll = $maxVorlauf };
if($VorlaufSoll < $minVorlauf)
{ $VorlaufSoll = $minVorlauf };
wird dir auch Fehler bringen
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}
sub
Vorlaufberechnung()
{
# Berechnung der Vorlauftemperatur nach der Aussentemperatur.
# Vorgaben
my $Aussentemp = ReadingsVal("Aussentemp","state","" );
my $Raumsoll = ReadingsVal("RaumSoll","state","" );
my $minVorlauf = ReadingsVal("minVorlauf","state","" );
my $maxVorlauf = ReadingsVal("maxVorlauf","state","" );
my $Steigung = ReadingsVal("Steigung","state","" );
my $Paralel = ReadingsVal("Paralel","state","" );
# Berechnung
my $VorlaufSoll = ($Raumsoll-$Aussentemp)*$Steigung**(1/1.3)+$Paralel;
if($VorlaufSoll > $maxVorlauf)
{ $VorlaufSoll = $maxVorlauf };
if($VorlaufSoll < $minVorlauf)
{ $VorlaufSoll = $minVorlauf };
$VorlaufSoll = int(100 * $VorlaufSoll + 0.5) / 100;
fhem "set VorlaufSoll $VorlaufSoll";
}
1;
Ist das so in Ordnung?
Zitat von: Bobsonbob am 27 März 2017, 19:05:23
Ich bin noch nicht so weit. Wo muß ich der Sub einen Namen geben?
Ich weiss, das das doof klingt. Aber es ist für einen Anfänger nicht selbstverständlich.
Ich denke Du solltest Dich vor der Benutzung von FHEM mit den Perl Grundlagen vertraut machen, zumindest bevor Du irgendwelche wilden Konstrukte in die 99_myUtils schreibst.
Perl Grundlagen haben erst mal nichts mit FHEM zu tun, sie sind aber dringend nötig um FHEM zu programmieren/erweitern.
Zu FHEM werden Dir hier sicher viele helfen! Beim Erlernen der Grundlagen von Perl eher wenige, denn diese sind im Internet oder auch in altmodischen Büchern bestens erklärt/dokumentiert. ;)
Gruß
Dan
OK. Vielen Dank für deine Hilfe
ZitatIst das so in Ordnung?
Vom Aufbau her ja, von der Syntax her ehr nein...
Siehe DeeSPe
P.S. unbedingt mal ein Perl Buch besorgen, ohne Perl Grundlagen wirst du sonst nicht voran kommen...
VG
Frank
Es Funktioniert jetzt. Habt vielen lieben Dank. Lade euch gerne auf nen Kaffee oder Bier ein, wenn Ihr mal in der Nähe seid.
Ihr müsst Geduld mit mir haben. Ich weiß, leichter gesagt, als getan. hehe
Danke nochmal
hallo, ich muß mich bei derfrage anschließen, ich bekomms nicht hin...
ich habe ein DOIF wo ich wenn die situation eintritt, die position meines Stellmotors auslese und dann möchte ich 10 steps abziehen und diesen wert dann als neue position übergeben... funkt nur irgendwie nicht.. kann mir bitte wer sagen so ich den fheler habe?
([WW9:temperature] >= 35) ({my $Wert = ReadingsVal("FBHMisch", "position", "");
fhem("set FBHMisch $Wert ,
set A1 on,
set A0 off,
set MMLC_HZGbot message FBH zu heiss [WW9:temperature]"),
})
DOELSE ()
Zitatfunkt nur irgendwie nicht..
Das ist die Fehlermeldung?
Ich würde sowas als Funktion auslagern.
Hast Du das mal manuell ausprobiert. Ich vermute das geht nicht. Du list den Wert von Position aus um ihn dann als state zu setzen. Dann wird was ein und was anders aus geschaltet...
Wo werden dei 10 Stepsa abgezogen?
...
ha!
tja, wenn man ihn nicht sagt, dass er was berechnen bzw abziehen soll, dann macht er das auch nicht...
eh klar!...
ich bin so ein depp...
([WW9:temperature] >= 35) ({my $Wert = (ReadingsVal("FBHMisch", "position", "") - 10);
fhem("set FBHMisch $Wert ,
set A1 on,
set A0 off,
set MMLC_HZGbot message FBH zu heiss [WW9:temperature]"),
})
funktioniert einwandfrei... vielen Dank