FHEM Forum

FHEM => Frontends => TabletUI => Thema gestartet von: TWART016 am 22 Februar 2018, 10:33:44

Titel: Aktion in X Minuten ausführen
Beitrag von: TWART016 am 22 Februar 2018, 10:33:44
Hallo,

ich würde mir gerne so etwas wie einen Timer bauen:
Ein Select, in dem Werte stehen: 5, 10, 20, 30, ... Das ist soweit kein Problem.

Anschießend möchte ich auf einen Button, Link, ... klicken und anschließend wir folgender Befehl in x Minuten (wie im Select angegeben) geschalten:
set LED_Schlafzimmer off

Wie setze ich das am besten um?

Edit: Das ganze bräuchte ich in Tablet UI


Gruß
TWART016
Titel: Antw:Aktion in X Minuten ausführen
Beitrag von: rr725 am 22 Februar 2018, 12:29:33
hm... mit select kann ich im mom. nichts anfangen- hab ich noch nie benutzt, gebraucht.
aber schau dir mal "defmod " an, damit kannst das realisieren.


define Testle notify Button_pressed:on defmod Schlafzimmer at +00:10:00 LED_Schlafzimmer off
Titel: Antw:Aktion in X Minuten ausführen
Beitrag von: raiderxxl am 22 Februar 2018, 12:56:47
Ich hab mal was gefunden...

define lichtMod dummy
attr lichtMod setList on:slider,0,60,5400
attr lichtMod webCmd on
define lichtChange notify lichtMod modify LichtAn *04:00:00 set Lampe1 on-for-timer %


Ist glaub ich sogar vom Meister himself...
Titel: Antw:Aktion in X Minuten ausführen
Beitrag von: TWART016 am 22 Februar 2018, 12:59:38
Das hatte ich vergessen: Ich bräuchte das in Tablet UI.

Mit at habe ich kein Problem und könnte das problemlos, nur wie kann ich da die Zeit in das at z.B. schreiben?
Titel: Antw:Aktion in X Minuten ausführen
Beitrag von: n4rrOx am 28 Februar 2018, 11:16:18
Habe ebenfalls so einen Timer für Licht und Heizung:


<div data-type="select" data-items='["sz_Schaltaktor_Licht","sz_Schaltaktor_LED","sz_Nachtleuchte","wz_Schaltaktor_Licht","wz_Schaltaktor_LED","ku_Schaltaktor_Licht","ku_Schaltaktor_LED","kz_Schaltaktor_Licht","bad_Schaltaktor_Licht","bad_Schaltaktor_LED","wc_Schaltaktor_Licht","wc_Schaltaktor_LED","flur_Schaltaktor_Licht","flur_Schaltaktor_LED"]'
data-alias='["Schlafzimmer Licht","Schlafzimmer LED","Nachtleuchte","Wohnzimmer Licht","Wohnzimmer LED","Küche Licht","Küche LED","Kinderzimmer Licht","Bad Licht","Bad LED","WC Licht","WC LED","Flur Licht","Flur LED"]'
id="sendDev" class="notransmit col-1-1"></div><br />
<div data-type="select"
data-items='["on-for-timer","on","off"]'
data-alias='["einschalten für...","ein","aus"]'
id="sendParam" class="notransmit col-1-1"></div><br />
<div data-type="select"
data-items='["","60","120","180","300","600","900","1800","3600","5400","7200","10800","14400","18000","21600"]'
data-alias='["","1 Min","2 Min","3 Min","5 Min","10 Min","15 Min","30 Min","1 Stunde","1,5 Stunden","2 Stunden","3 Stunden","4 Stunden","5 Stunden","6 Stunden"]'
id="sendValue" class="notransmit col-1-1"></div><br />
<div data-type="link" class="round centered"
data-width="200" data-height="40"
data-color="white"
data-background-color="green"
data-icon="fa-feed"
data-device="#sendDev"
data-set="#sendParam"
data-value="#sendValue">
OK
</div>


Das zweite Select ist nicht zwingend notwendig.
Die List-Items müssten noch angepasst werden.

Gruß
Mathias
Titel: Antw:Aktion in X Minuten ausführen
Beitrag von: TWART016 am 28 Februar 2018, 22:56:22
Hallo Mathias,

der Ansatz gefällt mir. Ich möchte das mit dem Wifilight Modul nutzen. Problem ist, dass dieses Gerät on-for-timer nicht unterstüzt.

Gibt es noch eine andere Möglichkeit?


Titel: Antw:Aktion in X Minuten ausführen
Beitrag von: n4rrOx am 01 März 2018, 09:13:42
Hi TWART016,

anderes Beispiel für meine Heizung.
Widgets sehen identisch aus ... arbeiten aber etwas anders:

<div data-type="select" data-device="PartyControl" data-cmd="setreading" data-get="Device" data-set="Device"
data-items='["bad_Thermostat","sz_Thermostat","wz_Thermostat","ku_Thermostat","kz_Thermostat"]'
data-alias='["Bad","Schlafzimmer","Wohnzimmer","Küche","Kinderzimmer"]'
class="col-1-1">
</div><br />
<div data-type="select" data-device="PartyControl" data-cmd="setreading" data-get="Temp" data-set="Temp"
data-items='["6.0","12.0","14.0","16.0","18.0","18.5","19.0","19.5","20.0","20.5","21.0","21.5","22.0","22.5","23.0","23.5","24.0"]'
data-alias='["6.0 °C","12.0 °C","14.0 °C","16.0 °C","18.0 °C","18.5 °C","19.0 °C","19.5 °C","20.0 °C","20.5 °C","21.0 °C","21.5 °C","22.0 °C","22.5 °C","23.0 °C","23.5 °C","24.0 °C"]'
class="col-1-1">
</div><br />
<div data-type="select" data-device="PartyControl" data-cmd="setreading" data-get="Dauer" data-set="Dauer"
data-items='["0.5","1","1.5","2","2.5","3","4","5","6","7","8","9","10","11","12","24","48"]'
data-alias='["0.5 h","1 h","1.5 h","2 h","2.5 h","3 h","4 h","5 h","6 h","7 h","8 h","9 h","10 h","11 h","12 h","24 h","48 h"]'
class="col-1-1">
</div><br />
<div data-type="link" data-fhem-cmd="{aufheizen()}"
class="round centered"
data-width="200" data-height="40"
data-color="white"
data-background-color="green"
data-icon="fa-feed">
OK
</div>


=> Die ersten 3 Selects füttern Readings eines Dummys.
Mit dem Link Widget wird die Sub Routine in der 99_myUtils.pm angestoßen:

#############################################################

sub aufheizen
{

# aufgerufene Parameter
my $device = ReadingsVal("PartyControl", "Device", "");
my $temperatur = ReadingsVal("PartyControl", "Temp", "");
my $stunden = ReadingsVal("PartyControl", "Dauer", "");

$device = $device."_Climate";

# hole die aktuelle Zeit und Datum
my($sec1,$min1,$hour1,$day1,$mon1,$year1,$wday1,$yday1,$isdst1) = localtime(time);

# in UnixTime umwandeln
my $unixstarttime = mktime (localtime(time));

# Unix Endzeit berechnen ............. +900: eine Stunde = 45 bis 75 Minuten // +1800: immer zur nächsten halben Stunde aufgerunden
my $unixendtime = $unixstarttime + (3600 * $stunden)+ 900;

# Unix Endzeit in "lesbare Zeit" umwandeln
my ($sec2,$min2,$hour2,$day2,$mon2,$year2,$wday2,$yday2,$isdst2) = localtime($unixendtime);

# Setzte Variablen für Start- und Endpunkt
my $startTime = sprintf("%02d:%02d",$hour1,$min1);
my $endTime = sprintf("%02d:%02d",$hour2,$min2);
my $startDate = sprintf("%02d.%02d.%02d",$day1,$mon1 + 1,$year1 % 100);
my $endDate = sprintf("%02d.%02d.%02d",$day2,$mon2 + 1,$year2 % 100);

# HM-CC-RT-DN akzeptiert nur Minute auf 00 oder 30 enden, daher $startTime abrunden und $endTime runden.
$startTime =~ s/\:[0-2].$/:00/;
$startTime =~ s/\:[3-5].$/:30/;
$endTime =~ s/\:[0-2].$/:00/;
$endTime =~ s/\:[3-5].$/:30/;

# Sendebefehl Thermostat
{ fhem("set $device controlParty $temperatur $startDate $startTime $endDate $endTime")};

}
########

=> In der Sub hole ich mir die eingestellten Werte und setzte dann den Party-Modus der Thermostate.
Hier kannst du dann auch einfach einen evtl. alten bestehenden at-Timer löschen, die Lampe mit einem Befehl anschalten lassen und einen neuen at-Timer mit der Off-Zeit erstellen lassen.
In der Sub bist du ja komplett frei in der Programmierung.

Gruß
Mathias
Titel: Antw:Aktion in X Minuten ausführen
Beitrag von: TWART016 am 01 März 2018, 18:14:53
Der Ansatz gefällt mir sehr gut. Nur habe ich mit den Zeiten zu rechnen ein paar Probleme.

Gibt es die Möglichkeit bei einer Zahl von 0-9 automatisch eine Null davor zu schreiben. Mit einem IF geht das bestimmt, vielleicht gibt es aber eine elegantere Lösung?

Aktuell mein Code:
my $device = ReadingsVal("LichtAusIn", "Device", "");
my $minuten = ReadingsVal("LichtAusIn", "Minuten", "");
my $stunden = ReadingsVal("LichtAusIn", "Stunden", "");

my $deviceDefMod = $device."_LichtAus";

# Sendebefehl Thermostat
{ fhem("set Telegram msg defmod $deviceDefMod at +0$stunden:0$minuten:00 set $device off")};

}
Titel: Antw:Aktion in X Minuten ausführen
Beitrag von: n4rrOx am 02 März 2018, 09:34:27
Es gibt mehrere Varianten, z. B. so:


[...]
if(length($minuten) < 2){ $minuten="0".$minuten; }
[...]


Alternativ die Funktion sprintf benutzen:

[...]
$minuten = sprintf("%02d", $minuten);
$stunden = sprintf("%02d", $stunden);
[...]


Dritte Möglichkeit wäre im FTUI, indem du einfach das Befüllen der Minuten bereits bei "data-items" mit führender Null angibst.... "data-alias" kann dann weiterhin einstellig sein.
Dann musst dir auch keine Gedanken über den Rest machen ^^

Gruß
Mathias