|
 |
|

25.04.2012, 23:59
|
|
Erfahrener Benutzer
|
|
Registriert seit: 14.12.2011
Ort: Hessen
Beiträge: 988
|
|
Utility: Gruppenadressen in Logdateien decodieren
Hallo zusammen,
wer wie ich auch keine nackten Gruppenadressen in Logdateien mag, für den hätte ich hier einen Ansatz.
1. Die Datei /etc/wiregate/eibga.conf sollte mit allen GAs und deren Namen gepflegt sein. Jeder GA-Name sollte mit einem eindeutigen Kürzel beginnen (etwa ""
2. Optional: eine Datei /etc/wiregate/eibpa.conf mit einer Tabelle der physikalischen Adressen erzeugen. (eine Zeile pro Gerät, einfach den Klarnamen des Gerätes und dahinter die phys. Adresse).
Das folgende Script als "eibdecode" in den Pfad (zB /root/bin) ablegen und ausführbar (chmod a+x /root/bin/eibdecode) machen.
Code:
#!/usr/bin/perl -W
#############
# eibdecode #
#############
# Wiregate-Utility
# (c) 2012 Fry under the GPL v2 or later
use strict;
# Physical addresses:
# Read /etc/wiregate/eibpa.conf if existent
# simple format, e.g.:
#
# MDT DaliControl 1.1.23
# LJ Netzteilaktor 1.1.1
# MDT Taster 12 1.1.12
# .....
#
my %eibpa=();
open CONF, "</etc/wiregate/eibpa.conf" || return "Could not open eibpa.conf for reading";
$/="\n";
while(<CONF>)
{
next unless /^(.*)\s+([0-9]+\.[0-9]+\.[0-9]+)\s*$/;
$eibpa{$2}=$1;
$eibpa{$1}=$2;
}
close CONF;
# Group addresses:
# Read /etc/wiregate/eibshort.pl if existent and newer than /etc/wiregate/eibga.conf
# otherwise generate that file
# eibshort is a hash containing the first word of each GA name
# (used as "short description" in my GA scheme)
my %eibshort;
if(-f '/etc/wiregate/eibga.conf' && -f '/etc/wiregate/eibshort.pl' && -M '/etc/wiregate/eibga.conf' > -M '/etc/wiregate/eibshort.pl')
{
$/=undef; open PL, "</etc/wiregate/eibshort.pl"; eval <PL>; close PL;
}
else
{
# parse eibga.conf
open CONF, "</etc/wiregate/eibga.conf" || return "Could not open eibga.conf for reading";
$/="\n";
my $hash={};
while(<CONF>)
{
if(/^\[([0-9]+\/[0-9]+\/[0-9]+)\]\s*$/)
{
my $newhash = { ga => $1 };
if(exists $hash->{name} && exists $hash->{ga})
{
$hash->{name}=~/^\s*(\S+)/;
my $short=$1;
$short='ZV_'.$1 if $hash->{name}=~/^Zeitversand.*(Uhrzeit|Datum)/; # short versions of "Zeitversand
$eibshort{$short}=$hash;
$eibshort{$hash->{ga}}=$short;
}
# start new record
$hash=$newhash;
}
elsif(/^\s*(.*?)\s*\=\s*(.*)\s*$/)
{
$hash->{$1} = $2;
}
}
close CONF;
if(exists $hash->{name} && exists $hash->{ga})
{
$hash->{name}=~/^(\S+)\s/;
my $short=$1;
$eibshort{$short}=$hash;
$eibshort{$hash->{ga}}=$short;
}
# Now write eibshort.pl
open PL, ">/etc/wiregate/eibshort.pl" || return "Could not open eibga.conf for reading";
my $count=0;
print PL "%eibshort = (\n";
for my $s (keys %eibshort)
{
if(ref $eibshort{$s})
{
print PL "\t'$s' => {\n";
for my $t (keys %{$eibshort{$s}})
{
print PL "\t\t'$t' => '$eibshort{$s}{$t}',\n";
}
print PL "\t},\n";
$count++;
}
else
{
print PL "\t'$s' => '$eibshort{$s}',\n"
}
}
print PL ");\n";
close PL;
}
# Eliminate back-translation from hashes
for my $k (keys %eibshort)
{
delete $eibshort{$k} unless $k=~/^[0-9]+\/[0-9]+\/[0-9]+$/;
}
for my $k (keys %eibpa)
{
delete $eibpa{$k} unless $k=~/^[0-9]+\.[0-9]+\.[0-9]+$/
}
# Sort patterns by decreasing length
my @eibshortpt=sort { length($b) cmp length($a) } keys %eibshort;
my @eibpapt=sort { length($b) cmp length($a) } keys %eibpa;
# act as a decoder filter for stdin
$/="\n";
while(<>)
{
for my $k (@eibshortpt)
{
my $p=quotemeta $k;
s/$p/$eibshort{$k}/ge;
}
for my $k (@eibpapt)
{
my $p=quotemeta $k;
s/$p/$eibpa{$k}/ge;
}
print;
}
Nun sieht ein Log entweder so aus:
Code:
tail /var/log/eib.log
2012-04-24 13:46:57.706,A_GroupValue_Write,0.0.0,6/2/186,0C 8A,23.24,,9.001,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:47:11.542,A_GroupValue_Write,1.1.18,6/4/191,00,0,,1.017,0,low,6,T_DATA_XXX_REQ,0
2012-04-24 13:47:37.939,A_GroupValue_Write,1.1.18,6/4/191,01,1,,1.017,0,low,6,T_DATA_XXX_REQ,0
2012-04-24 13:48:37.136,A_GroupValue_Write,0.0.0,14/2/138,0C 8A,23.24,,9.001,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:48:38.704,A_GroupValue_Write,1.1.18,6/4/191,00,0,,1.017,0,low,6,T_DATA_XXX_REQ,0
2012-04-24 13:48:43.120,A_GroupValue_Write,1.1.18,6/4/191,01,1,,1.017,0,low,6,T_DATA_XXX_REQ,0
2012-04-24 13:49:13.331,A_GroupValue_Write,0.0.0,14/2/138,0C 8A,23.24,,9.001,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:49:45.708,A_GroupValue_Write,0.0.0,14/0/138,0C 8A,23.24,,9.001,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:49:56.532,A_GroupValue_Write,1.1.18,6/4/191,00,0,,1.017,0,low,6,T_DATA_XXX_REQ,0
2012-04-24 13:51:31.269,A_GroupValue_Write,0.0.0,15/3/10,01,1,,1.002,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:51:31.515,A_GroupValue_Write,0.0.0,15/3/13,01,1,,1.002,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:51:31.794,A_GroupValue_Write,0.0.0,15/3/11,01,1,,1.002,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:51:31.997,A_GroupValue_Write,0.0.0,15/3/15,01,1,,1.002,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:51:32.082,A_GroupValue_Write,0.0.0,15/3/14,01,1,,1.002,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:51:32.148,A_GroupValue_Write,0.0.0,15/3/12,01,1,,1.002,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:51:32.214,A_GroupValue_Write,0.0.0,15/3/16,01,1,,1.002,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:52:24.094,A_GroupValue_Write,0.0.0,6/2/186,0C 8A,23.24,,9.001,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:55:42.479,A_GroupValue_Read,0.0.0,15/3/17,00,0,,1.002,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:55:42.789,A_GroupValue_Read,0.0.0,15/3/18,00,0,,1.002,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:55:42.853,A_GroupValue_Read,0.0.0,15/3/19,00,0,,1.002,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:55:42.919,A_GroupValue_Write,0.0.0,15/0/20,00,0,,1.001,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:56:31.304,A_GroupValue_Write,0.0.0,15/3/10,01,1,,1.002,0,low,7,T_DATA_XXX_REQ,0
oder so:
Code:
tail /var/log/eib.log | eibdecode
2012-04-24 13:46:57.706,A_GroupValue_Write,0.0.0,TA_A2,0C 8A,23.24,,9.001,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:47:11.542,A_GroupValue_Write,P_SZ_Decke,PM_SZ_Decke,00,0,,1.017,0,low,6,T_DATA_XXX_REQ,0
2012-04-24 13:47:37.939,A_GroupValue_Write,P_SZ_Decke,PM_SZ_Decke,01,1,,1.017,0,low,6,T_DATA_XXX_REQ,0
2012-04-24 13:48:37.136,A_GroupValue_Write,0.0.0,WD_Temperatur,0C 8A,23.24,,9.001,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:48:38.704,A_GroupValue_Write,P_SZ_Decke,PM_SZ_Decke,00,0,,1.017,0,low,6,T_DATA_XXX_REQ,0
2012-04-24 13:48:43.120,A_GroupValue_Write,P_SZ_Decke,PM_SZ_Decke,01,1,,1.017,0,low,6,T_DATA_XXX_REQ,0
2012-04-24 13:49:13.331,A_GroupValue_Write,0.0.0,WD_Temperatur,0C 8A,23.24,,9.001,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:49:45.708,A_GroupValue_Write,0.0.0,WA_Temperatur,0C 8A,23.24,,9.001,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:49:56.532,A_GroupValue_Write,P_SZ_Decke,PM_SZ_Decke,00,0,,1.017,0,low,6,T_DATA_XXX_REQ,0
2012-04-24 13:51:31.269,A_GroupValue_Write,0.0.0,SB_gelb1,01,1,,1.002,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:51:31.515,A_GroupValue_Write,0.0.0,SB_blau1,01,1,,1.002,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:51:31.794,A_GroupValue_Write,0.0.0,SB_rot1,01,1,,1.002,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:51:31.997,A_GroupValue_Write,0.0.0,SB_khaki1,01,1,,1.002,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:51:32.082,A_GroupValue_Write,0.0.0,SB_schwarz1,01,1,,1.002,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:51:32.148,A_GroupValue_Write,0.0.0,SB_gruen1,01,1,,1.002,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:51:32.214,A_GroupValue_Write,0.0.0,SB_gelb2,01,1,,1.002,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:52:24.094,A_GroupValue_Write,0.0.0,TA_A2,0C 8A,23.24,,9.001,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:55:42.479,A_GroupValue_Read,0.0.0,SB_rot2,00,0,,1.002,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:55:42.789,A_GroupValue_Read,0.0.0,SB_gruen2,00,0,,1.002,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:55:42.853,A_GroupValue_Read,0.0.0,SB_blau2,00,0,,1.002,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:55:42.919,A_GroupValue_Write,0.0.0,SA_Alarmanlage_aktiv,00,0,,1.001,0,low,7,T_DATA_XXX_REQ,0
2012-04-24 13:56:31.304,A_GroupValue_Write,0.0.0,SB_gelb1,01,1,,1.002,0,low,7,T_DATA_XXX_REQ,0
Have fun!
Fry
|

26.04.2012, 06:52
|
|
Erfahrener Benutzer
|
|
Registriert seit: 14.12.2011
Ort: Hessen
Beiträge: 988
|
|
...wer lieber die vollen GA-Namen und keine Kürzel hat:
Code:
$hash->{name}=~/^\s*(\S+)/;
my $short=$1;
$short='ZV_'.$1 if $hash->{name}=~/^Zeitversand.*(Uhrzeit|Datum)/; # short versions of "Zeitversand"
ersetzen durch
Code:
my $short=$hash->{name}
VG, Fry
|

26.04.2012, 07:54
|
|
Erfahrener Benutzer
|
|
Registriert seit: 07.05.2010
Ort: Bremen
Beiträge: 2.464
|
|
Danke!
Werde ich bestimmt in Zukunft nutzen!
__________________
Aus Bremen und Umgebung? Komm zum Stammtisch!
|

26.04.2012, 10:00
|
|
Erfahrener Benutzer
|
|
Registriert seit: 12.11.2009
Beiträge: 3.281
|
|
Sehr schön!
__________________
Stefan Werner, Geschäftsführer Elaborated Networks GmbH. Link zum Shop.
Bitte keine PNs. Fragen gehören ins Forum oder an support ät wiregate.de
Alle Informationen und Aussagen nach bestem Wissen und Gewissen.
|

27.04.2012, 02:11
|
 |
Erfahrener Benutzer
|
|
Registriert seit: 07.07.2007
Beiträge: 11.779
|
|
Gut das zu posten, weil so nen sehr kreativen Spass muss man in .next auch berücksichtigen; das geht zwar noch, kratzt aber schon hart an der Grenze (die Erde ist (k)eine Scheibe  )
Makki
__________________
EIB/KNX & HS3(+Lüfter+picoPSU80), Multiroom-AV mit Russound,mpd,vdr,DM8000, Profilux II+, N141 DALI, DMX, dez. Lüfter (RS485), Wärmepumpe (RS422), 30+ 1-Wire Temp,Luft&Bodenfeuchte,IRTrans
WireGate - Supportforum - bitte keine PN's!
|

27.04.2012, 07:43
|
|
Erfahrener Benutzer
|
|
Registriert seit: 14.12.2011
Ort: Hessen
Beiträge: 988
|
|
Zitat von makki
Gut das zu posten, weil so nen sehr kreativen Spass muss man in .next auch berücksichtigen; das geht zwar noch, kratzt aber schon hart an der Grenze (die Erde ist (k)eine Scheibe  )
Makki
|
Ich weiß, du magst Zahlen lieber als Wörter. Bei mir ist es umgedreht. Deshalb ist dieses Tool für mich sehr nützlich aber wohl kaum was für dich.
Kreativer Spaß ist Perl immer, zumal fast alles mit wenigen Zeilen geht (selbst der wiregated.pl hat nur 2300 Zeilen, ich schätze mal unter C++/perlembed wären das ruckzuck 10k).
Aber was meinst du mit Erde keine Scheibe... also da bist du einen Tick zu kryptisch, wenn ich noch verstehen soll, was du meinst...
Fry
|

27.04.2012, 08:43
|
|
Erfahrener Benutzer
|
|
Registriert seit: 12.11.2009
Beiträge: 3.281
|
|
Guten Morgen Fry,
Makki will Dir damit sagen, dass es gut ist, wenn er deine kreativen Perl-Entwürfe kennt, weil wir an einer Neuimplementierung des Plugin-Systems arbeiten (das ist mit .next gemeint).
Das gilt für alle. Je mehr Plugins wir kennen, desto eher können wir diese darauf untersuchen, ob es Auswirkungen geben könnte, bei der Neuentwicklung der "Plugin-Engine".
Da die Frage ohnehin kommt: Die Zielrichtung der Neuentwicklung wäre deutlich bessere Skalierbarkeit und Parallelisierbarkeit. Insbesondere aber auch Abtrennung von anderen vitalen Bestandteilen, damit ein "totes" Plugin nichts anderes ausbremsen kann.
Nein, es gibt dazu KEINEN Termin.
lg
Stefan
__________________
Stefan Werner, Geschäftsführer Elaborated Networks GmbH. Link zum Shop.
Bitte keine PNs. Fragen gehören ins Forum oder an support ät wiregate.de
Alle Informationen und Aussagen nach bestem Wissen und Gewissen.
|

27.04.2012, 08:51
|
 |
Erfahrener Benutzer
|
|
Registriert seit: 27.09.2008
Beiträge: 4.630
|
|
Top Firma
Zitat von StefanW
Nein, es gibt dazu KEINEN Termin.
|
Hoi
Ich finde es toll wie Ihr unter dem ganzen Druck (soviele Beiträge zum WG wie zur Zeit hab' ich ja noch nie gesehen) noch entwickeln könnt.
Und das auch noch hard- und softwareseitig, Respekt.
Da hätte es mir schon öfter "den Nucki usse g'haue" wie man hier so schön sagt. (etwa soviel wie da wäre mir schon längst "die Hutschnur gerissen")
Man merkt den Stress bei Euch schon, ist auch normal.
__________________
Grüsse Bodo Nach bst. Wissen, ohne Gewähr; Fragen gehören ins Forum, und nicht in mein Postfach; EibPC-Fan; Wiregate-Fan; Alix1d mit eibd, linknx, knxweb, 30x 1-Wire, mjpg_streamer, e-mail, sms, growl-notif., CUL; Dreambox8000HD stream VLC's, TV-Browser start-record; Fritzbox 7270, voip; HP ProCurve 1810G 24 GE; Zotac ZBOX HD-ND22 mit SU2300 und Ubuntu 11.10 FullHD; MusicPal; SqueezeboxBoom; NEU Russound C5; iPhone 5 IOS6.1 JB PHP Lighty
|

27.04.2012, 09:09
|
|
Erfahrener Benutzer
|
|
Registriert seit: 12.11.2009
Beiträge: 3.281
|
|
Hoi Bodo, danke sehr  .
So ein wenig Balsam tut derzeit ganz gut.
Nunja, um ehrlich zu sein, geht die ganze Schreiberei hier im Forum schon ein wenig zu Lasten des Fortschritts.
Gestern früh war eigentlich eingeplant, für die Herstellung eines Produktes, die CAM-Daten produktionsreif zu machen um es an den Platinenhersteller zu senden. Stattdessen musste ich eine völlig überflüssige GPL-Diskussion wegen eines eigentlich unbegründeten Verdachtes führen....
Unsere Neigung, fast alles zu beantworten zieht vermutlich weitere Fragen und Diskussionen an, daher sind wir derzeit auch am Überlegen, unsere diesbezügliche Haltung zu überdenken.
Ach, ab und an platzt uns auch die Hutschnur. Insbesondere wenn einer das Haar in der Suppe sucht. Bei Makki spürt man das Platzen nur eher als bei mir...
Umso mehr freuen uns Lob, freundliche Kommentare und einmal haben wir sogar ein tolles Paket voller Schokolade für das Wiregate Team nebst handgeschriebenen Brief dazu von einem lieben Kunden bekommen. Und wer hats erfunden?
glg
Stefan
__________________
Stefan Werner, Geschäftsführer Elaborated Networks GmbH. Link zum Shop.
Bitte keine PNs. Fragen gehören ins Forum oder an support ät wiregate.de
Alle Informationen und Aussagen nach bestem Wissen und Gewissen.
|

27.04.2012, 15:36
|
|
Erfahrener Benutzer
|
|
Registriert seit: 14.12.2011
Ort: Hessen
Beiträge: 988
|
|
Lieber Stefan,
beim positiven Feedback schließe ich mich (wieder einmal) an.
Zum Thema Plugin-Engine: ich finde die existierende Plugin-Engine bereits sehr gut, aber falls das für euch hilfreich ist, liefere ich hier ein paar Anregungen, die aus meiner Sicht gerade dem Anfänger die Plugin-Schreiberei erleichtern würden:
* Einfache Unterscheidung des Aufrufgrundes durch eine entsprechend vorbesetzte Variable $event (siehe Plugin-Skeleton für einen Vorschlag)
* %plugin_subscribe: separat für Telegrammtypen (write/read/response) ermöglichen -> reduziert Aufrufe mit sofortigem return, vermeidet mögliche Anfängerfehler
* %eibgaconf auch invers indizieren (also $eibgaconf{$ga}{name} sollte genauso funktionieren wie $eibgaconf{$name}{ga}) -> das ist sehr leicht zu realisieren, vermutlich eine einzige Zeile oder foreach-Schleife im wiregated.pl. Ein "Schmankerl" für mein GA-Schema wäre dabei die Verwendung nur des ersten Wortes im GA-Namen (bei meinem GA-Namensschema ist das erste Wort ein eindeutiges Kürzel, zB TA_TE3 = Außentemperatur Terrasse Obergeschoss).
* "Wecker"-Funktion: man sollte den Zeitpunkt des nächsten zyklischen Aufrufs absolut festlegen können -> vermeidet Zeitrechnerei
Jetzt wird's noch ein wenig esoterisch:
* Möglichkeit, aus einem Plugin ein anderes Plugin mit definiertem Zeitversatz aufzurufen.
* Sub-Arrays und -Hashes in %plugin_info erlauben (aktuell arbeite ich mit einer Krücke, siehe zB im Heizungsregler) -> erleichtert dem Anfänger die Persistence.
* %plugin_info verschiedener Plugins so trennen, dass _versehentliches_ Beschreiben "fremder" (zu anderen Plugins gehörender) Variablen vermieden wird (public/private/friend-Feature). -> vermeidet Fehler durch schlechte Kapselung
* Zeitbeschränkung auf 10s aufheben, stattdessen in einem parallelisierten System aber verbieten, dass ein noch laufendes Plugin nicht ein zweites Mal aufgerufen wird (no reentry).
* Möglichkeit, die EIB-Telegrammqueue einzusehen. Beispiel: Wackelkontakt am Schlüsselbrett führt heute zu "Auf Wiedersehen XY - Willkommen XY"-Meldungen - das muss umständlich mittels Analyse von $plugin_info{$plugname.'_last'} entprellt werden - hilfreich wäre eine Möglichkeit, im Plugin nachzusehen ob schon weitere Telegramme auf den abonnierten GAs anliegen und diese ggf. schon zu verarbeiten)
NICHT SO WICHTIG: Ausführungsgeschwindigkeit. Die ist bereits gut.
Das fällt mir einfach auf die Schnelle ein.
Grüße,
Fry
|
| Themen-Optionen |
|
|
| Ansicht |
Linear-Darstellung
|
Forumregeln
|
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 12:37 Uhr.
|