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; }
}