Zitat{"state":"ON","brightness":$EVTPART1, "transition": 5}hatte ich erfolglos probiert und dann die KI befragt, rausgekullert sind 2 notify_devices als workaround:
defmod notify_GoveeNeonEG_SmoothDim notify GoveeNeonEG:set:brightness.* { \
my $target = int($EVTPART1);; \
my $steps = 12;; \
my $duration = 3;; \
my $delay = $duration / $steps;; \
my $current = int(ReadingsVal("GoveeNeonEG", "brightness", 50));; \
my $stepsize = ($target - $current) / $steps;; \
for (my $i = 1;; $i <= $steps;; $i++) \
{ \
my $new = int($current + $i * $stepsize + 0.5);;\
$new = 0 if $new < 0;; $new = 100 if $new > 100;; \
InternalTimer(gettimeofday() + $i * $delay, sub { fhem("set GoveeNeonEG brightness $new") }, "smoothdim_".time()."_".$i);; } \
}
defmod notify_GoveeNeonEG_SmoothONOFF notify GoveeNeonEG:set:(on|off).* { \
my $target = ($EVTPART0 eq "on" ? 100 : 0);; \
my $steps = 10;; \
my $duration = 2;; \
my $delay = $duration / $steps;; \
my $current = int(ReadingsVal("GoveeNeonEG", "brightness", 50));; \
my $stepsize = ($target - $current) / $steps;; \
for (my $i = 1;; $i <= $steps;; $i++) \
{ \
my $new = int($current + $i * $stepsize + 0.5);; \
$new = 0 if $new < 0;; $new = 100 if $new > 100;; \
InternalTimer(gettimeofday() + $i * $delay, sub { fhem("set GoveeNeonEG brightness $new") }, "smooth_onoff_".time()."_".$i);; } \
}
Damit klappt das nun ganz hervorragend.
--- FHEM/36_JeeLink.pm (revision 30843)
+++ FHEM/36_JeeLink.pm (working copy)
@@ -455,7 +455,7 @@
$hash->{RA_Timeout} = 1;
for(;;) {
my ($err, undef) = JeeLink_ReadAnswer($hash, "Clear", 0, undef);
- last if($err && $err =~ m/^Timeout/);
+ last if($err);
}
delete($hash->{RA_Timeout});
}
Zitat von: Elektron am 22 Februar 2026, 10:45:58Bei mir steht der INTERVAL auf 60 Sekunden, ich schalte die Zirkulationspumpe für 5 Minuten ein und das je alle 4000 SekundenWie hast du den Shelly eingerichtet, ich würde das gerne nachstellen.
Zitat von: Elektron am 22 Februar 2026, 10:45:58Wie schon geschrieben, ist die gleiche Konfiguration bis Weihnachten ohne Auffälligkeiten gelaufen, seit de, geht es immer wieder nicht. Gab es in diesem Zeitraum Änderungen?Ja, schon, es gibt immer wieder Ergänzungen, aber seit Weihnachten nichts Grundlegendes am Timing.
Zitat von: rudolfkoenig am 22 Februar 2026, 11:45:45Alternativ koennte man auch attr -a verwenden: https://fhem.de/commandref_modular.html#attr
Fuer die Ueberlagerung von Befehlen gibt es auch eine Alternative: cmdalias: https://fhem.de/commandref_modular.html#cmdalias
##############################################
# $Id: 99_myAttrRoom.pm 0001 2026-02-22 12:30:00Z tompsg $
# FORK: Unterstützung für room +/- mit DevSpecs
##############################################
package main;
use strict;
use warnings;
use POSIX;
# Variable für die Sicherung der Originalfunktion
use vars qw($oldCommandAttr);
sub myAttrRoom_Initialize($$) {
my ($hash) = @_;
Log3(undef, 1, "myAttrRoom: custom CommandAttr hook loaded - support for room +/- enabled");
}
{
no warnings 'redefine';
# Sicherung der originalen Funktion (einmalig beim Laden)
if (!defined($oldCommandAttr)) {
$oldCommandAttr = \&main::CommandAttr;
}
# Überlagerung der Funktion CommandAttr
*main::CommandAttr = sub {
my ($cl, $param) = @_;
# Zerlegen des Befehls (Device, Attribut, Neuer Wert)
my ($dev, $attrName, $newVal) = split("[ \t]+", $param, 3);
# Wir springen sofort raus, wenn:
# - kein Attributname vorhanden ist
# - es nicht um 'room' geht
# - eine Option wie -a oder -silent verwendet wird (erkannt am führenden - in $dev)
if (!$attrName || $attrName ne "room" || ($dev && $dev =~ /^-/)) {
return $oldCommandAttr->($cl, $param);
}
# Prüfung: Wenn das erste Zeichen + oder - ist
if ($newVal && $newVal =~ /^[\+\-]/) {
# Prüfung: Abbruch bei Komma (mehrere Räume nicht erlaubt)
if (substr($newVal, 1) =~ /,/) {
return "Fehler: Mehrere Räume (Komma) sind bei +/- nicht erlaubt!";
}
# Fehler: Kein Name
my $modifier = substr($newVal, 0, 1);
# Zielraum isolieren und Leerzeichen säubern
my $targetRoom = substr($newVal, 1);
$targetRoom =~ s/^\s+|\s+$//g;
if (length($targetRoom) == 0) {
return "Fehler: Kein Raumname nach $modifier angegeben!";
}
# Fehler: Ziel nicht auffindbar
my @devices = devspec2array($dev);
if (scalar @devices == 0) {
return "Fehler: Device/DevSpec $dev nicht gefunden!";
}
# --- VERARBEITUNG ---
foreach my $singleDev (@devices) {
# Aktuelle Räume des Devices laden
my $currentRooms = $attr{$singleDev}{room} // "";
my @roomList = split(',', $currentRooms);
if ($modifier eq "+") {
push(@roomList, $targetRoom) unless grep { $_ eq $targetRoom } @roomList;
}
elsif ($modifier eq "-") {
@roomList = grep { $_ ne $targetRoom } @roomList;
}
# Bereinigung: Leere Einträge entfernen
@roomList = grep { length($_) > 0 } @roomList;
# Sortierung: Alphabetisch (Standard / Case-Sensitive)
@roomList = sort { $a cmp $b } @roomList;
# Wenn kein Raum mehr übrig ist: Attribut komplett löschen
if (scalar @roomList == 0) {
Log 3, "myAttrRoom: Letzter Raum entfernt, lösche Attribut room für $singleDev";
main::CommandDeleteAttr($cl, "$singleDev room");
} else {
my $finalRooms = join(',', @roomList);
Log 4, "myAttrRoom: $singleDev -> neue Räume: $finalRooms"; # Detail-Log
$oldCommandAttr->($cl, "$singleDev room $finalRooms");
}
}
return undef; # Erfolg
}
# Aufruf der Originallogik
return $oldCommandAttr->($cl, $param);
};
}
1;