[gelöst] PowerState wird nicht richtig gelesen

Begonnen von Claus1985, 30 August 2019, 16:08:18

Vorheriges Thema - Nächstes Thema

Claus1985

Hi Zusammen,

möchte den PowerState ("BSH.Common.EnumType.PowerState.On" oder "BSH.Common.EnumType.PowerState.Off") als 1 bzw. 0 an Loxone übertragen.
Dafür habe ich ein Programm in myUtils gepackt das enthält u.a.:

# Gerätezustand (an oder aus)
my ($device) = @_;
my ($PowerState) = @_;
my $PowerState = ReadingsVal("$device","BSH.Common.Setting.PowerState","-1");
if ($PowerState eq "'BSH.Common.EnumType.PowerState.Off'") {
$PowerState = 0;
}
elsif ($PowerState eq "'BSH.Common.EnumType.PowerState.On'") {
$PowerState = 1;
}


Allerdings wird immer nur 1 übertragen egal wie der Status ist. habe es auch schon ohne Hochkomme in den Strings versucht also:

# Gerätezustand (an oder aus)
my ($device) = @_;
my ($PowerState) = @_;
my $PowerState = ReadingsVal("$device","BSH.Common.Setting.PowerState","-1");
if ($PowerState eq "BSH.Common.EnumType.PowerState.Off") {
$PowerState = 0;
}
elsif ($PowerState eq "BSH.Common.EnumType.PowerState.On") {
$PowerState = 1;
}


Das hat aber auch nur zu 1 in der Übertragung geführt.
Ich bin erst auf das Hochkomma gekommen, da in FHEM im Gerät der Status PowerState mit Anführungszeichen
angezeigt wird im Gegensatz zu DoorClosed usw. (siehe Screenshot).

Habt Ihr eine Idee wo mein Fehler liegt?

Danke und Gruß,

Claus

Otto123

#1
Hallo Claus,

ich versteh die Logik von deiner Sub nicht. Aber ich würde am Ende noch ein return $PowerState machen. Vielleicht ist das auch drin, du zeigst ja leider nur ein Fragment deiner Sub. Das ist für die Hilfe nicht hilfreich :)

Ich weiß auch nicht wie die Sub aufgerufen wird, ich würde ja auch so etwas vermuten:
my ($device,$PowerState) = @_;
Anstatt der beiden Übergabe Zeilen am Anfang wo du alles zusammen identisch in zwei Variablen gibst  :-\

Und Du setzt $PowerState in der gleichen Zeile wo du es auch abfragst?  ???
Wie gesagt ich versteh den Code nicht, aber das will nichts heißen.  ;)

Ansonsten bau doch log Ausgaben ein:
Log 1, "Powerstate: $PowerState";

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Claus1985

Hi Otto,

danke für die schnelle Antwort. Vielleicht hilft es den ganzen Code zu sehen:

#SpuelmaschineToLoxone
sub SpuelmaschineToLoxone($)
{
# Gerätezustand (an oder aus)
my ($device) = @_;
my ($PowerState) = @_;
my $PowerState = ReadingsVal("$device","BSH.Common.Setting.PowerState","-1");
if ($PowerState eq "'BSH.Common.EnumType.PowerState.Off'") {
$PowerState = 0;
}
elsif ($PowerState eq "'BSH.Common.EnumType.PowerState.On'") {
$PowerState = 1;
}

# Gerätezustand Tür auf oder zu)
my ($DoorState) = @_;
my $DoorState = ReadingsVal("$device","BSH.Common.Status.DoorState","-1");
if ($DoorState eq "BSH.Common.EnumType.DoorState.Open") {
$DoorState = 0;
}
if ($DoorState eq "BSH.Common.EnumType.DoorState.Closed") {
$DoorState = 1;
}

# Betriebszustand Gerät (Inaktiv / Ready / Verzögerter Start / Läuft / Pause / Aktion erforderlich / Fertig / Fehler / Abbruch)
my $OperationState = ReadingsVal("$device", "BSH.Common.Status.OperationState", -1);
my %OpSt = (
"BSH.Common.EnumType.OperationState.Inactive"         => 0,
"BSH.Common.EnumType.OperationState.Ready"                 => 1,
"BSH.Common.EnumType.OperationState.DelayedStart"         => 2,
"BSH.Common.EnumType.OperationState.Run"                 => 3,
"BSH.Common.EnumType.OperationState.Pause"                 => 4,
"BSH.Common.EnumType.OperationState.ActionRequired"         => 5,
"BSH.Common.EnumType.OperationState.Finished"               => 6,
"BSH.Common.EnumType.OperationState.Error"                 => 7,
"BSH.Common.EnumType.OperationState.Aborting"              =>  8,
);
my $state = (defined $OpSt{$OperationState}) ? $OpSt{$OperationState} : "-1";

# Gerätezustand Fernzugriff erlaubt (Ja /Nein)
my ($RemoteStartActive) = @_;
my $RemoteStartActive = ReadingsVal("$device","BSH.Common.Status.RemoteControlActive","-1");

# Gerätezustand Fernstart erlaubt (Ja /Nein)
my ($RemoteStartAllowed) = @_;
my $RemoteStartAllowed = ReadingsVal("$device","BSH.Common.Status.RemoteControlStartAllowed","-1");

# Gesamtnachricht an Loxone
UDP_Msg("192.168.178.77" , "7000" , "$device: $PowerState $DoorState $state $RemoteStartActive $RemoteStartAllowed");
}


Alle anderen Werte werden richtig übertragen nur der PowerState nicht.
Der einzige Unterschied den ich in FHEM erkennen kann sind die Anführungszeichen beim Status in den Eigenschaften des Gerätes.

Danke und Gruß,

Claus

Otto123

#3
Gut die Zeile am Anfang
my ($PowerState) = @_;
führte zu meiner Verwirrung, die ist überflüssig!
Füge doch zwischen diesse beiden Zeilen ein:

my $PowerState = ReadingsVal("$device","BSH.Common.Setting.PowerState","-1");
if ($PowerState eq "'BSH.Common.EnumType.PowerState.Off'") {


my $PowerState = ReadingsVal("$device","BSH.Common.Setting.PowerState","-1");
Log 1, "Powerstate: $PowerState";
if ($PowerState eq "'BSH.Common.EnumType.PowerState.Off'") {


Da ist noch mehr Verwirrungs Code:
my ($DoorState) = @_;
my ($RemoteStartActive) = @_;
my ($RemoteStartAllowed) = @_;
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Claus1985

Hi Otto,

danke für für die Infos, nun funktioniert es zumindest zu 90%  :)

Ich war der Meinung, dass ich die Variablen mit my xx()=@_;
deklarieren müsste (in diesem Fall als String). Habe ich da was falsch verstanden?

Das einzige was nun noch strange ist, ist dass er beim ersten Mal (z.B.
wenn das Gerät eingeschaltet wird) einen String und erst danach die Zahl überträgt:

Zitat
2019.08.31 12:23:46 3 : SpuelmaschineToLoxone return value: send SN658X06TE: "BSH.Common.EnumType.PowerState.Off" 0 1 1 1
2019-08-31 12:23:46 HomeConnect SN658X06TE BSH.Common.Setting.PowerState: "BSH.Common.EnumType.PowerState.Off"
2019.08.31 12:23:47 1 : Powerstate: BSH.Common.EnumType.PowerState.Off
2019.08.31 12:23:47 3 : SpuelmaschineToLoxone return value: send SN658X06TE: 0 0 0 1 1
2019.08.31 12:23:47 1 : Powerstate: BSH.Common.EnumType.PowerState.Off
2019.08.31 12:23:47 3 : SpuelmaschineToLoxone return value: send SN658X06TE: 0 0 0 1 1

Das ist prinzipiell nicht schlimm weil FHEM ja die richtige Nachricht schickt, dauert nur eine Sekunde länger.
Trotzdem würde mich interessieren warum das so ist.. Hast Du da eine Idee?

Danke und Gruß,

Claus

Otto123

Hallo Claus,

ja Du musst sie deklarieren, dass passiert aber mit my $variable
Also mit deinem my $variable=@_; hast Du das Übergabe Parameter Array in die $variable geschrieben.
Mit der nächsten Zeile:
my $variable= 2+4;
hast du die Variable neu initialisiert, was weiter oben drin stand ist weg und das Ergebnis steht jetzt drin. Also einmal initialisieren mit my (kann man zur Übersichtlichkeit am Anfang tun und einfach nichts hineinschreiben) und dann verwenden OHNE my!!
my $variable
$variable= 2+4;
$variable= 7+8; usw.

Zur eigentlichen Bedeutung der Übergabe und dem speziellen Arry @_ findest Du hier die Erklärung
https://perldoc.perl.org/5.30.0/perlsub.html

Zu deinem anderen Problem:
Das ist der Log Eintrag den Du eingebaut hast?
2019.08.31 12:23:47 1 : Powerstate: BSH.Common.EnumType.PowerState.Off
Das ist das Ergebnis?
2019.08.31 12:23:47 3 : SpuelmaschineToLoxone return value: send SN658X06TE: 0 0 0 1 1

Das hier ist aus meiner Sicht was ganz anderes, das wurde nicht von Deiner Sub gemacht. Da fehlt dein Log Eintrag davor? Die zweite Zeile ist kein FHEM Log Eintrag sondern irgendetwas aus STDOUT was im LOG landet. Das Datum ist anders formatiert und es fehlt der Log Level.
2019.08.31 12:23:46 3 : SpuelmaschineToLoxone return value: send SN658X06TE: "BSH.Common.EnumType.PowerState.Off" 0 1 1 1
2019-08-31 12:23:46 HomeConnect SN658X06TE BSH.Common.Setting.PowerState: "BSH.Common.EnumType.PowerState.Off"

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Claus1985

Hi Otto,

danke für die Infos! Ich lese mich da mal etwas ein in das Thema Perl.

Gruß,

Claus