(gelöst) Variable integer oder string

Begonnen von Stefan E, 16 Mai 2020, 23:04:35

Vorheriges Thema - Nächstes Thema

Stefan E

Hallo

ich programmiere schon eine Weile mit fhem, aber leider stolpere ich immer wieder über ganz blöde Anfänger-Probleme.

Meine Frage:
Wenn ich eine Variable definiere und mittels slider abfrage (also fülle), so sollte die Variable (bei mir WasserDauer) doch als Inhalt auch eine Zahl haben?
Wenn ich diese Variable in einem Notify nutze, dann sollte der Wert (=state) übergeben werden?
Das funktioniert aber nicht.
Es sieht so aus, als ob fhem die Variable als string auffasst. Wenn ich die Variable im Notify durch eine Zahl ersetze, funktioniert es.
Übergeben wird an on-for-timer.

Hier der Auszug aus der cfg (die setuuid Zeilen und unnötiges habe ich gelöscht)


### Bewässerung mit Zeitschaltung ###
# Bewässerungsdauer
define WasserDauer dummy
attr WasserDauer setList :slider,6,2,12

# Wasser Zeitsteuerung Rasen
# Variante mit notify
define 10min_Rasen dummy
attr 10min_Rasen devStateIcon on:sani_sprinkling@blue off:sani_sprinkling@green
attr 10min_Rasen setList on off

define n_10min_Rasen notify 10min_Rasen:on set Rasen_Quitte,Rasen_hinten on-for-timer WasserDauer
attr n_10min_Rasen devStateIcon on off


Jemand einen Tipp was ich falsch mache?
Problem ist die Verwendung der Variablen in der vorletzten Zeile.
Muss ich den Wert aus der Variablen abfragen? (habe ich auch schon versucht, aber da eher noch mehr Fehler gemacht)

Vielen Dank für Tipps
Stefan


Prof. Dr. Peter Henning

In Perl gibt es nur Strings. Und so etwas wie Variable kennt FHEM nicht.

1. Bitte Anfänger-Doku lesen
2. Bitte mal einen Blick auf ein Perl-Tutorial werfen.

LG

pah

MadMax-FHEM

Wenn du dann fhem verstehst und Perl "kannst":

ReadingsVal bzw. ReadingsNum zum Auslesen von Readings...

Und "in" Perl dann den Perl-Befehl:

fhem("set...")

zum "Absetzen" von fhem-Kommandos...

https://wiki.fhem.de/wiki/Klammerebenen

Aber wie geschrieben: erst mal verstehen wie fhem "geht"...

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)

Stefan E

Hallo

ok, vielen Dank. Da waren für mich schon mal 2 sehr wichtige Infos drin:
In Perl gibt es nur strings. Wusste ich nicht.
In Fhem scheint das dann auch so zu sein.

Was natürlich sehr interessant ist: In fhem gibt es keine Variablen.
Aber es gibt Devices vom Typ dummy, dessen state dann einen Inhalt hat den man auslesen kann. Ok, verstanden, ich darf das nicht Variable nennen. Geschenkt.

So, jetzt ist blöderweise der state Inhalt vom Typ string.
Also kann natürlich der Befehl nicht gehen:
define n_10min_Rasen notify 10min_Rasen:on set Rasen_Quitte,Rasen_hinten on-for-timer WasserDauer
Wenn WasserDauer ein Device ist, dessen Inhalt ich verwenden will, der aber keine Zahl ist, sondern ein String. Also umwandeln in eine Zahl.

Weiter:
Mir ist bereits klar, dass ich mit Perl Values aus Strings machen kann.
Readingsval kannte ich schon, hab es aber noch nicht eingesetzt.
Readingsnum scheint mir noch besser für meinen Zweck geeignet zu sein. Danke für den Tipp.

Jetzt kommt für mich immer noch das Rätsel der Integration von Perl in fhem.
Ich habe schon stundenlang über Perl Integration in fhem gelesen. Ich habe auch verstanden, dass das mit dem mixen problematisch ist. Aber ehrlich gesagt verstehe ich noch nicht, warum man Perl so reinmixen kann (Beispiel aus der verlinkten Klammerebenen):
define act_on_Einfahrt_AUF notify Einfahrt_AUF { if (Value("Einfahrt") eq "Closed") { fhem("set Tor_Aktor on ;; set Kontrollampe on")} }


Aber offensichtlich nicht so, das geht nämlich nicht:
define n_10min_Rasen notify 10min_Rasen:on set Rasen_Quitte,Rasen_hinten on-for-timer {ReadingsNum("WasserDauer",,,)}
Hier meckert fhem zwar keinen Syntax Fehler an, aber es wird kein nummerischer Wert übergeben.

Wahrscheinlich weil im fhem Befehl "set" noch Perl kommt. Obwohl im obigen Beispiel aus den Klammerebenen, das wohl geht, da im fhem Befehl "def" auch noch Perl kommt.

Zwei meiner vielen weiteren Varianten:

define n_10min_Rasen notify 10min_Rasen:on {fhem("set Rasen_Quitte,Rasen_hinten on-for-timer {ReadingsNum("WasserDauer",,,)}")}
define n_10min_Rasen notify 10min_Rasen:on {fhem("set Rasen_Quitte,Rasen_hinten on-for-timer") {ReadingsNum("WasserDauer",,,)}}

Gehen beide nicht. Diesmal Syntax Error.

Ok, ich weiß schon was kommt. Les die Anfänger-Doku. Habe ich bereits.
Falls jemand trotzdem Lust hat, mir hier kurz im Anfängerforum zu helfen, so wäre ich wirklich sehr dankbar.
Also 2 Fragen:
1) ist mein Perl Befehl überhaupt richtig so?
ReadingsNum("WasserDauer",,,)
ich habe auch probiert:
ReadingsNum("WasserDauer","state",0,0)

2) wie integriere ich das in den def Befehl von fhem?
(siehe oben)

Vielen Dank!

Stefan

Otto123

#4
Hallo Stefan,

alles noch etwas wirr - aber das wird schon ;)
Der Ausführungsteil geht so:
set Rasen_Quitte,Rasen_hinten on-for-timer [WasserDauer:state:d]
oder so
set Rasen_Quitte,Rasen_hinten on-for-timer {(ReadingsNum("WasserDauer","state",0))}
Falls dein Wert im Device WasserDauer im Reading state steht :9

Wenn es auch im Internal STATE steht (was per default so ist), geht auch das:
set Rasen_Quitte,Rasen_hinten on-for-timer [WasserDauer]

Zum nachlesen: Befehl set in der commandref, das Konstrukt nennt sich set magic

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

MadMax-FHEM

#5
Naja ich hab jetzt nicht alle deine Ausführungen gelesen...

ABER: du hast ja selbst herausgefunden, dass Mischen nicht gut ist...
...tust es aber und wunderst dich ;)


set Rasen_Quitte,Rasen_hinten on-for-timer {ReadingsNum("WasserDauer",,,)}


Der Anfang set ... ist fhem
Ab { wird es Perl...

Daher habe ich ja den Link bzgl. fhem und Klammern gepostet...

Und warum die vielen Kommas in ReadingsNum!?

ReadingsNum("DeviceName","ReadingName", Ersatzwert)

UND: es gibt beim Dummy mehr als nur state!

Du kannst einfach mittels "setreading DeviceName ReadingName Wert" setzen was immer du möchtest...

Auch bei einem Dummy...

Was du willst könnte so funktionieren:


define n_10min_Rasen notify 10min_Rasen:on {my $Dauer=ReadingsNum("WasserDauer","state",0); fhem("set Rasen_Quitte,Rasen_hinten on-for-timer $Dauer")}


Wenn die Namen stimmen UND tatsächlich der gewünschte Wert im "state" des Dummy steht...

UND: wenn in "state" auch etwas drin steht was für on-for-timer "gültig" ist!
(und dabei ist es EGAL ob String oder numerischer Wert!! Weil fhem ist auch Perl, daher...)

UND: bitte lernen! ;)

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)

Otto123

#6
Zitat von: MadMax-FHEM am 17 Mai 2020, 13:51:04
set Rasen_Quitte,Rasen_hinten on-for-timer {ReadingsNum("WasserDauer",,,)}
Der Anfang set ... ist fhem
Ab { wird es Perl...
Das ist set magic, das ist nicht Befehle mischen. Bis auf den gravierenden Fehler im Perlausdruck ist das schon ok :)

Aber in dem Moment wo man noch mehr machen will {if(bedingung){set bla bla} dann alles in Perl ;) wie Joachim vorgeschlagen hat !
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

MadMax-FHEM

Bin ich jetzt verwirrt!?

Da stand doch grad noch was mit: willst du dich selbst triggern...
...und: was willst du genau!?

Wollte grad zitieren...
...dann war es weg (wenn es denn überhaupt da war ;) )...

Wollte ich auch fragen...
...also besser "erzählen" WAS du eigentlich willst (gerade als Anfänger), weil vielleicht geht es ja wesentlich "geschickter"...

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

#8
Zitat von: Otto123 am 17 Mai 2020, 13:54:32
Das ist set magic, das ist nicht Befehle mischen. Bis auf den gravierenden Fehler im Perlausdruck ist das schon ok :)

Tja...

Aber gerade bei Anfängern (und ich selbst mache es auch ;)  ) entweder gleich in Perl oder gleich NUR fhem...
...ansonsten wundert man sich warum hier so geht und da dann so (oder so ähnlich) nicht geht...

Aber das ist nur meine Meinung...
...und mein "alter Stiefel"...

Ich nutze setmagic nicht...

Weil es nicht immer geht...
...und bevor ich mir groß merke wann was wo wie geht und dann wieder so nicht oder so doch wieder irgendwie... ;)

Mache ich entweder oder...

EDIT: Bzw. "einzeiler" mit eigentlich nur fhem-Befehlen gleich im Define (notify etc.) alles andere verlagere ich gleich in eine myUtils-Sub und da bin ich dann Perl :)

Und da ich auch DOIF nicht nutze...
...brauche ich das auch nicht ;)

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)

Otto123

Zitat von: MadMax-FHEM am 17 Mai 2020, 13:54:40
Bin ich jetzt verwirrt!?

Da stand doch grad noch was mit: willst du dich selbst triggern...
...und: was willst du genau!?

Nein Du bist nicht verwirrt, Du bist zu schnell ;) Stand kurz da: ich hatte den code vom notify falsch gelesen, der ist am Anfang doch ok so :)
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

Stefan E

Hallo zusammen

vielen Dank für die schnelle Hilfe.

@Otto123:
Die Variante komplett in fhem hat geklappt:
[WasserDauer:state:d]
Ich muss also doch genauer definieren, wo der Wert steht.
Was bedeutet das d?

Die Variante: {ReadingsNum("WasserDauer","state",0)}
hat nicht funktioniert.

@Otto123 und MadMax
Mein gravierender Perl Fehler war wohl ein Komma zu viel.
Ich hatte readingsnum aus der command reference. Hab gerade nochmal nachgesehen, das war in einem Unterkapitel zu KNX, vielleicht hat es da mehr Parameter (der letzte ist dort runden).

@MadMax:
Danke auch für das Perl Beispiel. Jetzt ist mir das klarer, wie ich sauber Perl einfüge.
Du hast Perl gestartet, den Inhalt erstmal an eine Variable übergeben, und dann aus Perl den kompletten fhem Befehl mit der neuen Variable gestartet.
Ich habe das ausprobiert, funktioniert auch.
Allerdings habe ich noch 2 Klammern entfernt
also statt erste, die zweite Zeile

define n_10min_Rasen notify 10min_Rasen:on {my $Dauer=ReadingsNum("WasserDauer","state",0)}); fhem("set Rasen_Quitte,Rasen_hinten on-for-timer $Dauer")}
define n_10min_Rasen notify 10min_Rasen:on {my $Dauer=ReadingsNum("WasserDauer","state",0);; fhem("set Rasen_Quitte,Rasen_hinten

Da ich es über fhem Oberfläche eingegeben habe, hat er noch doppelte ;; eingefügt.

Jetzt habe ich zwei Lösungen. Sehr schön.

Vielen Dank
Stefan

MadMax-FHEM

#11
Hab's korrigiert...

War ein copy/paste aus deinem ReadingsNum und dann was eigentlich gehört ;)

Das ':d' -> weil du doch Zahlen wilst ;)

Strichpunkt bzw. doppelter Strichpunkt kommt drauf an wo/wie du das einfügst...

Ich gehe halt mit einer Sub gleich nach Perl...
...dort ist es dann nur ein Strichpunkt ;)

https://wiki.fhem.de/wiki/99_myUtils_anlegen

EDIT: da wäre es dann evtl. so

define nTest notify Trigger-RegEx {my_SubInMyUtils(evtl.Parameter)}

und da kannst du dich dann austoben soweit dich Perl trägt ;)

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)

Christoph Morrison

Zitat von: Prof. Dr. Peter Henning am 17 Mai 2020, 05:18:13
In Perl gibt es nur Strings. Und so etwas wie Variable kennt FHEM nicht.

Perl kennt drei Datentypen ($kalare, %ashes und @rrays), während Skalare Strings, Nummern oder Referenzen sein können.

Otto123

Ja sorry, ich habe es korrigiert. Habe die Klammern vergessen. Das ist das was Joachim meint :)
Perl im set magic ist speziell, die Version [device:readings:suffix]
set magic braucht {(Perl)} und im Ausdruck vorkommende ; müssen verdoppelt werden und wahrscheinlich gibt es noch ein paar Besonderheiten.

War quasi der Test, ob Du meiner Empfehlung folgend, nochmal nachliest :)
Da steht nämlich die Antwort auf Deine Fragen: https://fhem.de/commandref_DE.html#set

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

Stefan E

OK.
Das mit d für Zahlen hatte ich dann noch gefunden. Bei set steht es tatsächlich auch dabei. Hätte ich mal genauer lesen müssen.

Ich verwende jetzt einfach die Version mit den eckigen Klammern: [WasserDauer:state:d]

Aber Perl hab ich jetzt woanders schon eingbaut.

Wie setze ich den Thread auf gelöst?
Durch Schließen?

Vielen Dank nochmal
Stefan