defmod MQTT_Worx_Ueberwachung monitoring MQTT_Worx:disconnected MQTT_Worx:opened
attr MQTT_Worx_Ueberwachung errorFuncAdded {fhem("set MQTT_Worx connect");;
fhem("set TelegramBot message Error: MQTT_Worx disconnected! Versuche reconnect.")}
attr MQTT_Worx_Ueberwachung errorWait 1200
attr MQTT_Worx_Ueberwachung room Garten
attr MQTT_Worx_Ueberwachung warningFuncAdded {fhem("set MQTT_Worx connect");;
fhem("set TelegramBot message Warning: MQTT_Worx disconnected! Versuche reconnect.")}
attr MQTT_Worx_Ueberwachung warningWait 600
Zitat von: Christoph.A am 20 Mai 2024, 00:20:03Hallo,Hallo, ich würde mich sehr über eure Antworten freuen - vielen lieben Dank
ich möchte den SoC über ein at bis 11:00 auf 60% begrenzen. Aber irgend wie bekomme ich es über ein set nicht hin.define soc_redused at *06:30:00 { if (($month >= 5) || ($month <= 9)) { fhem("set RCT power_mng.soc_max 0.60") }}
attr soc_redused room setSoc
define soc_standard at *11:00:00 { if (($month >= 5) || ($month <= 9)) {fhem("set RCT power_mng.soc_max 0.95") }}
attr soc_standard room setSoc
Ich brauche einen Tipp, wo mein Fehler liegt. Danke.
Die Parameter von rctclient habe ich mal in ein Excel mit PowerQuery eingelesen. Damit kann man sich beliebige device_readings_json zusammenbauen und bestehende auswerten.
ZitatIch wuerde die BitSet Tags durchlesen, und alles mit dem gleichen Label (^[+0-9]+ wird ignoriert) zusammenfassen.
Damit wuerde es folgende Felder geben:
Zitat<Value bitmask="7" genre="config" index="9" label="9_Slave Mode" size="1" type="bitset" value="7">Die drei Label finde ich nirgens (<Label>Central unit checking</Label>),(<Label>Slave</Label>),(<Label>Stupid</Label>).
<Help>
"Stupid" mode ( bit 2 = 1 ):
- has higher priority then slave mode.
- LED is permanently on ( for simple power wall switch controlling ).
Slave mode ( bit 0 = 1 ):
- only if included in Z-Wave network
- useful for controlling via third-party sensor
- LED is directly controlled via Z-Wave, internal sensors are not used for controlling it
Central unit checking ( bit 1 = 1 ): ( useful especially for controlling via gateway )
When slave bit is 0:
- device signalises fail of lifeline connection ( if this bit is zero, fail of lifeline connec-
tion is not signalised )
When slave bit is 1:
- device checks presence of Z-Wave device in lifeline group ( gateway ). If it is not
present for 2 minutes ( testing repeatedly every 30 seconds ) device switches
to normal mode in the same way as after the end of local disabled mode
( ON_BEHAVIOUR )
- the device checks every 1 minute for recovery of Lifeline connection.
- if no lifeline specified - it works in normal mode
</Help>
<BitSet id="1">
<Label>Slave</Label>
<Help>Slave Mode</Help>
</BitSet>
<BitSet id="2">
<Label>Central unit checking</Label>
<Help>Central Mode</Help>
</BitSet>
<BitSet id="3">
<Label>Stupid</Label>
<Help>Stupid Mode</Help>
</BitSet>
</Value>
sub decode_j {
# decode_json() croaks on error, this function should prevent fhem crashes
# https://metacpan.org/pod/Perl::Critic::Policy::ErrorHandling::RequireCheckingReturnValueOfEval
use JSON qw(decode_json);
my $maybe_json = shift;
my $data;
if ( eval { $data = decode_json($maybe_json); 1 } ) { return $data }
Log3(undef, 1, "JSON decoding error, >$maybe_json< seems not to be valid JSON data: $@");
return q{}
}
sub deg2rad {
# degree nach radiant
# https://www.perlmonks.org/?node_id=221674
my $pi = 3.1415926535897932384626433832795;
($_[0]/180) * $pi
}
sub active_power {
# active_power (Spannung, Strom, Phasenwinkel)
$_[0] * $_[1] * cos(deg2rad($_[2]))
}
Anstatt json2nameValue($EVENT) rufe ich sgm_r($EVENT) auf. Die Readings kommen damit gleich ohne Vorsilbe zurück:sub sgm_r {
my $EVENT = shift;
my $hashref = decode_j ($EVENT);
my $key;
# nimm die referenz mit Hash
for (sort keys %$hashref){
if ( ref $hashref->{$_} eq 'HASH'){$key=$hashref->{$_}}
}
$key->{"power_sum"} = 0;
for (1..3) {
$key->{"power_L$_"} = ($_ == 1) ? active_power ( $key->{'Voltage'},$key->{'Current'},$key->{'phase_angle_L1'} ) :
active_power ( $key->{"Voltage_L$_"},$key->{"Current_L$_"},$key->{"phase_angle_L$_"} );
$key->{"power_sum"} = $key->{"power_sum"} + $key->{"power_L$_"};
}
return \%{$key};
}
Man kann das auch "außerhalb" verwenden; Beispiel in der FHEM Kommandozeile:{
my $r;;
my $dev = 'MQTT2_tasmota_8DC170';;
for (1..3) {
$r="$r power_L$_ = " . active_power (ReadingsVal($dev,"SGM_Voltage_L$_",ReadingsVal($dev,"SGM_Voltage","")),ReadingsVal($dev,"SGM_Current_L$_",ReadingsVal($dev,"SGM_Current","")),ReadingsVal($dev,"SGM_phase_angle_L$_","") )."\n"
}
return $r
}
Die Summe weicht allerdings immer etwas von der Summe ab die Zähler direkt liefert. Sicher lassen sich diese Differenzen irgendwie erklären.