Hauptmenü

Geräteliste in FHEM

Begonnen von __benny__, 07 November 2017, 21:41:04

Vorheriges Thema - Nächstes Thema

__benny__

@Dan
naja irgendwo muss ich es vorhalten. In der Sprache "C" würde ich diese Variable in der main-Funktion definieren und genau wie du sagst an jede Funktion als Pointer übergeben. Wäre ein "dummy" in fhem.cfg dazu äquivalent?
Oder wäre die "globale" Definition schon ok nur die Übergabe an einzelne Funktionen fehlt noch? Wie macht man sowas korrekt in Perl?

DeeSPe

Wieso musst Du es denn "vorhalten"?

Mit:
my @devs = devspec2array("model=HM-CC-RT-DN:FILTER=chanNo=04");
hast Du sofort immer "lokal" ein Array mit den Namen aller Devices die zu der devspec gehören.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

Ich bin kein "Perl-Profi".
Angewöhnt habe ich mir global nur Konstanten zu setzen.

z.B.:
my $thermostats = "model=HM-CC-RT-DN:FILTER=chanNo=04";

Und dann z.B.:
sub my_func {
  my @devs = devspec2array($thermostats);
}


Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Thorsten Pferdekaemper

Hi,
soweit ich das verstehe, ist das "Problem" sich den alten Zustand zu merken und dann später wieder zurückzuholen. Ich würde da ganz "brutal" das ganze am Device selbst machen. Also in etwa so:

$main::defs{$device}{bennysOldDesiredTemp} = ReadingsVal($device, "desired-temp",22);

...und später

fhem("set ".$device." desired-temp ".$main::defs{$device}{bennysOldDesiredTemp});
delete $main::defs{$device}{bennysOldDesiredTemp};

Man sieht dann sogar in den Internals, was man getrieben hat.

Wenn das ganze einen FHEM-Neustart überleben soll, dann kann man das auch mit Readings machen:

readingsSingleUpdate($main::defs{$device}, "bennysOldDesiredTemp", ReadingsVal($device, "desired-temp",22), 1);

...und später

fhem("set ".$device." desired-temp ".ReadingsVal($device, "bennysOldDesiredTemp",22));
fhem("deletereading ".$device." bennysOldDesiredTemp");

Das mit den Deletes ist natürlich optional.
Ich habe das nicht ausprobiert...
Gruß,
   Thorsten

FUIP

__benny__

Vorhalten, weil ich mir ja die Zustände der Geräte merken will bevor ich temporär die Konfiguration überschreibe um diese dann nach der Wartung wieder so einzustellen wie diese vor der Wartung eingestellt waren.

mit

push(@thermostates, ThermoCreateRecord($device));


wird ja die

sub ThermoCreateRecord($) {

my ($device) = @_;

# { Log 1, "ThermoCreateRecord: \$device: $device" };

my $thermostate = {
device => $device,
temperature => "0.0",
mode => "auto"
}
}


In dieser Struktur ist dann Platz für die Elemente der Konfiguration die überschreiben werden - konrekt so:

sub ThermoMaintenanceOn() {

foreach my $record (@thermostates) {

# get current temperature setting of device
$record->{temperature} = fhem("get $record->{device} param desired-temp"); # <--- hier wird die aktuell eingestellte Temperatur ausgelesen

# get current mode of device
$record->{mode} = fhem("get $record->{device} param controlMode"); # <--- hier wird der aktuell eingestellte Bedienmodus ausgelesen

# { Log 1, "ThermoMaintenanceOn: \$device=$record->{device} : $record->{temperature} : $record->{mode}" };

# open valve full
fhem("set $record->{device} controlManu on"); # <--- hier wird die Einstellung überschrieben

# update device immediate
fhem("set $record->{device} burstXmit");
}
}


Jetzt kann ich die Wartung durchführen und wenn ich damit fertig bin, dann brauche ich nur noch den Button anklicken der

sub ThermoMaintenanceOff() {

foreach my $record (@thermostates) {

# { Log 1, "ThermoMaintenanceOff: \$device=$record->{device} : $record->{temperature} : $record->{mode}" };

# restore mode of device
fhem("set $record->{device} controlMode $record->{mode}"); # <--- hier wird der gemerkte Bedienmodus restauriert

# restore temperature setting of device
fhem("set $record->{device} desired-temp $record->{temperature}"); # <--- hier wird die gemerkte Temperatur restauriert

# update device immediate
fhem("set $record->{device} burstXmit");
}
}

aufruft und alles ist so, als hätte ich nie etwas geändert.

Hollo

Zitat von: __benny__ am 09 November 2017, 07:08:34
@Hollo
Naja ich muss diesen zusätzlich in die Console eingeben, nachdem ich mir den Namen vom Device gesucht habe. Schließlich ist ja nicht klar, dass immer das gleiche Gerät gerade im Modus "Manu" ist. Mit der momentanen Lösung heißt es "Feuern-und-vergessen".
Das kannst Du damit genauso.   :)
FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

__benny__

#21
@Hollo
Ich kann deinen Ansatz nicht nachvollziehen. Wärst du so nett mal Schritt für Schritt darzulegen wie das gehen soll? Also was muss ich alles tun um ein beliebiges Gerät mit deiner Methode so einzustellen wie es vor der Wartung war.

@Thorsten:
Interessant, leider stecke ich noch nicht so tief in FHEM drin, um deine Ausführungen direkt verstehen zu können.

Das legt eine neue Variable (Reading) "bennysOldDesiredTemp" am Gerät an oder? (Wo steht denn das in der Referenz?)

$main::defs{$device}{bennysOldDesiredTemp}


Das müsste dann also so in die sub

sub ThermoMaintenanceOn($) {

    my ($device) = @_;

    $main::defs{$device}{bennysOldDesiredTemp} = ReadingsVal($device, "desired-temp",22); # <-- aktuelle Temperatur lesen, falls Fehlschlag dann "22°C" annehmen
    $main::defs{$device}{bennysOldcontrolMode} = ReadingsVal($device, "controlMode",auto); # <-- aktuellen Modus lesen, falls Fehlschlag dann "auto" annehmen

#   { Log 1, "ThermoMaintenanceOn: \$device=$record->{device} : $record->{temperature} : $record->{mode}" };

    # open valve full
    fhem("set $record->{device} controlManu on"); # <--- hier wird die Einstellung überschrieben

    # update device immediate
    fhem("set $record->{device} burstXmit");
}

Wie würde ich dass denn in fhem.cfg aufrufen um alle benötigten Geräte zu erwischen, also nur die _Clima?