[gelöst] Variablenübergabe nicht immer möglich?

Begonnen von NE555, 10 Oktober 2022, 10:17:32

Vorheriges Thema - Nächstes Thema

NE555

Guten Tag allerseits,
mir ist folgendes aufgefallen, was mich etwas irritiert.

möglich ist z.B., $dummy hier zu verwenden:

my $dummy = 'Status';
my $Status_wert = ReadingsVal($dummy, 'state', '');


nicht möglich ist, die Variable hier einzubetten:

my $dummy = 'Staubsauger_laufzeit';
fhem('set Staubsauger_laufzeit 60');
fhem("defmod Staubsauger_at at +*00:01:00 {if(ReadingsVal($dummy,'state',0)>0) {fhem('set Staubsauger_laufzeit '.(ReadingsVal('Staubsauger_laufzeit','state',0)-1))} else {fhem('delete Staubsauger_laufzeit;; delete Staubsauger_at;;') }} ");;


Habe ich etwas übersehen?
Ist das so gewollt oder könnte das noch implementiert werden?

Vielen Dank!
RPI3 SONOFF sV,Touch,S26 mit Tasmota

TomLee

Meine Vermutung, die Variable existiert in dem zweiten scope nicht mehr.

1. scope{
2. scope{}
}

Schreib doch einfach den Readingnamen direkt in die Funktion, du übergibst doch nix ?

MadMax-FHEM

EDIT: stimme TomLee zu aber um das beurteilen zu können:

Was ist "hier" und was ist "hier" (das andere "hier")?

Ich nutze sowas (in unterschiedlichen Varianten) in einer myUtils:


          fhem("defmod atTurnOffRasPiBackup at +00:00:30 {my_TurnOffRasPiBackup(\"$Device\",\"at\")}");



    fhem("defmod atWashingMachine at +00:15:00 {my_RememberWashingMachine(\"$Dummy\")}");



fhem("defmod atSetHeatingProfileCheck at +00:15:00 {my_SetHeatingProfileCheck(\"$SwitchProfile\", 1)}");


usw.

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

NE555

#3
Zitat von: MadMax-FHEM am 10 Oktober 2022, 10:35:05
EDIT: stimme TomLee zu aber um das beurteilen zu können:

Was ist "hier" und was ist "hier" (das andere "hier")?
:D stimmt, hier und hier ist unklar formuliert.
Es geht um die Übergabe der Variable $dummy im Befehl: ReadingsVal($dummy,...
und in diesem Befehl: fhem("defmod Staubsauger_at at +*00:01:00 {if(ReadingsVal($dummy,.....
Sorry.

Ich teste mal deine Ansätze mit den Aufrufen.
Danke!
RPI3 SONOFF sV,Touch,S26 mit Tasmota

MadMax-FHEM

Ist doch immer noch unklar!

Gibst du das in FhemWeb ein, in RawDef in einer myUtils, ...?

Wie wäre es den gesamten Code zu posten, nicht nur "nichtssagende Schnippsel"?

Ich nutze das auch mit ReadingsVal und: es geht...

    if(ReadingsVal($CorrespondingWindowDevice, "state", "closed") eq "open")


Wie geschrieben: in Perl in einer myUtils... Das geht sogar mit Übergabe an eine Sub aus einem fhem-Befehl heraus EDIT: dann nat. z.B. sowas {SubAufruf($DEVICE)} usw.

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

NE555

[quote author=MadMax-FHEM link=topic=129617.msg1238793#msg1238793 date=1665393079]
Ist doch immer noch unklar!

Gibst du das in FhemWeb ein, in RawDef in einer myUtils, ...?


Srry, ich benutze dies in einem notify, in FhemWeb.  RawDef ja nicht, dann müßten ja dann z.B. die Semikolons am Befehlsende doppelt da sein.

Zitat von: MadMax-FHEM am 10 Oktober 2022, 11:11:19
Wie wäre es den gesamten Code zu posten, nicht nur "nichtssagende Schnippsel"?
Nun, es sind die Zeilen, um die es geht, habe die vergessene Deklaration (my) noch ergänzt.
Ich möchte in einem Notify ein at definieren und möchte, wenn es geht, alle Bezeichnungen bei der Erstellung als Variable übergeben.

Grüße NE555
RPI3 SONOFF sV,Touch,S26 mit Tasmota

MadMax-FHEM

Es fehlt doch das ganze DRUMRUM, also warum nicht einfach list NameDesNotify posten?

Oder meinetwegen ein RawDef davon?

EDIT: steht doch hier https://forum.fhem.de/index.php/topic,71806.0.html

Wie geschrieben ich mache "sowas" an vielen Stellen, meist übergebe ich alles was ich brauche in eine Sub in myUtils, ist für mich übersichtlicher...

Auch Aussagen wie:

Zitat
möglich ist z.B., $dummy hier zu verwenden:

bzw. eher
Zitat
nicht möglich ist, die Variable hier einzubetten:

Weil was sollen wir mit diesen Aussagen anfangen?
Gibt es eine Fehlermeldung?
Steht etwas im Log (wenn das notify auslöst)?

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

MadMax-FHEM

#7
Ich weiß ja nicht genau was du da machen willst aber es erscheint mir in Summe viel zu umständlich...

Du setzt die Laufzeit auf 60

Dann prüfst du alle Minute, ob 0 oder kleiner 0 / wenn nicht -> ziehe eins ab usw.?

Also du willst, dass "irgendwas" 60min läuft?

Warum nicht einfach einen dummy, den mit set dummy on-for-timer 3600 "einschalten" und dann ein notify dummy:off -> dann sind die 60min rum?
EDIT: das Attribut useSetExtension nicht vergessen zu setzen, sonst kein on-for-timer ;)

EDIT: und deine defmod/delete erzeugen ein "rotes Fragezeichen" und überleben einen Neustart wohl nicht...

Alternativ: was willst du eigentlich tun/erreichen? Ich denke das geht bestimmt auch anders/einfacher (sogar noch einfacher als mit on-for-timer)...

Ansonsten ist halt wichtig, dass die Variable AUFGELÖST wird BEVOR das at definiert wird, ansonsten landet das $dummy im "Define" und das ist nachher im at (nat.) nicht mehr da ;)
Siehe TomLee... 8)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

NE555

#8
Hallo, habe jetzt die Lösung gefunden, vielen Dank Eure Mühe.
Ich kann nun alle Werte als Variable übergeben, danke MadMax-FHEM.

test_start.on|test_start.off
{
### erforderlich: defmod test_start dummy; attr test_start room Entwicklung; attr test_start webCmd on:off

# Variablen
my $dummy_ausgabe = 'Statusausgabe_Test';
my $dummy_at = 'Laufzeit_at';
my $dummy_zeit = 60;

if ( $EVENT eq 'on' )
{
# Zähler
fhem("defmod $dummy_ausgabe dummy; attr $dummy_ausgabe room Entwicklung; set $dummy_ausgabe $dummy_zeit");
# at
# funktioniert
#fhem("defmod $dummy_at at +*00:00:10 {if(ReadingsVal('Statusausgabe_Test','state',0)>0) {fhem('set Statusausgabe_Test '.(ReadingsVal('Statusausgabe_Test','state',0)-1))} } ");
# funktioniert
#fhem("defmod $dummy_at at +*00:00:10 {if(ReadingsVal(\"$dummy_ausgabe\",'state',0)>0) {fhem('set Statusausgabe_Test '.(ReadingsVal(\"$dummy_ausgabe\",'state',0)-1))} } ");
# funktioniert
fhem("defmod $dummy_at at +*00:00:01 {if(ReadingsVal(\"$dummy_ausgabe\",'state',0)>0) {fhem('set $dummy_ausgabe '.(ReadingsVal(\"$dummy_ausgabe\",'state',0)-1))} } ");

fhem("attr $dummy_at room Entwicklung,all");
}


if ( $EVENT eq 'off' )
{
fhem "delete $dummy_ausgabe";
fhem "delete $dummy_at";
}

}


Vielen Dank nochmals.
RPI3 SONOFF sV,Touch,S26 mit Tasmota

MadMax-FHEM

Gerne.

Ich bin ja auch ein Freund von Variablen...
...aber irgendwie ist mir der Sinn in deinem Vorgehen unklar?

Weil ob du nun EINMALIG beim Definieren des notify immer den Namen ausschreibst oder die Variable hinschreibst ist doch egal?
(ok außer du definierst das notify noch mal und noch mal und noch mal und willst immer ein anderes dummy-Device, dann musst du nat. nur einmal zu Beginn anpacken)

Und noch mal: deine defines/defmods usw. überleben keinen Neustart (oder Crash)...

Du könntest das ganze auch in eine Sub auslagern, dort mit globaler Variable oder in einem fhem-Hash den Zähler merken und dann per at alle Minute aufrufen.
Gleicher Effekt und überlebt ebenso keinen Neustart aber: kein rotes Fragezeichen 8)

Und statt das at zu löschen kann/könnte man es auch einfach "deaktivieren": set atName inactive (ebefalls kein rotes Fragzeichen) und wenn man es wieder braucht einfach wieder aktivieren set atName active (ebenfalls ohne rotes Fragezeichen)...

Und ich finde das ganze immer noch umständlich...
...aber da ja nicht klar ist, was du eigentlich machen willst (also in Summe) kann man auch keinen (noch) einfacheren Weg aufzeigen...

Viel Spaß noch, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

NE555

Zitat von: MadMax-FHEM am 10 Oktober 2022, 12:34:22
Gerne.
Dankeschön!
Zitat von: MadMax-FHEM am 10 Oktober 2022, 12:34:22
...aber irgendwie ist mir der Sinn in deinem Vorgehen unklar?
Das liegt vielleicht an meinen unklaren Formulierungen, srry.
Zitat von: MadMax-FHEM am 10 Oktober 2022, 12:34:22
Weil ob du nun EINMALIG beim Definieren
diese Annahme ist unbegrünet und wurde von mir so nicht geäußert.
Zitat von: MadMax-FHEM am 10 Oktober 2022, 12:34:22
deine defines/defmods usw. überleben keinen Neustart (oder Crash)...
Danke für den Tip, werde ich mich noch mit beschäftigen.
Zitat von: MadMax-FHEM am 10 Oktober 2022, 12:34:22
Du könntest das ganze auch in eine Sub auslagern, dort mit globaler Variable oder in einem fhem-Hash den Zähler merken und dann per at alle Minute aufrufen.
Danke für die Idee, aber dies war nicht die Fragestellung.
Zitat von: MadMax-FHEM am 10 Oktober 2022, 12:34:22
Und ich finde das ganze immer noch umständlich...
ok.
Zitat von: MadMax-FHEM am 10 Oktober 2022, 12:34:22
...aber da ja nicht klar ist, was du eigentlich machen willst (also in Summe) kann man auch keinen (noch) einfacheren Weg aufzeigen...
Du hast mir den entscheidenen Tip mit deinem Beispiel:
Zitat von: MadMax-FHEM am 10 Oktober 2022, 12:34:22
    fhem("defmod atWashingMachine at +00:15:00 {my_RememberWashingMachine(\"$Dummy\")}");
gegeben, danke, dir auch viel Spaß noch, NE555
RPI3 SONOFF sV,Touch,S26 mit Tasmota

MadMax-FHEM

Wie dem auch sei...

Packst du dann noch ein [gelöst] o.ä. "vorne dran", danke.

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)