FHEM > Anfängerfragen

Wiederholte Definition von Sensoren in der fhem.cfg

(1/2) > >>

Goofy:
Guten Abend Forum!

In jedem Raum habe ich einen 1W-Temperatursensor. Die 1W-Busse hängen an einem AVR-IO-Net. Als erstes möchte ich jetzt die Temperaturen in jedem Raum loggen und plotten. Später soll dann die Temperatur in den Räumen geregelt werden.

Meine Frage: Muss ich für jeden Raum (also jeden Sensor) einen Abschnitt, wie unten zu sehen, in der fhem.cfg erstellen und muss ich
für jeden Sensor eine gplot-Datei erstellen?

Für einen Raum mache ich das Messen der Temperatur so:


--- Code: ---
params devID
set messen cmd {"1w convert"}
get temp cmd {"1w get %devID"}

define eg_zimmer ECMDDEvice ONEWIRE 2899XXXXXXXXXXXX

define 1wire_temp_300 at +*00:05 \
       set eg_zimmer messen;; \
       sleep 1;; \
       get eg_zimmer;;

define log_eg_zimmer_temp FileLog /opt/fhem/log/temps_eg_zimmer_%Y-%m.log ^eg_zimmer:(temp).*";;\

define weblink_temperatur_eg_zimmer weblink fileplot log_eg_zimmer_temp:1wtemp_eg_zimmer:CURRENT

--- Ende Code ---


und in der 1wtemp_eg_zimmer.gplot steht:


--- Code: ---set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set y2tics
set title '<L1>'
set grid xtics y2tics
set y2label "Temperatur in °C"
#FileLog 4:eg_zimmer::
plot \
 "< egrep 'eg_zimmer' <IN>"\
    using 1:4 title 'EG Zimmer' with lines lw2\
--- Ende Code ---


Muss ich das für jeden Raum wiederholen oder kann ich in der fhem.cfg mit z.B. einer foreach-Schleife arbeiten? Muss ich für jeden Sensor eine gplot-Datei anlegen oder kann ich in dieser Datei Variablen verwenden (um z.B. den "title" je Sensor unterschiedlich definieren zu können)?

Vielen Dank im voraus!

Reinerlein:
Hallo Anne,

zu dem CMD kann ich dir nicht viel sagen, aber zu dem Plot.

Du brauchst in deiner Plot-Datei nicht nochmal explizit auf eg_zimmer zu filtern, wenn dein FileLog sicherstellt, dass nur der eine Raum drin ist.
Dann braucht der Plot nämlich nur alle Werte aus der Datei zu nehmen, und anzuzeigen. Das ist viel einfacher zu konfigurieren...

Solch eine Unterscheidung im Plot selbst braucht man nur, wenn man z.B. mehrere Räume in einem Plot anzeigen möchte, und diese natürlich dann in verschiedenen Linien haben möchte...

Auch der Titel ist in der Plot-Datei ja eigentlich per <TL> drin. Das bedeutet, dass der Titel über den Weblink definiert wird, und die Plot-Datei wiederverwendet werden kann.

Grüße Reinerlein

Goofy:
Danke! Der Hinweis auf <TL>, <L1>, ... in der *.gplot hilft weiter. Die entsprechende Wiki-Seite habe ich wohl übersehen. So benötige ich nur eine gplot-Datei.

Die für alle Räume bis auf die Namen gleiche Konfiguration erstelle ich jetzt mit einem perl-Skript, dass eine cfg-Datei schreibt, die über eine include-Anweisung in der fhem.cfg eingebunden wird.

Nochmals Danke!

Puschel74:
Hallo und Moin zusammen,

könntest du uns an deinem Perl-Script teilhaben lassen bitte?
Ich würde mir das gerne mal anschauen in der Hoffnung das ich ein bischen was lernen kann (unter der Voraussetzung das ich
dein Script durchblicke ;-) ).
Oder sonst besser ab damit unter Codeschnipsel damit alle was davon haben.

grüße

Goofy:
ja, ich kann das Skript hier gerne veröffentlichen. Allerdings glaube ich im nachhinein nicht, dass es eine wirkliche Zeitersparnis bringt. Der entscheidende Hinweis, war der Hinweis darauf, nur eine gplot-Datei zu verwenden (siehe oben). Das hier ist eher Spielerrei. Deswegen sollte es meiner Meinung nach auch nicht bei den Codeschnipseln eingetragen werden.

Das Skript gibt für jeden in dem Konfigurationshash eingetragenen 1-Wire-Temperatursensor eine Zeile, in der der Sensor als ECMDDevice definiert wird und eine Zeile, die den Sensor einem Raum zuweist, aus. Anschließend wird für alle Sensoren ein at-Kommando ("Temperatur messen") definiert. Dann wird für jeden Sensor ein FileLog und ein weblink erstellt.


--- Code: ---#!/usr/bin/perl -w

use strict;

my $conf->{'temperatursensoren'} = {
    '2XXXXXXXXXXXXXX2' => {
'ecmd_name' => "eg_zimmera",
'readable_name' => "Zimmer 1"
    },
    '2XXXXXXXXXXXXXXc' => {
'ecmd_name' => "eg_zimmerb",
'readable_name' => "Zimmer 2"
    },
# weitere Sensoren hier eintragen
};

foreach (keys $conf->{'temperatursensoren'}) {
    print "define " . $conf->{'temperatursensoren'}->{$_}->{'ecmd_name'}
. " ECMDDEvice ONEWIRE " . $_ . "\n";
    print "attr " . $conf->{'temperatursensoren'}->{$_}->{'ecmd_name'}
    . " room " . $conf->{'temperatursensoren'}->{$_}->{'readable_name'} . "\n";
}

# 1wire-Sensoren alle fuenf Minuten abfragen
print 'define 1wire_temp_300 at +*00:05 \\' . "\n"
    . 'set eg_zimmera messen;; \\' . "\n"
    . 'sleep 1;; \\' . "\n";
foreach (keys $conf->{'temperatursensoren'}) {
    print "get " . $conf->{'temperatursensoren'}->{$_}->{'ecmd_name'}
    . ' temp;; \\' . "\n";
}

print "\n";

# Abfragen loggen und Graphen erzeugen
foreach (keys $conf->{'temperatursensoren'}) {
    print "define log_temp_"
. $conf->{'temperatursensoren'}->{$_}->{'ecmd_name'}
    . " FileLog /opt/fhem/log/"
. $conf->{'temperatursensoren'}->{$_}->{'ecmd_name'}
    . "_temps-%Y-%m.log " . $conf->{'temperatursensoren'}->{$_}->{'ecmd_name'}
    . '.*:(temp).*' . "\n";
    print "define weblink_temperatur_"
. $conf->{'temperatursensoren'}->{$_}->{'ecmd_name'}
    . " weblink fileplot log_temp_"
. $conf->{'temperatursensoren'}->{$_}->{'ecmd_name'}
    . ":1wzimmertemp:CURRENT\n"
. "attr weblink_temperatur_"
. $conf->{'temperatursensoren'}->{$_}->{'ecmd_name'}
    . " label \"Temperatur "
. $conf->{'temperatursensoren'}->{$_}->{'readable_name'}
    . ' - min: $data{min1}, max: $data{max1}, letzte: $data{currval1}"' . "\n"
. "attr weblink_temperatur_"
. $conf->{'temperatursensoren'}->{$_}->{'ecmd_name'}
    . " room " . $conf->{'temperatursensoren'}->{$_}->{'readable_name'} . "\n";
}

--- Ende Code ---


Den AVR-Net-IO mit ethersex habe ich zuvor in der fhem.cfg eingerichtet:


--- Code: ---define NETIO_01 ECMD telnet 192.168.XXX.XXX:2701
attr NETIO_01 classdefs ONEWIRE=/opt/fhem/onewire.classdef

--- Ende Code ---


Und in der onwire.classdef steht (ist aus dem fhem-Wiki):

--- Code: ---set messen cmd {"1w convert"}
get temp cmd {"1w get %devID"}
--- Ende Code ---

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln