Guten Abend zusammen,
seit ca 6 Wochen bin ich stolzer FHEM-User und habe bereits die ersten Schritte vollzogen. Der Server werkelt zuverlässig in meinem Raspberry Pi, per HM-LAN-CFG sind bereits ein paar Homematic-Komponenten aktiv und vereinfachen unser Leben.
Jedoch habe ich so meine Verständnisschwierigkeiten, was die Programmierung angeht:
Wir haben einen Keller, den wir gerne etwas optimierter Belüften wollen. Dazu gibt es bereits einen HomeMatic Temperatur-/Luftfeuchtesensor (HM-WDS-IT), der auch schon eingebunden ist. (Bei mir: HM_30E392)
Zusätzlich habe ich mir im ersten Schritt über das Modul "weather" die aktuelle Wetterinformation geholt. (bei mir: MeinWetter)
Bei beiden habe ich den Taupunkt hinzugefügt:
define dewpointToAllDeviceReadings dewpoint dewpoint .* temperature humidity dewpoint
Ich habe also beide Taupunkte:
HM_30E392:dewpoint
MeinWetter:dewpoint
Mein Plan ist jetzt:
-Bilden einer neuen Variable, die den Taupunkt des aussen vorherrschenden Wetters von dem innenliegenden Wert abzieht.
-Benachrichtigung auf das Smartphone (derzeit mit Pushbullet), wenn bestimmte Werte über- oder unterschritten werden.
Ist jetzt nicht vielleicht die wissenschaftlichste Methode, aber ich muss mich ja erst einmal in die Materie einfuchsen.
Das mit der Benachrichtigung bekomme ich hin, ich habe das ja bereits für meine Türklingel realisiert:
define Klingel.notify notify Hausklingel:closed set bulletmsg message Türklingel | Türklingel
Allerdings komme ich beim Bilden der Variable nicht weiter. Muss ich dazu erst ein Attribut innerhalb des HM_30E392 bilden und dann per define einfach die Außen - Innen machen?
Das Einsteigerdokument gab mir keinen Aufschluss darüber und die Beispiele aus dem Netz sind mir (noch) alle zu komplex - daher wäre ich über eine kleine Hilfe sehr sehr dankbar.
Vielen Dank und Gruß!
Du könntest die beiden dewpoints in Variablen schreiben und dann subtrahieren.
my dewp1 = ReadingsVal("Sensor1","dewpoint1",0);
my dewp2 = ReadingsVal("Sensor2","dewpoint2",0);
my subtrdew = (dewp2 - dewp1);
Das Ganze als sub in die 99_myUtils oder in ein notify oder wie auch immer du das triggern möchtest.
VG
Frank
Ok, vielen Dank schon einmal. Ich habe nun nach etwas herumlesen eine 99_myUtils.pm angelegt und die Variablen angelegt:
sub
myUtils_Initialize($$)
{
my ($hash) = @_;
my $dewpointkeller2 = ReadingsVal("HM_30E392","dewpoint",0);
my $dewpointwetter = ReadingsVal("MeinWetter","dewpoint",0);
my $dewdiff = ($dewpointkeller2 - $dewpointwetter);
}
Aber wie zeige ich das jetzt ganz normal in irgend einem Raum an?
Was willst du anzeigen? Wenn es der Wert aus $dewdiff ist, schreib das in ein Reading. z.B.
sub
myUtils_Initialize($$)
{
my $dewpointkeller2 = ReadingsVal("HM_30E392","dewpoint",0);
my $dewpointwetter = ReadingsVal("MeinWetter","dewpoint",0);
my $dewdiff = ($dewpointkeller2 - $dewpointwetter);
fhem "set <device,dummy> $dewdiff";
}
Vorher ei dummy anlegen, dort steht dann nach Aufruf der sub dein Differenzwert im state.
Ich würde der sub einen eindeutigen Namen geben. So z.B.:
sub
dewdiff()
{
my $dewpointkeller2 = ReadingsVal("HM_30E392","dewpoint",0);
my $dewpointwetter = ReadingsVal("MeinWetter","dewpoint",0);
my $dewdiff = ($dewpointkeller2 - $dewpointwetter);
fhem "set dew_dummy $dewdiff";
}
hash brauchst du nicht, da du kein Array verwendest
Komplett sollte das so aussehen:
package main;
use strict;
use warnings;
use POSIX;
sub
myDEWUtils_Initialize($$)
{
my ($hash) = @_;
}
sub
dewdiff()
{
my $dewpointkeller2 = ReadingsVal("HM_30E392","dewpoint",0);
my $dewpointwetter = ReadingsVal("MeinWetter","dewpoint",0);
my $dewdiff = ($dewpointkeller2 - $dewpointwetter);
fhem "set dew_dummy $dewdiff";
}
1;
Aufrufen kannst du das z.B. über ein at +*00:15 {dewdiff}
Ruft die Funktion alle 15 min auf.
VG
Frank
Hallo,
geht auch noch anders userreading ...{funktion(wert1,wert2)}. In der sub ($$) und die Übergabewerte den my* Variabelen zuweisen. Den errechneten Wert zurückgeben - dann hast Du an den Gerät ein neues Reading mit der Differenz).
So berechne ich die Windrichtung - statt Grad Ost, OstSüdOst ... und den Windchill.
Gruß Christoph
Möglichkeiten gibt es da einige, ich wollte es für einen "Neuling" mit 9 Beiträgen, so einfach wie möglich halten ;) ;)
VG
Frank
ZitatMöglichkeiten gibt es da einige, ich wollte es für einen "Neuling" mit 9 Beiträgen, so einfach wie möglich halten ;) ;)
dann würde ich empfehlen, die commandref zu dewpoint zu lesen, denn das modul dewpoint bietet bereits den fan-modus, um dieses scenario bequem umzusetzen. :)
ZitatDewpoint calculations. Offers three different ways to use dewpoint:
dewpoint
Compute additional event dewpoint from a sensor offering temperature and humidity.
fan
Generate a event to turn a fan on if the outside air has less water than the inside.
alarm
Generate a mold alarm if a reference temperature is lower that the current dewpoint.
#Lüften Benachrichtigung
define lueften_keller2 dewpoint fan HM_30E392 MeinWetter 10 4
define lueften_keller2_on notify HM_30E392.*fan:.*on set fan_switch on
define lueften_keller2_off notify HM_30E392.*fan:.*off set fan_switch off
Vielen vielen Dank, das klappt schon einmal vorzüglich!
Aber eine Frage habe ich noch: Mit
define Lueften_Keller2.notify notify HM_30E392.fan:on set bulletmsg message Lueften
kommt irgendwie kein Ergebnis. Ich bin mir ziemlich sicher, dass das am Reading liegt.
"HM_30E392" ist der Temperatursensor. Dort gibt es das Reading "fan" und der hat den Zustand "on" oder halt "off"
Muss ich da mit ReadingsVal arbeiten?
Nee mit Value
wenn ich das richtig verstanden habe, gibt mir ein:
{Value("HM_30E392")}
aber nur den State zurück, oder?
Stimmt, nicht zu Ende gelesen. Dann mit ReadingsVal, da dort was nicht numerisches zurück kommt, bei weiteren "verarbeiten" auf den String achten. (eq statt =) usw.
P.S. Hab ich gerade erst gesehen, das notify mit dem Punkt drinn könnte Probleme machen
Also letztendlich so?:
define Lueftungsmeldung notify ReadingsVal ("HM_30E392","fan","") eq "on") { fhem "set bulletmsg message Lueften | Keller kann gelüftet werden" }
Leider funktioniert das nicht, obwohl das ReadingsVal funktioniert sowie die bulletmsg (jeweils mit geschweiften Klammern im Prompt ausprobiert...)