FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: WhiteLion am 08 Oktober 2017, 22:35:16

Titel: Syntaxfragen
Beitrag von: WhiteLion am 08 Oktober 2017, 22:35:16
Moinen, nachdem ich nun einiges, mehr oder weniger Simples in FHEM gemacht habe, komme ich in Bereiche die ich einfach nicht so ganz durchblicke.

Besonders geht es mir um die Verarbeitung von Readings z.B. das Wettermodul gibt ja mehrer Readings zurück. Nehmen wir mal die Readings "wind_speed" & "temp_c":
define Wetter Weather 1544443 600 de
Ich habe mir einen dummy angelegt:
define test123 dummy
und versuche nun diesen dummy mit den beiden daten zu befüllen (Geht das überhaupt?):
define test123_setzen at +*00:00:02 set test123 {ReadingsVal("Wetter","temp_c",99)}
Wie hole ich mir den Wert aus "temp_c" überhaupt in einer Variable um sie weiterzuverarbeiten ?
so??: {$var1 = ReadingsVal("Wetter","temp_c",99)}
und wie bekomme ich $var1 anschließend in eine anderen anderen dummy ?
so??: { $var1 = ReadingsVal("Wetter","temp_c",99) fhem{set mydummy $var1}}

Egal was ich mache. Es landet nach der set Anweisung nur vom Interpreter unausgewertet alles in meinem Dummy.
Quasi der komplette Codeblock.
Danke schon mal im Voraus für die Hilfe!

Titel: Antw:Syntaxfragen
Beitrag von: C0mmanda am 08 Oktober 2017, 23:15:45
Zitat von: WhiteLion am 08 Oktober 2017, 22:35:16
Wie hole ich mir den Wert aus "temp_c" überhaupt in einer Variable um sie weiterzuverarbeiten ?
so??: {$var1 = ReadingsVal("Wetter","temp_c",99)}

Fast.

Zitat
und wie bekomme ich $var1 anschließend in eine anderen anderen dummy ?
so??: { $var1 = ReadingsVal("Wetter","temp_c",99) fhem{set mydummy $var1}}

Auch "fast".

Aber so ein paar Grundlagen solltest du dir aneignen, sonst wirst du nicht weit kommen.
Das was du wissen möchtest könntest du auch über die Suche finden.

Grundsätzlich kannst du das so machen:


define test123_setzen at +*00:00:02 {
my $temp_c = ReadingsVal("Wetter","temp_c",99);
(fhem("setreading mydummy temp_c $temp_c");}


grtz
Titel: Antw:Syntaxfragen
Beitrag von: WhiteLion am 09 Oktober 2017, 00:14:30
Danke für Deine Hilfe, leider ist mir nachdem ich deinen Code getestet habe genau das gleiche Problem aufgefallen:
mydummy  -> Readings -> state  beinhaltet nach der Ausführung deines Codes folgendes:
{ ReadingsVal("Wetter","temp_c",99) }
statt eines Readings "temp_c" mit dem wert der temperatur
Ich musste deinen Code noch etwas anpassen, da er bei mir nicht lief:
define test123_setzen at +*00:00:02 {
my $temp_c = ReadingsVal("Wetter","temp_c",99)
fhem("setreading mydummy temp_c $temp_c") }


Ich arbeite direkt im Notepad++ ... Zeilenumbrüche und Semikolon wird dort wohl nicht "verkraftet".
Titel: Antw:Syntaxfragen
Beitrag von: viegener am 09 Oktober 2017, 00:18:47
@WhiteLion: Es wäre gut zu wissen, was Du eigentlich erreichen willst? Einen Dummy mit den Werten aus einem Reading zu befüllen ist eigentlich sinnlos, dies aber auch noch alle 2 Sekunden zu tun ist vom Grundsatz her in FHEM der falsche Weg:

Hintergrund: Der Wert ändert sich ja nicht alle 2 Sekunden, sondern nur dann wenn ein neuer Wert vom Sensor empfangen wird. Die Änderung des zugehörigen Readings drückt sich dann in einem Event aus, auf den man reagieren kann (Stichwort notify). Ohne Dich mit dem Grundprinzip von Readings/Events zu befassen würde ich nicht weitermachen.

Ansonsten macht es hier immer Sinn zu  beschreiben, was Du eigentlich erreichen willst, dann kann zielgerichtet geholfen werden
Titel: Antw:Syntaxfragen
Beitrag von: WhiteLion am 09 Oktober 2017, 00:50:03
@viegener: Also es ging mir rein darum die Syntax besser zu verstehen. - Ich arbeite seit 4 Jahren mit C# und dieser mix aus fhem-syntax, pearl, ohne debugger, und escapen von Zeilenumbrüchen macht mich zugegeben ein stück wahnsinnig. Mein Beispiel war aus der Luft gegriffen, um ein besseres Verständnis für das übertragen von Variablen an die Orte wo ich sie benötige, zu entwickeln. ICh möchte wissen wie ich die Readings weiterverarbeiten kann, sei es zur zusammengefassten Anzeige von Daten oder zum Zwecke der Auswertung.
Titel: Antw:Syntaxfragen
Beitrag von: amenomade am 09 Oktober 2017, 01:34:48
ZitatIch arbeite direkt im Notepad++ ...
Und das ist genau, was Du nicht machen solltest: fhem.cfg direkt zu editieren, ist der falsche Weg. Somit wirst Du immer Probleme haben.
Titel: Antw:Syntaxfragen
Beitrag von: Amenophis86 am 09 Oktober 2017, 06:26:13
Zum üben leg dir eine eigene PM an: https://wiki.fhem.de/wiki/99_myUtils_anlegen

In der kannst du dann mit Subs üben, welche du mittels {Subname()} aufrufen kannst. Hier kannst du dich verausgaben und ordentlich test. Vorteil, du musst nicht in der CFG schreiben, bekommst Fehler angezeigt etc.

Ach und um ein Reading zu schreiben nicht mit set arbeiten (schreibt immer in das Reading state), sondern mit setreading arbeiten ;)
Titel: Antw:Syntaxfragen
Beitrag von: viegener am 09 Oktober 2017, 10:06:57
Zitat von: WhiteLion am 09 Oktober 2017, 00:50:03
@viegener: Also es ging mir rein darum die Syntax besser zu verstehen. - Ich arbeite seit 4 Jahren mit C# und dieser mix aus fhem-syntax, pearl, ohne debugger, und escapen von Zeilenumbrüchen macht mich zugegeben ein stück wahnsinnig. Mein Beispiel war aus der Luft gegriffen, um ein besseres Verständnis für das übertragen von Variablen an die Orte wo ich sie benötige, zu entwickeln. ICh möchte wissen wie ich die Readings weiterverarbeiten kann, sei es zur zusammengefassten Anzeige von Daten oder zum Zwecke der Auswertung.

Das mit der Syntaxverwirrung kann ich nachvollziehen und macht auch Sinn sich da einzuarbeiten. Daneben gibt es auch noch die unterschiedliche Syntax in unterschiedlichen Devicetypen etc.

Wichtig ist es aber trotzdem nicht gegen die Konzepte von FHEM zu arbeiten  sondern sich auch in die Konzepte von FHEM einzuarbeiten.
- Timer zur Abfrage von Readings --> Events wären hier das Konzept (notify/DOIF etc)
- Übertragung von Readings an andere Devices --> Vielleicht sind user readings hier besser?
- Dummy-Devices sind nur manchmal hilfreich und es muss schon einen Zweck dafür geben
- Persönlich glaube ich auch, dass es in den meisten Fällen Sinn macht Code nicht direkt am Device, sondern in myUtils auszulagern (wie oben vorgeschlagen)

Was ich meinte: Auch für "Fingerübungen" sollte es zu FHEM passen

Titel: Antw:Syntaxfragen
Beitrag von: WhiteLion am 09 Oktober 2017, 12:56:33
Vielen Dank für die Tipps, ich versuche sie zu beherzigen und teste jetzt in der 99_myUtils.pm . - Was mir natürlich gefühlt erstmal wesentlich besser liegt.
Leider sitze ich jetzt auch mit dieser Lösung wieder auf dem Trockenen was mein Versuch angeht den state zu ändern.
define Test1234 dummy
attr Test1234 room Chaos

der State hält trotz restart, reload und shutdown seinen alten Status und wird nicht neu gesetzt.
Versuchen tue ich es hiermit:
define Sonnenaufgang_setzen at +*00:00:20 { wakeup(true, "Test1234") }
Und meine 99_myUtils.pm enthält den code:
sub wakeup($$) {
  my ($wochenende, $device) = @_;
  if ($wochenende) {
    fhem( "set $device on" );
  }
  else {
    fhem( "set $device off" );
  }
}


Tut mir echt leid, dass ich hier so nerve... aber irgendwie klappt gar nichts, obwohl ich als Fachinformatiker eigentlich nicht unterqualifiziert sein sollte. Ich sehe meinen Fehler einfach nicht.
Titel: Antw:Syntaxfragen
Beitrag von: CoolTux am 09 Oktober 2017, 13:08:19
Du kommst nicht drum rum Perl zu lernen.


define Sonnenaufgang_setzen at +*00:00:20 { wakeup(true, "Test1234") }


sub wakeup($$) {
  my ($wochenende, $device) = @_;
  if ($wochenende) {
    fhem( "set $device on" );
  }
  else {
    fhem( "set $device off" );
  }
}


Was hat das zu tun was Du beim Aufruf Deiner Funktion an die Funktion übergibst mit dem was Du in der Funktion als Übergabeparameter erwartest? In meinen Augen gar nichts!!!
Titel: Antw:Syntaxfragen
Beitrag von: WhiteLion am 09 Oktober 2017, 14:13:55
okay, perl kennt also kein "true" ... WTF
Titel: Antw:Syntaxfragen
Beitrag von: CoolTux am 09 Oktober 2017, 14:19:15

define Sonnenaufgang_setzen at +*00:00:20 { wakeup("Test1234") }


sub wakeup($) {

  my ($device) = @_;
  my $we = (($wday==0 || $wday==6) ? 1 : 0);


  if ($we) {
    fhem( "set $device on" );
  }
  else {
    fhem( "set $device off" );
  }
}
Titel: Antw:Syntaxfragen
Beitrag von: Amenophis86 am 09 Oktober 2017, 14:42:39
OK, da wir ja gerade dabei sind Perl teilweise zu erklären. Was genau heißt

? 1 : 0

Wenn der Fall in der Klammer eintritt ist der Wert von $we = 1 sonst 0???
Titel: Antw:Syntaxfragen
Beitrag von: CoolTux am 09 Oktober 2017, 14:47:25
korrekt


my $abfrage = 'hallo';
fhem("set dummyTest " . ($abfrage eq 'hallo' ? "es war hallo" : "es war kein hallo");
Titel: Antw:Syntaxfragen
Beitrag von: WhiteLion am 09 Oktober 2017, 14:50:30
Zitat von: Amenophis86 am 09 Oktober 2017, 14:42:39
OK, da wir ja gerade dabei sind Perl teilweise zu erklären. Was genau heißt

? 1 : 0

Wenn der Fall in der Klammer eintritt ist der Wert von $we = 1 sonst 0???

Das ist wohl ein ternärer Operator:
Bedingung : <true Wert> ? <false Wert>
..Wenn perl da nicht wieder komische Eigenarten hat.

EDIT: war schon einer Schneller.

PS: Danke für das Beispiel @CoolTux
Titel: Antw:Syntaxfragen
Beitrag von: Amenophis86 am 09 Oktober 2017, 14:53:55
Ich danke für die Aufklärung und den Fachbegriff ;)
Titel: Antw:Syntaxfragen
Beitrag von: viegener am 09 Oktober 2017, 15:00:05
Vielleicht aber nochmal zurück zum grundsätzlichen Ansatz - Ohne Kenntnisse in den Konzepten von FHEM wird das trotzdem ein Holzweg
Alle 20 Sekunden einen Wert zu prüfen, der sich wohl eher maximal einmal am Tag ändert ist aus meiner Sicht eher gegen FHEM gearbeitet. Aber ich wiederhole mich...
Titel: Antw:Syntaxfragen
Beitrag von: CoolTux am 09 Oktober 2017, 15:03:37
Wenn das Ding mit der Wetter Abfrage so bleibt dann ist das in der Tat unsinnig. Hatte aber verstanden das es wohl nur ein Test oder so war um zu verstehen wie FHEM und Perl so funktionieren.
Ansonsten notify und auf das entsprechende Wetter Reading triggern lassen und dann im Notify die Funktion aufrufen.
Titel: Antw:Syntaxfragen
Beitrag von: WhiteLion am 09 Oktober 2017, 15:14:43
Ich kann mich nur nochmal selbst zitieren:
Zitat von: WhiteLion am 09 Oktober 2017, 00:50:03
@viegener: Also es ging mir rein darum die Syntax besser zu verstehen. - Ich arbeite seit 4 Jahren mit C# und dieser mix aus fhem-syntax, pearl, ohne debugger, und escapen von Zeilenumbrüchen macht mich zugegeben ein stück wahnsinnig. Mein Beispiel war aus der Luft gegriffen, um ein besseres Verständnis für das übertragen von Variablen an die Orte wo ich sie benötige, zu entwickeln. ICh möchte wissen wie ich die Readings weiterverarbeiten kann, sei es zur zusammengefassten Anzeige von Daten oder zum Zwecke der Auswertung.

Ich find es umständlich und undurchsichtig mit dieser FHEM Oberfläche dinge zusammenzuklicken. Eigentlich bin ich sehr sorgfältig vorgegangen und hab (um alles auf dem Schirm zu behalten) mit dem Notepad++ mehrere .cfg s angelegt (wetter, cams,...etc) . Nun soll ich einfach FHEM alles zusammen in die fhem.cfg klatschen lassen. (ja klar ich kann es hinterher sortieren, aber ein Königsweg ist da ja mal nicht gerade).
Weiterhin stehe ich immer noch auf Kriegsfuß mit dem FHEM Syntax... Mal schauen was da noch für Probleme auf mich zukommen.
Titel: Antw:Syntaxfragen
Beitrag von: Amenophis86 am 09 Oktober 2017, 15:38:56
Zitat von: WhiteLion am 09 Oktober 2017, 15:14:43
Nun soll ich einfach FHEM alles zusammen in die fhem.cfg klatschen lassen. (ja klar ich kann es hinterher sortieren, aber ein Königsweg ist da ja mal nicht gerade).

Genau so, die Erfahrung zeigt, dass editieren in der cfg mehr kaputt, als schön und ganz macht. Die brauchst du einfach nicht anfassen. Die Syntax hingegen lernen und die Systematik von FHEM verstehen bleibt nicht aus. Ist aber auch mit ein bisschen Übung zu verstehen :)