Hauptmenü

Geräteliste in FHEM

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

Vorheriges Thema - Nächstes Thema

__benny__

Hallo,

ich habe folgendes anliegen:
Alle HM-CC-RT-DN (nur Kanal 4) auf "controlManu on" setzen um eine Wartung (Entlüften) der Heizungsanlage durchzuführen
Alle HM-CC-RT-DN (nur Kanal 4) auf "controlParty" setzen um "unverheizt" in den Urlaub zu fahren

Dazu müsste mir FHEM eine Liste der "bekannten" HM-CC-RT-DN ausgeben. Realisiert habe ich das nun wie folgt:

Eine Datei 99_ThermoMainentanceUtils.pm angelegt.
Darin habe ich eine globale Variable als Array definiert.

my @thermostates;

Mittels der nachfoglenden Funktion bekomme ich eine Liste aller Kanale aller "bekannten" HM-CC-RT-DN. Diese filtere ich nach Kanal 4.

sub ThermoGetAll() {

# clear current array of devices
@thermostates = ();

# get all HM-CC-RT-DN devices and channels
my @devices = devspec2array("model=HM-CC-RT-DN");

for my $device (@devices) {
# only channel 4 (Clima) is important
if ($device =~ m/_Clima$/) {
push(@thermostates, ThermoCreateRecord($device));
}
}
}

sub ThermoCreateRecord($) {

my ($device) = @_;

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


Durch das "push" werden die "gesuchten" Kanäle als "record" in das Array abgelegt. Dadurch kann ich auch die Temperatur und den Betriebsmodus pro Gerät vor der Wartung speichern.

Starten tue ich dann die Wartung durch

sub ThermoMaintenanceOn() {

foreach my $record (@thermostates) {

# get current temperature setting of device
$record->{temperature} = fhem("get $record->{device} param desired-temp");

# get current mode of device
$record->{mode} = fhem("get $record->{device} param controlMode");

# open valve full
fhem("set $record->{device} controlManu on");

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


Beenden kann ich die Wartung mittels

sub ThermoMaintenanceOff() {

foreach my $record (@thermostates) {

# restore mode of device
fhem("set $record->{device} controlMode $record->{mode}");

# restore temperature setting of device
fhem("set $record->{device} desired-temp $record->{temperature}");

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


Für den Urlaub gibt es

sub ThermoVacation($$$$$) {

my ($temperature, $dateStart, $dateEnd, $timeStart, $timeEnd) = @_;

# map time to 00 or 30, others are not accepted by device
$timeStart =~ s/\:[0-2].$/:00/;
$timeStart =~ s/\:[3-5].$/:30/;
$timeEnd =~ s/\:[0-2].$/:00/;
$timeEnd =~ s/\:[3-5].$/:30/;

foreach my $record (@thermostates) {

# set "party/vacation" mode
fhem ("set $record->{device} controlParty $temperature $dateStart $timeStart $dateEnd $timeEnd");
}
}


Alles funktioniert wie es soll, nur werde ich das Gefühl nicht los, dass es etwas ähnliches eigentlich schon geben müsste oder?
Daher meine Frage: Gibt es in FHEM hierfür schon eine Funktionalität die ich "übersehen" habe?
-> Wenn ja bitte einen Schubs zur entsprechenden Doku.


Hollo

Naja, in der Regel hat man wahrscheinlich irgendein Schema für die Bezeichnung.

Damit lässt sich z.B. bei mir mit einem einzelnen
fhem ("set .*_Heizung_Clima controlManu on")
Dein Entlüften vorbereiten und sinngemäß auch wieder beenden.
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"

CoolTux

Dein Clima Kanal kannst aber auch einfacher finden

:FILTER=chanNo=04
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

__benny__

@Hollo:
naja das
..._Clima
ist ja vom System vorgegeben, damit könnte ich arbeiten. Mir ist nur nicht klar wie ich dein
fhem("set .*_Heizung_Clima controlManu on")
wieder rückgängig mache?
Ein einfaches
fhem("set .*_Heizung_Clima controlManu off")
langt da nicht. Ich muss mir ja irgendwie merken wie die Thermostate vorher eingestellt waren.

@CoolTux:
Wo genau würde dieser Filter angewendet werden? Etwa so?
my @devices = devspec2array("model=HM-CC-RT-DN:FILTER=chanNo=4");

Danke und Gruß

CoolTux

Zitat von: __benny__ am 08 November 2017, 08:12:42
@Hollo:
naja das
..._Clima
ist ja vom System vorgegeben, damit könnte ich arbeiten. Mir ist nur nicht klar wie ich dein
fhem("set .*_Heizung_Clima controlManu on")
wieder rückgängig mache?
Ein einfaches
fhem("set .*_Heizung_Clima controlManu off")
langt da nicht. Ich muss mir ja irgendwie merken wie die Thermostate vorher eingestellt waren.

@CoolTux:
Wo genau würde dieser Filter angewendet werden? Etwa so?
my @devices = devspec2array("model=HM-CC-RT-DN:FILTER=chanNo=4");

Danke und Gruß

Bei mir geht das so

{ devspec2array("model=HM-CC-RT-DN:FILTER=chanNo=04") }


Getestet direkt in der Eingabezeile von FHEMWEB
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Hollo

Zitat von: __benny__ am 08 November 2017, 08:12:42
...Ich muss mir ja irgendwie merken wie die Thermostate vorher eingestellt waren.
Mehr oder weniger.   ;D
Wenn sie sonst auf "auto" stehen, setzt Du sie halt einfach wieder auf auto und die arbeiten direkt mit dem gültigen Wert der Temp-Liste.
Bei "manual" setzt Du sie einfach auf einen "passenden" Temperaturwert; Du wirst das Entlüften ja nicht mitten in der Nacht machen wollen.
fhem("set .*_Heizung_Clima controlManu 20.0")
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__

@Hollo
eigentlich will ich nach dem Entlüften nicht nochmal 10 Heizkörper händisch anfassen, das widerspricht irgendwie dem Wort "Automatisierung"  ::)  ;D

@CoolTux
klappt leider nicht, das Ergebnis ist dann kein Array sondern eine Zahl?


Naja dann scheint es keinen "natürlichen" Weg zu geben - Danke an alle Antwortenden -> gelöst

Hollo

Zitat von: __benny__ am 08 November 2017, 19:30:05
@Hollo
eigentlich will ich nach dem Entlüften nicht nochmal 10 Heizkörper händisch anfassen, das widerspricht irgendwie dem Wort "Automatisierung"  ::)  ;D
Was
Was ist an 1 Befehl händisch und umständlich?  :o

Dein Weg ist doch okay, wenn er funktioniert.
Es gibt meist mehrere Varianten und selten die Ideallösung.

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"

CoolTux

Zitat von: __benny__ am 08 November 2017, 19:30:05
@Hollo
eigentlich will ich nach dem Entlüften nicht nochmal 10 Heizkörper händisch anfassen, das widerspricht irgendwie dem Wort "Automatisierung"  ::)  ;D

@CoolTux
klappt leider nicht, das Ergebnis ist dann kein Array sondern eine Zahl?


Naja dann scheint es keinen "natürlichen" Weg zu geben - Danke an alle Antwortenden -> gelöst

Ja natürlich ist es eine Zahl. Weil die Liste in ein Array gelesen wird. Und das return Dir nur die Anzahl der Elemente zurück gibt. Du musst das ganze dann halt wie ein Perl Array behandeln.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

__benny__

@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".

@CoolTux

Mit folgendem Code sehe ich die Log-Meldung

sub ThermoGetAll() {

# clear current array of devices
@thermostates = ();

# get all HM-CC-RT-DN devices and channels
my @devices = devspec2array("model=HM-CC-RT-DN");

for my $device (@devices) {

# only channel 4 (Clima) is important
if ($device =~ m/_Clima$/) {

{ Log 1, "ThermoGetAll: $device" };
push(@thermostates, ThermoCreateRecord($device));
}
}
}


damit leider nicht

sub ThermoGetAll() {

# clear current array of devices
@thermostates = ();

# get all HM-CC-RT-DN devices and channels
my @devices = devspec2array("model=HM-CC-RT-DN:FILTER=chanNo=4");

for my $device (@devices) {

            { Log 1, "ThermoGetAll: $device" };
            push(@thermostates, ThermoCreateRecord($device));
}
}


Mal noch eine andere Frage zum Thema:
Wenn ich die Kanäle der Geräte einem speziellen "room" zuteile, dann müsste ich mir doch alle Geräte dieses Raums geben lassen können. Das müsst ich zwar konfigurieren, dafür könnte ich allerdings bestimmte Geräte von der Aktion ausschließen oder?



CoolTux

Benny! Konzentration und bisschen nachschauen bitte!

04
Man(n) beachte die 0 vor der vier

;D  ;D  ;D



Grüße
Leon
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

DeeSPe

Bissel viel Durcheinander! ;)
sub ThermoGetAll() {

# clear current array of devices
# @thermostates = ();
        # hier fehlte ein my
        my @thermostates;

# get all HM-CC-RT-DN devices and channels
my @devices = devspec2array("model=HM-CC-RT-DN:FILTER=chanNo=04");

# for my $device (@devices) {
        # hier sollte foreach stehen
foreach my $device (@devices) {

            { Log 1, "ThermoGetAll: $device" };
            push(@thermostates, ThermoCreateRecord($device));
}
}


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

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

__benny__

@Dan
nöp fehlte nicht, nur ist @thermostates außerhalb der "sub" global definiert, sonst wäre das ja weg am Ende der sub und wäre sinnfrei... -> siehe initialen Post

@CoolTux
verdammt, die "0" bringts :-) Danke

DeeSPe

Zitat von: __benny__ am 09 November 2017, 18:17:16
@Dan
nöp fehlte nicht, nur ist @thermostates außerhalb der "sub" global definiert, sonst wäre das ja weg am Ende der sub und wäre sinnfrei... -> siehe initialen Post

@CoolTux
verdammt, die "0" bringts :-) Danke

Global würde ich sowas aber lieber nicht definieren.
Was spricht dagegen die Variable an die jeweiligen Funktionen weiterzugeben?

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