Zitat von: uli-bs am 21 November 2025, 19:05:26Einzige sinnvolle Erkenntnis, die ich habe, ein Reboot oder "shutdown restart" löst das Problem für kurze Zeit (0,5 - 1 Std.), dann triggert das Schalten eines der Geräte den "Spaß" wieder.Moin. Das scheint es ja auf FHEM als Quelle einzugrenzen... hast du mal im EventMonitor geschaut?
)#contributed by Scooty
name:zigbee2mqtt_Rain_Illuminance_Sensor
desc: Rain Illuminance sensor via zigbee2mqtt <br>Tested with: Hobeian Rain illuminance sensor ZG-223Z
filter:TYPE=MQTT2_DEVICE:FILTER=CID~zigbee.*
order:L_10b
par:BASE_TOPIC;base topic set in configuration.yaml of the zigbee2mqtt bridge;{ AttrVal("DEVICE","devicetopic",AttrVal("DEVICE","readingList","")) =~ m,[\b]?([^/:]+)[/].+, ? $1 : undef }
par:DEV_ID;name of the device in the zigbee2mqtt bridge;{ AttrVal("DEVICE","devicetopic",AttrVal("DEVICE","readingList","")) =~ m,[^/]+[/]([^/:]+).*, ? $1 : undef }
par:ICON;ICON as set, defaults to weather_rain_gauge;{ AttrVal("DEVICE","icon","weather_rain_gauge") }
attr DEVICE icon ICON
attr DEVICE stateFormat rainwater
attr DEVICE devStateIcon raining:weather_rain@green .*:weather_sun@red
attr DEVICE devicetopic BASE_TOPIC/DEV_ID
attr DEVICE readingList $\DEVICETOPIC:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr DEVICE setList \
sensitivity:slider,0,1,9 $\DEVICETOPIC/set {"sensitivity":$EVTPART1}\
illuminance_sampling:slider,1,1,480 $\DEVICETOPIC/set {"illuminance_sampling":$EVTPART1}
deletereading -q DEVICE (?!associatedWith|IODev).*
attr DEVICE model zigbee2mqtt_Rain_Illuminance_Sensor
setreading DEVICE attrTemplateVersion 20251122
, Laufzeiterfahrung habe ich aber noch nicht.defmod MyDownloader dummy
attr MyDownloader userattr Filepath
attr MyDownloader readingList job
attr MyDownloader devStateIcon {\
\
#Lade mehrere Dinge herunter, mach einfach großzügige Pausen:\
my $cmd = <<"CMD";;\
set $name job Filepath="/opt/fhem/www/tasmota.bin" https://ota.tasmota.com/tasmota/release/tasmota.bin;; sleep 5;;\
set $name job Filepath="/opt/fhem/www/tasmota.bin.gz" https://ota.tasmota.com/tasmota/release/tasmota.bin.gz;; sleep 5;;\
set $name job Filepath="/opt/fhem/www/tasmota-minimal.bin.gz" https://ota.tasmota.com/tasmota/release/tasmota-minimal.bin.gz;; sleep 5;;\
set $name job Filepath="/opt/fhem/www/tasmota32-zbbrdgpro.bin" https://ota.tasmota.com/tasmota32/release/tasmota32-zbbrdgpro.bin\
CMD\
\
#Zeichen für GET-Request tauschen, URL-encoden:\
$cmd =~ s/\n/ /g;;\
$cmd =~ s/\s+/ /g;;\
$cmd = urlEncode($cmd);;\
$cmd =~ s/\+/%%20/g;;\
\
#einfacher Link zum anklicken in FHEMWEB um den CMD oben auszulösen:\
#my $link = "<a href=\"${FW_ME}?XHR=1${FW_CSRF}&cmd=${cmd}\">📂</a>";;\
\
#Mit JS wird verhindert, dass der Browser navigiert:\
my $link = "<a href=\"#\" onclick=\"fetch('${FW_ME}?XHR=1${FW_CSRF}&cmd=${cmd}');; return false;;\">📂</a>";;\
\
return "<div>". ReadingsVal($name, "result", "???") ." $link</div>";;\
}
attr MyDownloader setList job
attr MyDownloader userReadings result:job:.* {\
my $hash = $defs{$name};;\
my $job = ReadingsVal($name, "job", 'https://fhem.de/www/images/default/fhemicon.png');;\
my $path = AttrVal($name, "Filepath", "/opt/fhem/www/download.bin");;\
\
if ($job =~ s/(?:Filepath|Dateipfad)="(.*?)"//) {\
$path = $1;;\
}\
\
my $fnFct = sub {\
my ($param, $err, $data) = @_;;\
\
my $len = $data ? length($data) : 0;;\
my $error = $err ? $err : FileWrite($path, $data);;\
\
readingsBeginUpdate($hash);;\
readingsBulkUpdate($hash, "busy", 0, 1);;\
readingsBulkUpdate($hash, "result", "saved $len Bytes", 1) if !$error;;\
readingsBulkUpdate($hash, "result", "error ($error, $err)", 1) if $error;;\
readingsEndUpdate($hash, 1);;\
};;\
\
if ( ReadingsVal($name, "busy", 0) == 0 ) {\
readingsBulkUpdate($hash, "busy", 1, 1);;\
$job =~ s/^\s+|\s+$//g;;\
my $param = {\
url => $job,\
timeout => 10,\
hash => $hash,\
method => "GET",\
callback => $fnFct\
};;\
HttpUtils_NonblockingGet($param);;\
return "download job started";;\
}\
\
return;;\
}