Hallo.
Ich habe bei jedem übermitteltem Befehl zwei Logeinträge:
{"time":"2025-02-12T20:43:58.06617431+01:00","level":"INFO","msg":"trying to set default power","device":"0PVP50Zxxxxxx","power":259}
{"time":"2025-02-12T20:44:00.094286827+01:00","level":"INFO","msg":"set default power","device":"0PVP50Zxxxxxx","power":259}
Ich habe schon im MQTT devide und im MQTT2 server auf verbose 0 gestellt.
Es ändert sich nichts. Ok auf 5 wird noch mehr, aber ganz abschalten funktioniert nicht.
Der Befehl wird über ein Notify ausgeführt. Auch das habe ich auf verbose 0 gestellt. Es geht nicht weg.
Kann mir jemand sagen was ich hier falsch mache ?
Nach, dann zeig uns doch bitte das List vom notify.
Grüße Jörg
PS: Lies doch bitte im https://forum.fhem.de/index.php?topic=71806.0 , wie man Anfragen stellt. Das wäre schön.
Ich bin eher davon ausgegangen das es noch einen "Schalter" wie verbose gibt.
Internals:
CFGFN
DEF haus.stromzaehler:power:.* {
my $soc = ReadingsNum("NOAH2000", "soc", "0");
my $disLimit = ReadingsNum("NOAH2000", "discharge_limit", "0");
my $prev_shellyplug = ReadingsVal("Sh_BKWShellyPlug", "state", "");
my $noahmqtt = ReadingsVal("du_noah_mqtt", "state", "");
my $solar_w = ReadingsNum("NOAH2000", "solar_w", "0");
my $strom = ReadingsNum("haus.stromzaehler", "power", "0");
my $prev_output_set = ReadingsNum("NOAH2000", "output_power_w", "0");
my $status = ReadingsVal("NOAH2000", "status", "offline");
my $output_set = 0;
my $benutzenTelegram = ReadingsVal("du_Heizen_Telegram", "state", "");
my $stunde = POSIX::strftime("%H",localtime(time));
my $info = 0;
my @Zeit_abend = (18,19,20,21,21,22,22,21,20,19,18,18); #pro Monat laut Auswertung Grafik
my @Zeit_morgen = (8,7,6,5,4,4,4,5,5,6,7,8); #pro Monat
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
my $shellyplug = "off"; # ShellyPlug
my $threshold = 5; # Reduktionsschwelle für den output_set
# Zeitfenster für den aktuellen Monat bestimmen
my $zeit_morgen = $Zeit_morgen[$mon];
my $zeit_abend = $Zeit_abend[$mon];
# Regelung nur ausführen, wenn Status "online" ist und noahmqtt "on" ist
if ($status eq "online" && $noahmqtt eq "on") {
# Regelung nur im erlaubten Zeitfenster
# if ($stunde >= $zeit_morgen && $stunde <= $zeit_abend) {
if ($stunde >= $zeit_morgen && $soc >= 60) {
if ($soc > $disLimit) {
# Ausgabe an den Wechselrichter abhängig vom Stromverbrauch im Haus
my $max_output = ($soc > 80) ? 400 : 300;
$output_set = ($strom > $max_output) ? $max_output : $strom;
# Reduktion des output_set um den threshold-Wert
$output_set = $output_set - $threshold;
$output_set = 0 if $output_set < 0; # Sicherstellen, dass der Wert nicht negativ wird
} else {
# Akku unter Mindeststand, keine Energieentnahme
$output_set = 0;
}
}
# Wenn der SOC abends unter 60% fällt, setze output_set fest auf 50
if ($stunde >= $zeit_abend && $soc < 60) {
$output_set = 50;
}
# Wenn der SOC unter disLimit fällt, setze output_set zusätzlich auf 0
if ($soc <= $disLimit) {
$output_set = 0; # Keine Energie mehr an den Wechselrichter
}
# Berechnungen für ShellyPlug
if ($shellyplug eq "off" && $stunde >= $zeit_morgen) {
if (($soc >= 30 && $solar_w > 400) || $soc > 80) {
$shellyplug = "on"; # Einschalten bei SOC >= 30% und Solar > 400W oder SOC > 80%
}
}
# Abends bleibt ShellyPlug an, solange Akku nicht unter disLimit fällt
if ($stunde >= $zeit_abend && $soc > $disLimit) {
$shellyplug = "on";
} elsif ($soc <= $disLimit) {
$shellyplug = "off"; # Abschalten, wenn Akku unter disLimit fällt
}
# Ausgabe von Befehlen, wenn sich Werte geändert haben
if ($output_set != $prev_output_set) {
fhem "set myBroker publish noah2mqtt/0PVP50Zxxxxxx/parameters/set {\"output_power_w\":$output_set}";
if ($benutzenTelegram eq "on"){
fhem "set telegram send \@xx SOC $soc% setze output_power auf $output_set W / Strom = $strom W ";
}
}
# ShellyPlug-Befehl nur ausführen, wenn sich der Zustand geändert hat
if ($shellyplug ne $prev_shellyplug) {
fhem "set Sh_BKWShellyPlug $shellyplug";
$prev_shellyplug = $shellyplug;
if ($benutzenTelegram eq "on"){
fhem "set telegram send \@xx SOC $soc%, Zeit $stunde, Solar: $solar_w, schalte ShellyPlug $shellyplug";
}
}
}
}
FUUID 67ace90b-f33f-b7a0-46a9-8165140933e72c70
NAME no_NOAH2000_steuerung2
NOTIFYDEV haus.stromzaehler
NR 566
NTFY_ORDER 50-no_NOAH2000_steuerung2
REGEXP haus.stromzaehler:power:.*
STATE 2025-02-12 21:19:58
TRIGGERTIME 1739391599.01483
TYPE notify
eventCount 9
READINGS:
2025-02-12 20:13:50 state active
2025-02-12 21:19:58 triggeredByDev haus.stromzaehler
2025-02-12 21:19:58 triggeredByEvent power: 359
Attributes:
disable 0
disabledAfterTrigger 30
room NOAH2000
verbose 0
OK,
Du machst einen fhem(<befehl>, [0|1]); ohne den optionalen zweiten Parameter. Sofern nicht gesetzt, schreibt fhem(), unabhängig Deiner verbose Level, ins Log. Also einfach den optionale Paramter auf 1 setzen und Ruhe ist.
Grüße Jörg
PS: Du rufst die Sub fhem ohne () auf. Wir hatten letzten das Problem, das es wohl ab einer gewissen Perl Version nicht mehr tolleriert wird
Ah vielen Dank !
Ich hab schon die ganze Zeit gesucht aber nichts gefunden.
Den fhem Befehl kenne ich nur so, habe dazu aber auch nichts gefunden.
Also ist das so richtig ?
fhem ("set myBroker publish noah2mqtt/0PVP50Zxxxxx/parameters/set {\"output_power_w\":$output_set}",1);
Zitat von: Loctite am 12 Februar 2025, 21:47:53aber auch nichts gefunden.
Steht im Abschnitt Perl specials in der Commandref.
ZitatBemerkung: Wenn diese Funktion einen wert zurück liefert, wird dieser in der allgemeinen Logdatei gespeichert.. Benutzen sie "1" als zweites Argument um dieses speichern zu verhindern. Sinnvoll ist dieses Argument bei der Abfrage von Werten mittels "get...".
Das besondere bei Dir scheint noch, dass der (einer der?) set Befehl(e) etwas zurück gibt.
Anmerkung:
Einen solch langen "Roman" an perl code sollte man nicht unbedingt direkt in das DEF des notify schreiben. Man kann den Code in eine Funktion in 99_myUtils.pm auslagern und dann im notify diese Funktion aufrufen. Das erhöht die Wartbarkeit einer FHEM Installation erfahrungsgemäß sehr.
Ja an 99_myUtils.pm habe ich auch schon gedacht. Nur komme ich so erst mal besser zurecht, da ich auch noch über mein Smartphone Änderungen vornehme.
Danke für die schnelle Hilfe !
Gut das nun ruhe im Log ist...das wurde sehr schnell sehr viel und da bekomme ich dann etwas Panik wenn ich das nicht beheben kann :))
Hallo.
Es hat gestern aufgehört, weil mein Skript nichts mehr gesendet hat.
Dann ging es aber wieder los.
Ich habe zuerst alles noch mal auf verbose 0 gesetzt, aber ohne Änderung.
Dann habe ich mir noch mal die mqtt Applikation angeschaut und gesehen das dort auch eine Möglichkeit besteht einen Log Level einzustellen.
Diesen habe ich nun auf WARN gestellt, was die zweit niedrigste Log Stufe ist.
Nun ist wirklich Ruhe !
Daraufhin hab ich alle verbose 0 zurück auf 3 gestellt. Ich möchte ja in meinem Skript auch etwas sehen wenn ich da mal wieder etwas verhaue.
Und ja, es bleibt nun zum Glück so...war jetzt schon etwas am verzweifeln.