FHEM Forum

FHEM - Hausautomations-Systeme => 1Wire => Thema gestartet von: Heffa am 13 Dezember 2013, 09:15:55

Titel: Eigene Variablen verwenden
Beitrag von: Heffa am 13 Dezember 2013, 09:15:55
Hallo zusammen,

ich habe gerade mit FHEM angefangen und habe schon meine ersten erfolge gahabt.
Ich habe das Pollin Board AVR-NET-IO mit K8IO.

Soweit habe ich es geschafft die 1w Fühler abzufragen, die Relais zu schalten und die Relais abhängig von der Temperatur zu schalten.

Beispiel:
- das hier klappt -
define BrennerSchalten notify (HZ_1_Kessel:(temp).*) { if (%EVTPART1 < 24.0) { fhem("set Brenner on") } else { if (%EVTPART1 > 25.0) { fhem("set Brenner off") } } }[/font]

- wunsch -
define BrennerSchalten notify (HZ_1_Kessel:(temp).*) { if (%EVTPART1 < KesselMin) { fhem("set Brenner on") } else { if (%EVTPART1 > KesselMax) { fhem("set Brenner off") } } }[/font]

Was ich leider noch nicht hinbekommen habe ist, die festen Werte 24.0 und 25.0 dür vordefinierte Variablen zu ersetzen.
Da ich diese Werte öfters verwenden werde würde es Sinn machen diese an einer Stelle zu definieren.

Ich habe jede Menge gesucht, aber leider noch keine Lösung für genau dieses Problem gefunden.

Würde mich über etwas Hilfe freuen.

Gruß
Heffa
Titel: Antw:Eigene Variablen verwenden
Beitrag von: hckoe am 13 Dezember 2013, 09:28:30
Hallo Heffa,

suche im Forum einmal nach 99_myUtils.pm.

Gruß
Helmut
Titel: Antw:Eigene Variablen verwenden
Beitrag von: Heffa am 13 Dezember 2013, 10:14:45
Hallo hckoe,

dank für die schnelle Antwort.
Ich habe leider über 250 Treffer zu dem 99_myUtils.pm bekommen  :(

Gibt es eventuell etwas konkreteres, ein Beispiel oder so?

Gruß
Heffa
Titel: Antw:Eigene Variablen verwenden
Beitrag von: ph1959de am 13 Dezember 2013, 10:30:48
Wie wärs als Start mit dem Wiki-Eintrag http://www.fhemwiki.de/wiki/99_myUtils_anlegen ... oder ist der auch schon bekannt und für unzureichend befunden worden?

Gruß, Peter
Titel: Antw:Eigene Variablen verwenden
Beitrag von: Heffa am 13 Dezember 2013, 10:42:20
Danke für den Link.

Schaue ich mir an.

Was ich brauche sind "nur" Variablen mit feste Werte die ich im fhem.cfg zur Prüfung verwenden kann.
Ich dachte ich könnte das in der FHEM.CFG "einfach so" definieren.

Ich muss mich wohl noch etwas mehr einlesen in der FHEM Materia.

Danke
Heffa
Titel: Antw:Eigene Variablen verwenden
Beitrag von: Funfactor am 13 Dezember 2013, 18:31:34
Hallo Heffa,

Die benötigten Konstanten würde ich auch versuchen in der 99_Utils.pm zu definieren.

Wenn Du sie als Konstanten definierst könnte die verwendet Schreibweise funktionieren. Variablen müssen meines (aktuell noch sehr bescheidenen) Wissens nach mit $<Variablenname> verwendet werden.

Hier was zu Konstanten http://perldoc.perl.org/constant.html (http://perldoc.perl.org/constant.html).

Grüße
Titel: Antw:Eigene Variablen verwenden
Beitrag von: Starkstrombastler am 13 Dezember 2013, 19:38:00
Ich habe einem Device Readings hinzugefügt. Diese lese und schreibe ich mit ReadingsVal() bzw. setReadingsVal().
Im Beispiel Reading Epoch:

my $stamp = TimeNow();
my $zeit = ReadingsVal("Stromzaehler","Epoch",1);
.....
setReadingsVal($defs{"Stromzaehler"},"Epoch",time(),$stamp);

Der Wert des Reading kann dann über die fhem-Oberfläche mittels setreading  eingegeben werden.
Titel: Antw:Eigene Variablen verwenden
Beitrag von: Puschel74 am 13 Dezember 2013, 19:48:09
Hallo,

ZitatDie benötigten Konstanten würde ich auch versuchen in der 99_Utils.pm zu definieren.

Würde ich nicht machen da bei einem update die 99_Utils.pm überschrieben werden kann.

Der Vorschlag dies über die 99_myUtils.pm zu erledigen macht schon Sinn.

Aber...
global verfügbar kannst du Variablen in der 99_myUtils.pm mit dem Schlüsselwort our erledigen.

our $KesselMin = "23";
our $KesselMax = "25";


Ab nun sind die Variablen $KesselMin und $KesselMax in FHEM global verfügbar.
Nachteil: Du darfst nicht vergessen diese Variablen schonmal definiert zu haben.
Den Namen darfst du nicht nochmal vergeben da die originalen dann überschrieben werden.

Besser ist es diese Variablen im notify zu deklarieren und mit dem Wert zu füllen.

Vorteil: Du kannst in jedem notify denselben Variablennamen verwenden.
Nachteil: Gibt es sicher nur fällt mir grad keiner ein  8)

Grüße
Titel: Antw:Eigene Variablen verwenden
Beitrag von: Heffa am 17 Dezember 2013, 16:07:57
Hallo,

danke für eure Antworten.

Ich habe die Variablen jetzt in die 99_myUtils.pm mit our definiert

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
  our $Kessel_Min = 23.0;
  our $Kessel_Max = 26.0;
  our $Brauchwasser_Min = 22.0;
  our $Brauchwasser_Max = 25.0;
  our $Panikmax_Min = 85.0;
  our $Panikmax_Max = 86.0;
  our $Vorlauftemp = 0;
}

klappt so weit auch wie ich es brauche.

Ich verwende die Variablen dann so:

define BrennerSchalten notify (HZ_1_Kessel:(temp).*) {\
if (ReadingsVal("HZ_1_Kessel", "temp", 99) < $main::Kessel_Min) {\
  fhem("set Brenner on")\
} else {\
if (ReadingsVal("HZ_1_Kessel", "temp", 99) > $main::Kessel_Max) {\
fhem("set Brenner off") } } }



Ich habe jetzt eine dynamische Variable erstellt der in Abhängigkeit von einem Fühler einen anderen Wert bekommt.

sub
SetVorlauf($)
{
  my ($temp) = @_;
  if ($temp < -15.0) {
    our $Vorlauftemp = 82.0;
  }
  elsif ($temp < -14.0) {
    our $Vorlauftemp = 81.2;
  }
  elsif ($temp < -13.0) {
    our $Vorlauftemp = 80.4;
  }
.
.
.
.
  else {
    our $Vorlauftemp = 55.0;
  }
}

die ich dann so:


define myVorlauf at +*00:00:10 { SetVorlauf(ReadingsVal("HZ_3_Aussen", "temp", 99)) }


aufrufe.

das klappt soweit "scheinbar" auch.

Jetzt möchte ich gerne in der GUI die Werte auch darstellen.
Mit der dummy Definition klappt es auch, nur die dynamische Variable $Vorlauftemp wird in der GUI nicht aktualisiert.

Hat jemand eine Idee wie ich das umsetzten kann?

Danke

Heffa
Titel: Antw:Eigene Variablen verwenden
Beitrag von: Puschel74 am 18 Dezember 2013, 13:09:51
Hallo,

ZitatHat jemand eine Idee wie ich das umsetzten kann?

Sollen wir jetzt einen neuen Code zusammen bauen oder zeigst du uns was du bisher versucht hast?

Zitatdefine myVorlauf at +*00:00:10 { SetVorlauf(ReadingsVal("HZ_3_Aussen", "temp", 99)) }

Die Temperatur alle 10 Sekunden zu prüfen ist mMn overkill und unnötig - da sich die Aussentemperatur mit ziemlicher Sicherheit nicht so schnell ändern wird das das notwendig wäre.

Versuchs mal so:

define myVorlauf notify HZ_3_Aussen:temp.* { SetVorlauf(ReadingsVal("HZ_3_Aussen", "temp", 99)) }
Am HZ_3_Aussen versuchen das Attribut "event-on-change-reading .*" zu setzen damit FHEM nur ein Event auslöst wenn sich ein Wert auch ändert.

Zitatdefine BrennerSchalten notify (HZ_1_Kessel:(temp).*) {\
Ob das so klappt mit dem regexp kann ich fast nicht glauben.
Sollte eher so aussehen:
define BrennerSchalten notify HZ_1_Kessel:temp.* {\

Ich hab grad gesehen das du die fhem.cfg direkt bearbeitest - dann bitte selbst um den zeilenschutz bzw. die Zeichenmaskierung kümmern da ich ausschliesslich und nur das DEF bearbeite und mich um diese Zeichen nicht kümmere.

Grüsse