- Meine FHEM Konfiguration – notify mal anders
- Meine FHEM Konfiguration – Geräte an- und ausschalten für Fortgeschrittene
- Meine FHEM Konfiguration – dkUtils DAS Helferlein
- Meine FHEM Konfiguration – Fritzbox
- Meine FHEM Konfiguration – Schritt für Schritt
In diesem Beitrag möchte ich etwas tiefer in die Programmierung einsteigen und zeigen wie man Geräte „sinnvoll“ an- und ausschalten kann.
Das Thema mag auf den ersten Blick trivial klingen, doch es sorgt dafür, dass der Funkverkehr reduziert wird und die Geräte auch nur dann geschaltet werden, wenn es auch wirklich erforderlich ist.
Die Funktionen dkOn() und dkOff() kennt ihr ja schon aus dem vorherigen Beitrag.
Für die „neue“ Funktion habe ich sie etwas modifiziert. Die beiden Funktionen rufen nun wiederum eine Funktion namens dkSetDevice() auf. Es werden zwei Parameter übergeben: device(s) ($input) und state ($value).
Der $input kann ein komma-separierter String sein, so dass mehrere Geräte an- bzw. ausgeschaltet werden können.
Anschließend wird überprüft, ob das jeweilige Gerät existiert.
Existiert das Gerät gibt es zwei Fälle:
(a) es handelt es sich um ein Homematic-Gerät dessen Status nicht „unknown“ oder der gewünschte Zustand ist
(b) es handelt sich um kein Homematic-Gerät
Bei letzterem wird der Status nicht überprüft, da es insb. bei Intertechno-Geräten vorkommen kann, dass nicht geschaltet wird.
Die dann bereinigte Liste wird entsprechend geschaltet.
Und hier der Code:
sub dkSetDevice($$) {
my ($input, $value) = @_;
my @devices = split(',', $input);
my @validated_devices;
foreach my $device (@devices) {
if (dkExists($device)) {
if (dkIsHomematic($device)) {
my $state = dkGetState($device);
if ($state ne $value && $state ne "unknown") {
push(@validated_devices, $device);
}
} else {
push(@validated_devices, $device);
}
}
}
my $cleaned_device_list = join(",", @validated_devices);
if ($cleaned_device_list ne "") {
fhem("set $cleaned_device_list $value", 1);
}
}
sub dkOn($) {
my($device) = @_;
dkSetDevice($device, "on");
}
sub dkOff($) {
my($device) = @_;
dkSetDevice($device, "off");
}
Hier die benötigten Funktionen aus der dkUtils.pm
sub dkIsHomematic($) {
my ($device) = @_;
my $device_type = dkGetAttr($device, "model");
if (substr($device_type, 0, 2) eq "HM") {
return 1;
} else {
return 0;
}
}
sub dkExists($) {
my ($object) = @_;
if ( Value($object) ) { return 1; } else { return 0; }
}
Hi,
sehr schöne Ausführungen.
Wie ist die Funktion dkIsHomematic in der Utils umgesetzt?
Gruß A.
Hallo Alec,
ich habe die Funktionen ergänzt. Hoffe, dass es Dir hilft.
Viele Grüße
Dennis
Vielen Dank für die Aktualisierung.