Raumklima zur Wäschetrocknung via myutils

Begonnen von scs90, 07 Dezember 2017, 20:46:57

Vorheriges Thema - Nächstes Thema

scs90

Hallo zusammen,

ich hoffe, dass ich hier nicht zum Teufel gejagt werde, weil ich zu ungeduldig (hauptsächlich mit mir) bin.

Ich bin seit 2 Monaten mit FHEM unterwegs, vor allem MAX Heizungskomponenten (WT/HT/HT+). Die Einrichtung sowie die ersten Plots gehen schon ganz gut, sogar eine Telegramanbindung (die aber noch auf reinen Befehlen beruht) läuft schon. Jetzt mein erstes "Komfortprojekt":

Im  Büro ist es meistens nicht geheizt, es sei denn wir hängen Wäsche auf. In dem Fall steigt die Luftfeuchte an, es muss geheizt und regelmäßig gelüftet werden. Meine Idee war, dass die ansteigende Luftfeuchte (via LaCrosse-Sensor, funktioniert) registriert wird und über Telegram abgefragt wird, ob man die "Wäschetrocknung" starten will (die Rückfrage soll verhiindern, dass das System ein schwülen Tagen allein auslöst).

Vorgestellt habe ich mir das ca so: Ein Notify löst das Programm aus (nennt man das sub? Sorry, ich bin definitiv (noch) kein Programmierer...) bei >70% r.H.. Das holt sich dann Die aktuelle Feuchte Buero_Feuchte sowie die desiredTemperature von Buero_Heizung. Ist die Buero_Feuchte >= 70% und desiredTemp < 22°C, wird via Telegram eine entsprechende Frage mit Ja/Nein-Option abgesendet. Wird Ja ausgewählt, erhöht das Programm die desiredTemperature um 0.5 oder 1°C und wartet mindestens 15 min bis zur nächsten Auslösung (um dann weiter zu erhöhen, ohne zu fragen). Sind 22°C und 70% Feuchte erreicht, wird eine Nachricht mit Aufforderung zum Lüften verschickt. Bis dahin wird die Temperatur gehalten. Wenn das Fenster auf ist, wird bei bestimmten Parametern (Feuchte <60% oder desiredTemp<17°C eine Nachricht mit Aufforderung zum Fensterschließen verschickt. Das wiederholt sich, bis die 65% Feuchte in 3 Stunden nicht mehr erreicht werden.

Ich habe damit angefangen, finde aber keine Hilfe, wie ich es hinbekomme, dass wenn das Programm neu durchlaufen wird (wieder über ein Notify ausgelöst, wenn die 70% erreicht sind) aber die "Wäschetrocknung" bereits gestartet wurde. Dazu müsste ich "Speicherwerte" aus dem Programm im fhem speichern und beim nächsten Durchlauf wieder aufrufen.

Ich hatte bereits angefangen, aber bin bei den Basics gescheitert:

sub Waeschetrocknung_Buero()
{
my ($Feuchte) = ReadingsVal(Buero_TempHyg, "humidity")
my ($desiredTemp) = ReadingsVal(Buero_Heizung, "desiredTemperature")
if( $Feuchte >= 70 && $desiredTemp < 22) {


}
)

}


So, ich hoffe, mir kann entweder jemand eine gute Anleitungen für die myutils empfehlen, oder mir sogar helfen. Die Forensuche zu diesem Thema hat mich gefühlt überall hingeführt, nur nicht dahin, wo ich wollte. Und die comandref war da auch nciht hilfreich...

Sorry für so viel Text, vielleicht kann mir ja wer helfen!

Viele Grüße
scs90

helmut

Bei relativen Feuchtegraden jenseits von 65% schalte ich einen Entfeuchter ein.
Das ist viel billiger als Heizen und Lueften.

Gruss Helmut.
Intelligenz ist die Fähigkeit, Arbeit zu vermeiden, aber dafür zu sorgen, daß die Arbeit gemacht wird.
(Linus Torvalds)

andies

 Ich glaube, den meisten hier ist nicht klar, was du willst. Ich vermute, es sollen nur Infos via Telegram verschickt werden, richtig? Wo sind überall Sensoren - auch am Fenster? Vermutlich brauchst du für Dein Programm Variablen, die so was wie $Trocknung_gestartet lauten und dann im Programmablauf geändert werden. Ich bin Laie und würde das mit einem dummy und userreadings machen (Reading ,,Trocknung_aktiv" oder so), in das dann geschrieben wird.


Gesendet vom iPhone mit Tapatalk Pro
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

scs90

Hallo zusammen,

danke schoneinmal für die ersten Inputs, vermutlich habe ich echt zu wenig Infos in zu viel Text. Deswegen versuch ich es nochmal kurz:

Vorhanden sind (im Büro)

MAX! HT+
MAX! Fensterkontakt
30.3144.IT Thermo/Hygrometer

einschließlich FHEM auf RaspPi mit CUL/Jeelink, inkl eingerichtetem TelegramBot.

Mein Ziel ist, dass FHEM über das Hygrometer selbst merkt, wenn die Luftfeuchte über 70% steigt, dann aber erst über Telegram abfragt, ob die "Trocknung" gestartet werden soll. Das soll vermeiden, dass die Trocknung unter schwülen Wetterbedingungen oder wegen eines Fehlers von selbst auslöst.
Anschließend soll bei einer bestimmten Temperatur/Feuchte (22°C, 70%) eine Nachricht über Telegram kommen, um ans Lüften zu erinnern sowie eine Erinnerung, wenn die Luftfeuchte wieder abgesunken ist (<18°C oder < 60%), um das Fenster zu schließen. Bei geschloßenem Fenster wird dann weiter getrocknet, bis dann irgendwann die Luftfeuchte in z.B. 3 Stunden keine 65% mehr erreicht. Dann gibts noch ne finale Benachrichtigung bei Telegram ("Wäsche trocken") und die Trocknung wird beendet.

Jetzt meine große Frage: Wie schaffe ich es, diese Abfrage zu starten und vor allem, die entsprechende Antwort (Ja/Nein) der Subroutine in der 99myutils zuzuordnen? Ich denke, der Vorschlag von andies, über "userreadings" zu gehen, ist sehr gut, ich habe aber noch keine Ahnung, wie das geht. Ist es sinnvoll, hier zwei Subroutinen zu schreiben? Eine Subroutine, die den Start der Trocknung abfragt und die entsprechende Antwort in ein userreading schreibt (z.B. "Trocknung_aktiv"=1) und als zweite Subroutine die Trocknung selbst, die nur läuft, wenn "Trocknung_aktiv"=1 ist?

Außerdem wäre ich fürs "Programmieren" dankbar für eine gute Einsteigerliteratur entweder in die 99_myutils oder in Perl (je nachdem, was sinnvoller ist. Alles was ich bisher gefunden habe, war doch eher was für Erfahrene...

Ich hoffe, jetzt hab ich es besser und genauer formuliert!

PS: helmut, es kann gut sein, dass du Recht hast, allerdings muss man bei der Kostenfrage ja auch noch die Investition für den Lufttrockner rechnen. Und bis man den wieder drin hat, kann ich vermutlich Jahre lang heizen und lüften...

helmut

Zitat von: scs90 am 11 Dezember 2017, 07:35:43
PS: helmut, es kann gut sein, dass du Recht hast, allerdings muss man bei der Kostenfrage ja auch noch die Investition für den Lufttrockner rechnen. Und bis man den wieder drin hat, kann ich vermutlich Jahre lang heizen und lüften...

Hallo Simon,

ich wollte Dir nicht die Freude am Projekt nehmen und Du kannst es zu einem spaeteren Zeitpunkt ja
nochmal mit einem spitzen Bleistift rechnen.

In die myutils stecke ich eher aufwendigere Dinge; Dein Problem kannst Du meines Erachtens nach gut
in einen notify packen, den Du mit einem Event des Thermosensors ausloest. Dein Ansatz sieht bis auf
eine schliessende runde Klammer zuviel doch schon vielversprechend aus. Die Messwerte wuerde ich
dann aktuell aus den Readings des Sensors ermitteln.

Die Doku zu perl suche ich mir mit dem "Gockel" zusammen, aber das ist sicher Geschmackssache.

Spezielle Doku fuer myutils habe ich nur im Wiki gefunden; da gibt es auch Antworten auf einige Deiner
Fragen:
https://wiki.fhem.de/wiki/99_myUtils_anlegen

Gruss Helmut
Intelligenz ist die Fähigkeit, Arbeit zu vermeiden, aber dafür zu sorgen, daß die Arbeit gemacht wird.
(Linus Torvalds)

abc2006

Hi Simon,

den Sinn oder Unsinn deines Projektes lass ich hier mal aussen vor. FHEM ist mein Hobby, und das ist mir Sinn genug :)

Zu deinen Fragen:

Ich gehe davon aus, dass du die Messwerte einwandfrei empfängst, die Aktoren einwandfrei arbeiten und das TelegramBotDevice einwandfrei konfiguriert ist. Falls nicht, sparst du dir viel Ärger, wenn du das vorher behebst!


Für die myUtils brauchst du einige Grundwerkzeuge:
erstmal musst du die Messwerte bekommen:

my $Feuchte = ReadingsVal(...);

die Klammern um $Feuchte kannst du dir in diesem Fall sparen. Was allerdings wichtig ist, das Semikolon am Zeilenende.
Wenn du damit rechnen willst, ist es besser, eine reine Zahl zu haben, anstatt einer evtl. mit im Reading stehenden Einheit.
Deshalb würde ich dazu raten:
my $Feuchte = ReadingsNum(...);


so holst du dir am Anfang deiner Sub alle Werte, die du brauchst.


if( $Feuchte >= 70 && $desiredTemp < 22) {


}


ist schonmal gut. Zwischen die geschweiften Klammern kommt das, was du tun willst: eine Nachricht per Telegram senden:


fhem("set <TelegramBot> message Jetzt lüften!");


Tipp von mir am Rande: Überschlage dir die Kosten, die ein Fehler im Code maximal verursachen könnte (z.B. Heizung an, obwohl keine Heizung notwendig; Heizlüfter 2kW * 24h -> 48kWh * 0,30 Euro =14,4 Euro).

Wenn dir das zuviel ist, teste mit reinen Telegram-Nachrichten, die dir den aktuellen Status senden, und schalte (erstmal) von Hand.

Wenn dein Code entscheidet, dass die Heizung jetzt eingeschaltet werden soll, musst du den entsprechenden Aktor betätigen:
Sorry, ich kenne deinen Aktor nicht genau, deshalb ist die Syntax ein bisschen geraten:

fhem("set Heizkoerperthermostat desired 22");



Zu dem UserReading: 
Du kannst z.B. das Heizkörperthermostat verwenden, um den Lüftungsstatus zu speichern:

fhem("setreading Heizkoerperthermostat Lueftung Heizphase");
fhem("setreading Heizkoerperthermostat Lueftung Haltephase");
fhem("setreading Heizkoerperthermostat Lueftung Lueftungsphase");+
fhem("setreading Heizkoerperthermostat Lueftung aus");




Dann baust du das Reading wie mittlerweile bekannt in deinen Code ein:

my $status = ReadingsVal("Heizkoerperthermostat","Lueftung",0);
if($feuchte >70 && $Raumtemperatur < 22) {
  fhem("set TelegramBot message "starte Heizphase");
  fhem("fhem("setreading Heizkoerperthermostat Lueftung Heizphase");
  fhem("set Heizkoerperthermostat desired 22");
elsif($feuchte > 70 && $Raumtemperatur > 22 && $status eq "Heizphase"){
  fhem("set TelegramBot message "Bitte jetzt Lüften");
## Falls das Heizkörperthermostat von selbst die Temperatur hält, brauchen wir hier nichts weiter tun
} elsif (<Fensterkontakt offen> ...){

}


usw ...

Ich weiss, es ist nicht optimal, jeden FHEM-Befehl in einen eigenenen fhem()-Aufruf zu stecken. Auf der anderen Seite spart man sich damit erstmal diverse auseinandersetzungen mit fhem-code (Wann kommt ein komma, wann ein semikolon usw), ausserdem kann man einzelne Anweisungen sehr leicht deaktivieren /auskommentieren. Wenn dein Code läuft, kannst du das ganze natürlich optimieren.

Sind alles erstmal nur Beispiele und rudimentäre Funktionen. Aber versuch damit erstmal, eine vollautomatische sub zu erstellen, die von einem notify jedesmal aufgerufen wird, wenn der Feuchtesensor einen neuen Messwert liefert

Feuchtesensor:Luftfeuchte.* { lueftung()}

Wenn Probleme auftreten, melde dich einfach. Hoffe meine Erklärung war jetzt nicht zu kompliziert.

Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

scs90

Soooo, guten Abend zusammen!

Erstmal vielen Dank für die Hilfe. Ich bin jetzt schon eine ganze Ecke weiter gekommen, hänge aber zur Zeit wohl an einem Syntaxfehler, den ich nciht finde. Das aktuelle Modul sieht so aus

abc2006, deinen Hinweis

my $Feuchte = ReadingsNum(...);

habe ich noch nicht umgesetzt, weil mir das im Editor nicht farblich genauso gekennzeichnet wird wie das ReadingsVal, ich wusste noch nicht wieso, daher war mit das (noch) nicht geheuer... Für die Readings habe ich mich jetzt für Dummys entschieden. Die kann ich nicht aus Versehen löschen, wenn der Heizkörperthermostat mal spinnt und ich ihn neu anlerne.

sub Waeschetrocknung_Buero()
{
my $Feuchte = ReadingsVal(Buero_TempHyg, "humidity", 0 );
my $desiredTemp = ReadingsVal(Buero_Heizung, "desiredTemperature", 0 );
my $Abfrage = ReadingsVal(Waeschetrocknung_Buero_Startabfrage, "state", 0 );
my $Freigabe = ReadingsVal(Waeschetrocknung_Buero_Start, "state", 0 );
my $Lueften = ReadingsVal(Waeschetrocknung_Buero_Lueften, "state", 0 );
my $t_LetztesLueften = (time()-time_str2num(ReadingsTimestamp(Waeschetrocknung_Buero_Lueften, "state", 0)));
if( $Feuchte >= 70 && $Abfrage = 0 && $Freigabe = 0 ) {
fhem("set Gaston message (Ja) (Nein) Waeschetrocknung starten");
fhem("set Waeschetrocknung_Buero_Startabfrage 1");
#notify soll bei ankommender Nachricht Freigabe auf 1 und Abfrage auf 0 setzen
}elsif( $Feuchte >= 70 && $desiredTemp < 22.0 && $Freigabe = 1 ) {
fhem("set Gaston message Waeschetrocknung gestartet");
fhem("set Buero_Heizung desiredTemperature 22.0");
#das Lueften muss via notify --> trigger active/inactive geprueft werden, erst Erinnerung via Telegram, dann Luften wieder auf 0 setzen.
}elsif( $Feuchte >= 70 && $desiredTemp >= 22.0 && $Freigabe = 1 && $Lueften = 0 ){
fhem("set Gaston message Bitte Buero lueften");
fhem("set Waeschetrocknung_Buero_Lueften 1");
}elsif( $Feuchte < 70 && $t_LetztesLueften > 10800 ) {
fhem("set Waeschetrocknung_Buero_Start 0");
fhem("set Buero_Heizung desiredTemperature 16.0");
fhem("set Gaston message Waeschetrocknung erfolgreich beendet, einmal Lueften empfohlen");
}
}


Und ja, mein Telegrammodul heißt Gaston.  :D Die Kommentare sind jetzt nicht alles offene Fragen, sonder eher Erinnerungen für mich selbst, die noch zahlreichen offenen Lücken zu stopfen. Nun das Problem: Beim Speichern bekomme ich das hier:

Can't modify constant item in scalar assignment at ./FHEM/99_myUtils.pm line 75, near "0 ) "

Ich kann mir nciht erklären, wo der Fehler sitzt, sieht das jemand?

Viele Grüße
Simon


abc2006

habe ich noch nicht umgesetzt, weil mir das im Editor nicht farblich genauso gekennzeichnet wird wie das ReadingsVal, ich wusste noch nicht wieso, daher war mit das (noch) nicht geheuer...

Ja... doofer Editor :-)
Habe schon ein paar Befehle moniert, die von ihm nicht richtig erkannt werden... müssten *nur* eingepflegt werden.
Ausgeführt wird der Befehl trotzdem richtig ;) ist mit ReadingsTimestamp ähnlich ;)


War ein bisschen schwierig, Line 75 zu finden, wenn die zeilen nicht nummeriert sind ;)
Zitat$Freigabe = 0

In einer IF-Abfrage vergleichst du Werte. Der Operator "=" weist aber Werte zu.
Deshalb verwendest du einfach "$Freigabe == 0", dann sollte es funktionieren.
Gilt übrigens für alle If-Abfragen in deinem Code :-)

Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

andies

Schau Dir bei Gelegenheit auch mal DOIF an, da musst Du etwas weniger programmieren. Vermutlich ist das aber Geschmackssache, sub ist näher an Perl dran als das DOIF-Modul.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

abc2006

DOIF hat durchaus seinen Charme, bei der Kombination von Event und Zeit, sowie bei einfachen Aufgaben.
Diese Aufgabe würde ich vermutlich tatsächlich auch als *Sub* lösen, weil man einfach wesentlich mehr Möglichkeiten hat, und es meiner Meinung nach auch übersichtlicher ist.

Dass es geht, davon bin ich überzeugt. Und dass es Geschmackssache ist, gebe ich dir 100% recht.
Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

CoolTux

Eigentlich sollten die Fehlermeldung nicht nur in Zeile 75 kommen. Da sind überall Zuweisungen statt vergleiche


sub Waeschetrocknung_Buero()
{
my $Feuchte = ReadingsVal(Buero_TempHyg, "humidity", 0 );
my $desiredTemp = ReadingsVal(Buero_Heizung, "desiredTemperature", 0 );
my $Abfrage = ReadingsVal(Waeschetrocknung_Buero_Startabfrage, "state", 0 );
my $Freigabe = ReadingsVal(Waeschetrocknung_Buero_Start, "state", 0 );
my $Lueften = ReadingsVal(Waeschetrocknung_Buero_Lueften, "state", 0 );
my $t_LetztesLueften = (time()-time_str2num(ReadingsTimestamp(Waeschetrocknung_Buero_Lueften, "state", 0)));

if( $Feuchte >= 70 && $Abfrage == 0 && $Freigabe == 0 ) {
fhem("set Gaston message (Ja) (Nein) Waeschetrocknung starten");
fhem("set Waeschetrocknung_Buero_Startabfrage 1");
                #notify soll bei ankommender Nachricht Freigabe auf 1 und Abfrage auf 0 setzen
}

        elsif( $Feuchte >= 70 && $desiredTemp < 22.0 && $Freigabe == 1 ) {
fhem("set Gaston message Waeschetrocknung gestartet");
fhem("set Buero_Heizung desiredTemperature 22.0");
                #das Lueften muss via notify --> trigger active/inactive geprueft werden, erst Erinnerung via Telegram, dann Luften wieder auf 0 setzen.
}

        elsif( $Feuchte >= 70 && $desiredTemp >= 22.0 && $Freigabe == 1 && $Lueften == 0 ){
fhem("set Gaston message Bitte Buero lueften");
fhem("set Waeschetrocknung_Buero_Lueften 1");
}

        elsif( $Feuchte < 70 && $t_LetztesLueften > 10800 ) {
fhem("set Waeschetrocknung_Buero_Start 0");
fhem("set Buero_Heizung desiredTemperature 16.0");
fhem("set Gaston message Waeschetrocknung erfolgreich beendet, einmal Lueften empfohlen");
}


Wenn man den Code noch sauber strukturiert und formatiert dann können ihn auch andere schön lesen.
Überlege Dir gut in welcher Reinfolge Du etwas abfragen tust. Warum ich das sage?
einfaches Beispiel:


if( $temp >10) {
    alarm;
}

elsif ($temp > 20) {
    keinalarm;
}

finde den Fehler


Ob das bei Dir zu trifft kann ich nicht sagen, es sollte als Anmerkung und Denkanstoß aufgefasst werden.





Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

scs90

Hallo zusammen,

vielen Dank für euren Input. Ich denke, dass ich damit schon eine ganze Ecke weiterkommen werde - ich melde mich dann an dieser Stelle nochmal. Allerdings haben mich Arbeit und Familie um die Weihnachtszeit jetzt schwer im Griff (euch vermutlich auch), sodass ich mich da nur ganz unregelmäßig dransetze und natürlich auch eine Rückmeldung dann etwas dauert. Auch die anderen Varianten via doif werde ich mir mal ansehen, allerdings finde ich es immer übersichtlicher, wenn ich mir den Code im Ganzen ansehen kann und nicht verschiedene doifs über die GUI miteinander verschactel (allerdings habe ich bisher noch nicht mit doif gearbeitet),

Bitte entschuldigt ein paar Anfängerfehler, (z.B. die fhelende Zeilennummer, schlechte Struktur im Code etc), das ist glaube ich mein erster Code seit 10 Jahren und mit Informatik habe ich von Beruf und Ausbildung auch nix am Hut, da muss ich erstmal wieder bei Null anfangen. Umso schöner, dass ich hier so viele nette Hilfe bekomme :)

scs90

Hallo zusammen und fröhliche Weihnachten!

Gestern und heute hatte ich etwas Zeit, die Wäschetrocknung weiter zu verfolgen. Mit einigen Holper- und Stolperern bin ich jetzt am Ziel und mir bleibt nur noch, die eingestellten Werte zu optimieren. Aber das wird etwas Erfahrung brauchen.

Ich wollte euch das Ergebnis mal zeigen und vor allem mal hören, wie ich das Ganze besser machen kann. Ich bin wie schon geschrieben echter Quereinsteiger und mein Code ist für das, was er kann, vermutlich viel zu lang und umständlich. Ich würde mich daher freuen, ein bisschen Input über mögliche Verbesserungen oder auch "Bugs" (also Situationen, die zu unerwünschtem Verhalten führen könnten) von euch zu bekommen.

Es kann sein, dass ich mich über die Feiertage nur sehr sporadisch melde, das ist aber nciht böse gemeint, wir machen nur eine Familienreise quer durch Deutschland (D'dorf/Chemnitz)...

Hier mein Util soweit:

###### Waeschetrocknung_Buero ######

# Auslösen über notiy Buero_TempHyg:humidity.* Waeschetrocknung_Buero()

sub Waeschetrocknung_Buero()
{
my $Feuchte = ReadingsNum("Buero_TempHyg", "humidity", undef );
my $Feuchte_Max = 66 ;
my $Feuchte_Min = $Feuchte_Max-5;
my $t_LetzteFeuchte = (time()-time_str2num(ReadingsTimestamp("Buero_TempHyg", "humidity", undef)));
my $Temperatur = ReadingsNum("Buero_TempHyg", "temperature", undef );
my $t_LetzteTemperatur = (time()-time_str2num(ReadingsTimestamp("Buero_TempHyg", "humidity", undef)));
my $Temperatur_Max = "22.0";
my $Temperatur_Min = "20.0";
my $desiredTemp = ReadingsNum("Buero_Heizung", "desiredTemperature", undef );
my $Abfrage = ReadingsNum("Waeschetrocknung_Buero_Startabfrage", "state", undef );
my $t_LetzteAbfrage = (time()-time_str2num(ReadingsTimestamp("Waeschetrocknung_Buero_Startabfrage", "state", undef)));
my $Wartezeit = ReadingsNum("Waeschetrocknung_Buero_AusFuerSec", "state", undef );
my $Status = ReadingsNum("Waeschetrocknung_Buero_Status", "state", undef );
# mögliche Statuswerte: 0 = aus, 0.5 = Startabfrage, 1 = an, trocknen, 1.5 = max Temp/Feuchte erreicht, warten auf Lüften, 9 = Abbruch
my $t_LetzterStatus = (time()-time_str2num(ReadingsTimestamp("Waeschetrocknung_Buero_Status", "state", undef)));
my $Fenster = ReadingsVal("Buero_Fenster", "state", undef );
my $t_LetztesLueften = (time()-time_str2num(ReadingsTimestamp("Buero_Fenster", "state", undef)));
my $identifier = time();
#identifier soll die Antworten bei Telegram eindeutig identifizierbar machen

#Tool soll nur jede Minute ausgeführt werden, da sonst zum Teil Mehrfachnachrichten

  if( $t_LetzteFeuchte >= 60 || $t_LetzteTemperatur >= 60) {

#erstmaliges Erreichen des Grenzwerts, Abfrage via Telegram

if( $Status == 0 && $Abfrage == 0 && $Feuchte >= $Feuchte_Max && $t_LetzteAbfrage >= $Wartezeit) {
fhem("set Waeschetrocknung_Buero_Antwort_nein Nein! ( $identifier )");
fhem("set Waeschetrocknung_Buero_Antwort_ja Ja! ( $identifier )");
fhem("set Gaston message (Ja! ( $identifier )) (Nein! ( $identifier )) Luftfeuchte im Büro beträgt $Feuchte %. Wäschetrocknung starten?");
fhem("set Waeschetrocknung_Buero_Antwort initialize");
fhem("set Waeschetrocknung_Buero_Startabfrage 1");
$Abfrage = 1;
Log 3, "Waeschetrocknung_Buero Status: Startabfrage";

#Zur Auswertung define Waeschetrocknung_Buero_Antwort DOIF
#DOIF ([Gaston:msgText] eq [Waeschetrocknung_Buero_Antwort_ja:state]) (set Waeschetrocknung_Buero_Status 0.5, set Waeschetrocknung_Buero_Startabfrage 0, set Waeschetrocknung_Buero_Antwort disabled)
#DOELSEIF ([Gaston:msgText] eq [Waeschetrocknung_Buero_Antwort_nein:state]) (set Waeschetrocknung_Buero_Status -1, set Waeschetrocknung_Buero_Startabfrage 0, set Waeschetrocknung_Buero_Antwort disabled)

}elsif( $Abfrage == 1 && $Status != 0) {
fhem("set Waeschetrocknung_Buero_Antwort disable");
fhem("set Waeschetrocknung_Buero_Startabfrage 0");
fhem("set Waeschetrocknung_Buero_Antwort_nein undef");
fhem("set Waeschetrocknung_Buero_Antwort_ja undef");

#bei "Nein" nach 1 Stunden nochmal ans Lüften erinnern und beenden
}elsif( $Status == -1 && $t_LetzterStatus >= 3600) {
if ( $Feuchte >= $Feuchte_Max ) {
fhem ("set Gaston message Luftfeuchte im Büro beträgt noch immer $Feuchte %. Bitte dringend lüften! Wäscheerkennung wird ab jetzt für 2 Stunden deaktiviert.");
fhem ("set Waeschetrocknung_Buero_AusFuerSec 18000");
fhem ("set Waeschetrocknung_Buero_Status 0");
$Status = 0;
}else {
fhem ("set Gaston message Wäscheerkennung wieder aktiv.");
fhem ("set Waeschetrocknung_Buero_Status 0");
$Status = 0;
}

#bei "Ja", Fensterposition beachten.
}elsif( $Status == 0.5 && $Fenster eq "opened") {
fhem ("set Gaston message Fenster ist geöffnet. Wäschetrocknung beginnt, sobald das Fenster geschlossen ist.");

#bei "Ja" und Fenster zu, Wäschetrocknung starten
}elsif( $Status == 0.5 && $Fenster eq "closed") {
fhem ("set Waeschetrocknung_Buero_Status 1");
$Status = 1;
Log 3, "Waeschetrocknung_Buero Status: Laeuft";

#wenn während der Trocknung die Temp runtergestellt wird, wieder hochstellen.
}elsif( $Status == 1 && $Fenster eq "closed" && $desiredTemp < $Temperatur_Max) {
fhem ("set Buero_Heizung desiredTemperature $Temperatur_Max");
fhem ("set Gaston message Wäschetrocknung aktiv, Heizung auf $Temperatur_Max °C gestellt.");

#Wenn Temp erreicht und Feuchte wieder hoch, Lüften anfordern. Mindestens 30 min Pause zwischen Lüftvorgängen
}elsif( $Status == 1 && $Feuchte >= $Feuchte_Max && $Temperatur >= $Temperatur_Max && $Fenster eq "closed" && $t_LetztesLueften > 1800 ){
fhem("set Waeschetrocknung_Buero_Status 1.5");
$Status = 1.5;
fhem("set Gaston message Aktuelle Luftfeuchte im Büro beträgt $Feuchte %. Für optimale Wäschetrocknung bitte lüften!");

#Wenn Feuchte wieder unter Grenzwert, bei offenem Fenster ans Schließen erinnern, auf jeden Fall Trocknung fortsetzen
}elsif( $Status == 1.5 && ($Feuchte <= $Feuchte_Min || $Temperatur <= $Temperatur_Min)) {
if( $Fenster eq "opened") {fhem("set Gaston message Ausreichend gelüftet. Für weitere Wäschetrocknung bitte das Fenster schließen!")};
fhem("set Waeschetrocknung_Buero_Status 1");
$Status = 1;

#Wenn nach dem letzten Lüften innerhalb von 3 Stunden der Feuchtegrenzwert nicht mehr erreicht wird, Wäschetrocknung beenden.
}elsif( ($Status > 0 && $Feuchte < $Feuchte_Max && $Temperatur >= $Temperatur_Max && $Fenster eq "closed" && $t_LetztesLueften >= 10800) || $Status == 9 ) {
fhem ("set Waeschetrocknung_Buero_Status 0");
fhem ("set Buero_Heizung desiredTemperature 16.0");
fhem ("set Waeschetrocknung_Buero_Antwort disable");
fhem ("set Waeschetrocknung_Buero_Startabfrage 0");
if ( $Feuchte > $Feuchte_Min) {fhem ("set Gaston message Wäschetrocknung beendet. Aktuelle Feuchte $Feuchte %, einmal Lüften empfohlen.")};
Log 3, "Waeschetrocknung_Buero Status: Beendet";
}
  }
}


Viele Grüße