Neuigkeiten:

Am Sonntag den 8.12.2024 kann es ab ca. 8:00 Uhr zu kurzzeitigen Einschränkungen / Ausfällen bei den Diensten des FHEM Vereines kommen.
Die Server müssen mal gewartet und dabei neu gestartet werden ;)

Hauptmenü

Problem im PERL-Modus

Begonnen von TubeHead, 29 Oktober 2024, 14:56:58

Vorheriges Thema - Nächstes Thema

TubeHead

Ich versuche gerade für meinen Neuerwerb, die Ulanzi PixelClock, Werte aus Proplant zu generieren. Leider bin ich schon viel zu lange raus aus dem Thema und beiße mir gerade die Zähne aus...

defmod windrichtung notify wetter:winDir { my $grad = (ReadingsVal("wetter", "windDir", 0));; my $richtung = myCompass($grad);; fhem("set winddummy $richtung");; }
attr windrichtung group Proplanta
attr windrichtung room 980 - Umwelt

setstate windrichtung active
setstate windrichtung 2024-10-29 14:34:11 error condition c01: Undefined subroutine &DOIF::myCompass called, line 3.\

setstate windrichtung 2024-10-29 14:34:07 mode enabled
setstate windrichtung 2024-10-29 14:47:14 state active
setstate windrichtung 2024-10-29 14:40:54 triggeredByDev wetter
setstate windrichtung 2024-10-29 14:40:54 triggeredByEvent windDirIcon: https://www.proplanta.de/wetterdaten/images/symbole/w28.gif

Ich verstehe nicht, wieso triggeredByEvent windDirIcon an Stelle von winDir ist. Von daher vermute ich, dass auch der an die Funktion myCompass (geklaut und umgeschrieben von hier: https://forum.fhem.de/index.php?topic=24988.0) übergebene Wert nicht die in winDir stehende Gradzahl ist, sondern das hier vollkommen sinnlose GIF.
Eigentlich wollte ich das direkt mit DOIF machen, aber da weiß ich gar nicht, wie ich die Funktion im DO-Teil aufrufen sollte...

Mag da mal ein Profi einen Blick drauf werfen wollen und mir einen Hinweis geben, was ich hier übersehe?

PS: In der WebGUI taucht mit dem Namen "ChangeWissard" auch etwas auf, überhaupt nichts mit dem def zu tun hat...

passibe

#1
Erstell dir am besten deine notifys über den Event-Monitor (Event ganz normal mit der Maus markieren und dann oben auf "Create/Modify Device" klicken.

Unabhängig davon, ist hier vermutlich defmod windrichtung notify wetter:winDir:.* {...}richtig, also ein Doppelpunkt nach dem Readingnamen, auf den du triggern willst + dann noch ein ".*", damit auf alles, was das Reading als Wert hat getriggert wird.

Du brauchst dann auch gar kein ReadingsVal, sondern es sollte dann reichen, wenn du mit $EVTPART1 arbeitest (also einfach das nimmst, was sowieso aus dem Event kommt).

Also insgesamtdefmod windrichtung notify wetter:winDir:.* {my $richtung = myCompass($EVTPART1);; fhem("set winddummy $richtung");; }oder noch kürzerdefmod windrichtung notify wetter:winDir:.* {fhem("set winddummy ". myCompass($EVTPART1));; }
Aber noch dazu:
Zitat von: TubeHead am 29 Oktober 2024, 14:56:58Von daher vermute ich, dass auch der an die Funktion myCompass [...] übergebene Wert nicht die in winDir stehende Gradzahl ist, sondern das hier vollkommen sinnlose GIF.
Das stimmt vermutlich nicht, denn du hast ja mit ReadingsVal gearbeitet, das GIF wird also gar nicht an myCompass übergeben.
Die Fehlermeldung sagt ja recht klar, dass die Subroutine nicht gefunden wurde – wie und wo hast du die denn definiert?

Zur Sinnhaftigkeit des Ganzen (notify statt DOIF bzw. mit dem notify einen Dummy befüllen) – keine Ahnung. Da fehlen mir Infos über das, was du vor hast bzw. das können andere Leute hier vermutlich besser einschätzen.

TubeHead

#2
Erst einmal Dank, dass Du mir zur Seite stehen magst!

Das Sub ist in 99_myUtils.pm. Da die vorher nicht existierte, habe ich das Template genommen, die Sub eingetragen und als 99_myUtils.pm gespeichert. Ist doch korrekt so?
In der Datei steht folgendes:
package main;

use strict;
use warnings;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.

#########################################################
##  Wandelt die Kompassdaten der Wetterstation
##  in Klartext Himmelsrichtung um
#########################################################
sub myCompass($) {
  my ($azimuth) = @_;

  my $compassPoint = "-?-";

  if ($azimuth      < 11.25) {
     $compassPoint = "_N_";
  } elsif ($azimuth < 33.75)   {
     $compassPoint = "NNO";
  } elsif ($azimuth < 56.25) {
     $compassPoint = "N_O";
  } elsif ($azimuth < 78.75)   {
     $compassPoint = "ONO";
  } elsif ($azimuth < 101.25){
     $compassPoint = "_O_";
  } elsif ($azimuth < 123.75)  {
     $compassPoint = "OSO";
  } elsif ($azimuth < 146.25){
    $compassPoint = "S_O";
  } elsif ($azimuth < 168.75)  {
    $compassPoint = "SSO";
  } elsif ($azimuth < 191.25){
    $compassPoint = "_S_";
  } elsif ($azimuth < 213.75)  {
    $compassPoint = "SSW";
  } elsif ($azimuth < 236.25){
    $compassPoint = "S_W";
  } elsif ($azimuth < 258.75)  {
    $compassPoint = "WSW";
  } elsif ($azimuth < 281.25){
    $compassPoint = "_W_";
  } elsif ($azimuth < 303.75)  {
    $compassPoint = "WNW";
  } elsif ($azimuth < 326.25){
    $compassPoint = "N_W";
  } elsif ($azimuth <= 348.75)  {
    $compassPoint = "NNW";
  } elsif ($azimuth <= 361)  {
    $compassPoint = "_N_";
  }
  return $compassPoint;
}
1;

Deine Erläuterungen zu dem notify kann ich leider nicht so folgen. Da hatte ich damals schon arge Probleme mit und einen Freudenschrei getan, als es das Modul DOIF gab. Ich nehme das einfach mal so, wie Du es freundlicherweise niedergeschrieben hast.

Zitat von: passibe am 29 Oktober 2024, 15:53:17Zur Sinnhaftigkeit des Ganzen (notify statt DOIF bzw. mit dem notify einen Dummy befüllen) – keine Ahnung. Da fehlen mir Infos über das, was du vor hast bzw. das können andere Leute hier vermutlich besser einschätzen.
Nunja... das kann man sicherlich auch mit einem DOIF erschlagen, wird aber extrem unübersichtlich. Und da das schon mal wer gemacht hat, zumindest so ähnlich, habe ich mich darauf gestützt. Letztlich möchte ich die Windrichtungen im Kurztext (drei Zeichen) in der FhemGUI darstellen und diesen Wert per MQTT an die PixelClock senden

TubeHead

Ok, ich habe es jetzt auf Basis des SUB's in ein DOIF umgebaut.
Mich würde trotzdem interessieren, warum das die SUB nicht finden konnte un dwarum da so komische Dinge noch in der GUI auftauchten, die damit nichts zu tun haben...