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
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
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...
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?
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
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?
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
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")};
}
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