Wiederholte Definition von Sensoren in der fhem.cfg

Begonnen von Goofy, 24 Januar 2013, 00:01:34

Vorheriges Thema - Nächstes Thema

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:


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


und in der 1wtemp_eg_zimmer.gplot steht:

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\


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
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

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.

#!/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";
}


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

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


Und in der onwire.classdef steht (ist aus dem fhem-Wiki):
set messen cmd {"1w convert"}
get temp cmd {"1w get %devID"}

butterkuchen

Hallo,

ich habe eine Frage zu deinem Script.

Wenn ich das richtig verstehe definierst du in einer Datei alle onewirw ID.
Diese ID wird eingelesen und dann mit dem ecmd_name und readable_name versehen.
Da du diese Namen erst in dem Script einträgst, musst du hier jeden Sensor noch einmal anfassen.

Würde es nicht sinn machen, das du das Script so erweiterst, das es die onewire ID, ecmd_name und readable_name aus einer Datei einliest?

Goofy

Hi butterkuchen!

Zitat von: butterkuchen schrieb am Mo, 28 Januar 2013 21:58...
Würde es nicht sinn machen, das du das Script so erweiterst, das es die onewire ID, ecmd_name und readable_name aus einer Datei einliest?

Einen Vorteil sehe ich an einer weiteren Datei nicht: Ob ich die ID, den ecmd_name und den readable_name nun in eine andere Datei oder direkt in das Skript schreibe, scheint mir gleich aufwendig zu sein. O.k.: In einer anderen Datei könnte ich die drei Variablen durch Kommata getrennt in eine Zeile schreiben und müsste sie nicht direkt in den Hash schreiben. Also einen kleinen Vorteil brächte es schon.

Grüße
Goofy