Ankündigung
Einklappen
Keine Ankündigung bisher.
Neues Plugin: Logikprozessor.pl
Einklappen
X
-
Moin moin,
frohes neues Jahr Euch allen!
Ich habe irgendwie ein Problem und vermute, dass ich Tomaten auf den Augen habe... Ich versuche mittels LP Zählerstände in RRDs zu schreiben. Gibt es ein Problem, wenn ich einen DPT 14.031 Typ verwende?
Folgenden Config-Code verwende ich (ausschnittsweise):
Code:RRD_Aussenhelligkeit => { receive=>'Aussenhelligkeit', translate=>sub{update_rrd('Aussenhelligkeit','',$input)}, debug=>1 }, RRD_WMZ_3OG_ENERGIE => { receive=>'WMZ_3OG_ENERGIE', translate=>sub{update_rrd('WMZ_3OG_ENERGIE','',$input)}, debug=>1 },
Deshalb habe ich mir noch ein eigenes Plugin geschrieben um es ohne LP auszuprobieren:
Code:# Zyklisch virtuelle Werte senden # Aufrufzyklus = Heartbeat RRD $plugin_info{$plugname.'_cycle'} = 275; # MAIN update_rrd("counterWMZ_3OG_ENERGIE","","4/7/1","COUNTER",24,7); update_rrd("dcounterWMZ_3OG_ENERGIE","","4/7/1","COUNTER",24); update_rrd("hcounterWMZ_3OG_ENERGIE","","4/7/1","COUNTER",1); return;
Code:2017-01-01 07:13:38.389,A_GroupValue_Write,1.3.38,4/7/1,45 89 FF FF,4415.9995,DPT_Value_Energy,14.031,0,low,5,T_DATA_XXX_REQ,0 2017-01-01 08:03:38.249,A_GroupValue_Write,1.3.38,4/7/1,45 8A 07 FF,4416.9995,DPT_Value_Energy,14.031,0,low,5,T_DATA_XXX_REQ,0 2017-01-01 08:58:37.954,A_GroupValue_Write,1.3.38,4/7/1,45 8A 0F FF,4417.9995,DPT_Value_Energy,14.031,0,low,5,T_DATA_XXX_REQ,0 2017-01-01 10:08:37.549,A_GroupValue_Write,1.3.38,4/7/1,45 8A 17 FF,4418.9995,DPT_Value_Energy,14.031,0,low,5,T_DATA_XXX_REQ,0 2017-01-01 11:53:37.138,A_GroupValue_Write,1.3.38,4/7/1,45 8A 1F FF,4419.9995,DPT_Value_Energy,14.031,0,low,5,T_DATA_XXX_REQ,0 2017-01-01 13:33:36.619,A_GroupValue_Write,1.3.38,4/7/1,45 8A 27 FF,4420.9995,DPT_Value_Energy,14.031,0,low,5,T_DATA_XXX_REQ,0 2017-01-01 15:28:35.991,A_GroupValue_Write,1.3.38,4/7/1,45 8A 2F FF,4421.9995,DPT_Value_Energy,14.031,0,low,5,T_DATA_XXX_REQ,0
Die GA ist korrekt im GA-Editor des Wiregateservers eingetragen (siehe zweites Bild im Anhang). Bild2.JPG
Jemand einen Tipp für mich? Verzweifele so langsam daran...
VG, SvenZuletzt geändert von Robosoc; 01.01.2017, 20:25.
Kommentar
-
Habe gerade entdeckt, dass im Log folgende Warnung steht
Code:2017-01-01 21:18:08.303,ZYKLundRRD.pl,Warning: Argument "4/7/1" isn't numeric in multiplication (*) at /usr/sbin/wiregated.pl line 1294. 2017-01-01 21:18:08.304,ZYKLundRRD.pl,Warning: Argument "4/7/1" isn't numeric in multiplication (*) at /usr/sbin/wiregated.pl line 1294. 2017-01-01 21:18:08.308,ZYKLundRRD.pl,Warning: Argument "4/7/1" isn't numeric in multiplication (*) at /usr/sbin/wiregated.pl line 1294.
Aber was heißt das nun? Ist ein DPT 14.031 in einem RRD nicht verwendbar?
VG,
Sven
Kommentar
-
An den doppelten Anführungszeichen liegt es leider auch nicht. Der folgende Code hat leider auch nichts gebracht. Es kommen die gleichen Warnmeldungen bezüglich "isn't numeric"
Code:update_rrd("counterWMZ_3OG_ENERGIE","",'4/7/1',"COUNTER",24,7); update_rrd("dcounterWMZ_3OG_ENERGIE","",'4/7/1',"COUNTER",24); update_rrd("hcounterWMZ_3OG_ENERGIE","",'4/7/1',"COUNTER",1);
Code:update_rrd("counterWMZ_3OG_ENERGIE","",int('4/7/1'),"COUNTER",24,7);
Vg,
SvenZuletzt geändert von Robosoc; 02.01.2017, 08:21.
Kommentar
-
Hi,
stimmt, "4/7/1" isn't numericVersuch's mal mit einem knx_read - zumindest im separaten Plugin sollte das gehen. Du willst ja den Wert den der Bus liefert ins rrd schreiben, und nicht den String "4/7/1".
Bei mir funktioniert es. Beispiel :
Code:update_rrd("SollTemp_BadEG","",knx_read("3/0/18",0,9));
Matthias
Kommentar
-
Hallo
ich würde gerne mit dem Logikprozessor meine Kühl und Gefriergeräte überwachen und in der Visu darstellen.
Die Geräte laufen über einen Merten Aktor mit Stromerkennung.
vom Aktor gibt es die Rückmeldung an aus, den Stromwert, und einen Stromschwellenwert.
Mit der Anzeige funktioniert das auch über den Schrllenwert. Problem ist hier, dass die Geräte nun nicht dauerhaft Strom ziehen. Die Geräte ziehen in den Pausen, in denen der Kompressor nicht läuft keinen Strom. Dann wird momentan Ausfall angezeigt.
Es soll aber nur dann Fehlfunktion angezeigt weren, wenn das Gerät über einen längeren Zeitraum keinen Strom zieht.
Ist das mit dem Logikprozessor umsetzbar?
LG Andre
Kommentar
-
Hallo Andre,
ich würde dazu mit diesem Beispiel aus der Logikprozessor-Config starten und z.B. fünf Minuten lang jeweils einen Wert lesen - und nur wenn alle zu niedrig sind den Fehler auslösen:
Code:# 9. Ein komplexerer Fall nur zur Demonstration: hier besteht der Status des Logikprozessors aus mehreren Werten. # Es wird der Mittelwert aus letztem, vorletztem und aktuellem Wert gesendet, und zwar mit 30s Verzoegerung. mittelwert => { receive=>'9/5/205', transmit=>'9/5/206', delay=>30, state => {val1=>0, val2=>0}, translate => sub { my $oldest=$state->{val2}; $state->{val2}=$state->{val1}; $state->{val1}=$input; return ($oldest+$state->{val2}+$input)/3; }, },
DirkBaubeginn: 1676d. Sanierungsbeginn: 6/2010. Einzug: 9/2014. Fertig? Nie ;-)
Kommentar
-
Zitat von Matze76 Beitrag anzeigenstimmt, "4/7/1" isn't numeric
sorry, für die späte Rückmeldung. Danke für Deine Antwort, aber die habe ich nicht ganz verstanden...warum ist es logisch, dass "4/7/1" nicht numerisch ist? Wenn Du die doppelten Anführungszeichen meinst, die eher auf einen String hindeuten...deshalb habe ich es ja wie oben geschrieben auch mit einfachen '4/7/1' und keinen probiert. Ein 4Byte DPT 14.031 ist doch eindeutig numerisch!
Und vor allem funktioniert der exakt gleiche Aufruf für Temperaturwerte DPT 14.068 Werte im LP einwandfrei...
Code:RRD_WMZ_3OG_VORLAUFTEMP => { receive=>'WMZ_3OG_VORLAUFTEMP', translate=>sub{update_rrd('WMZ_3OG_VORLAUFTEMP','',$input)}},
VG,
Sven
Kommentar
-
Hi Sven,
sorry, nein, die Anführungszeichen meinte ich nicht.
Zumindest wenn du außerhalb des Logikprozessors mit einem eigenen Plugin arbeitest, erwartet die update_rrd Funktion den Wert, der ins rrd geschrieben werden soll (z. B. 21 [Grad]). Wenn du "4/7/1" reinsetzt, ist das erstmal einfach nur ein nicht numerischer String. Die Funktion weiß nicht dass das eine GA ist, von der gelesen werden soll. D.h. erst mit knx_read wird der Wert von deiner GA 4/7/1 gelesen, und dieser wird dann ins rrd geschrieben.
Die Werte, bei denen es einwandfrei funktioniert, sind das alles Werte von Wiregate/1-Wire-Sensoren?
VG Matthias
Kommentar
-
Hallo Dirk
Danke für deinen Tipp!
Leider funktioniert es nicht so wie gedacht. Vermutlich habe ich doch etwas falsch gemacht.
Folgenden Eintrag habe ich in die Config des Logikprozessors eingegeben:
# Alarm Gefriertruhe
complex => { receive=>'2/5/44',
transmit=>'10/0/102',
delay=>600,
state => {val1=>0, val2=>0},
translate => sub { $state->{val2}=$state->{val1}; $state->{val1}=$state->{result};
$state->{val2}+$state->{val1}+$input; },
},
# Alarm Kuehlschrank
complex => { receive=>'2/5/41',
transmit=>'10/0/103',
delay=>600,
state => {val1=>0, val2=>0},
translate => sub { $state->{val2}=$state->{val1}; $state->{val1}=$state->{result};
$state->{val2}+$state->{val1}+$input; },
Die Adresse 2/5/44 und 2/5/41 sind Stromschwellenwerte, sprich 0 oder 1.
ETS Stromwert1.PNGCometvisu Kühl.PNG
Kommentar
-
Zitat von katerina Beitrag anzeigenLeider funktioniert es nicht so wie gedacht. Vermutlich habe ich doch etwas falsch gemacht.
VG
Micha
Kommentar
-
Hallo zusammen
Weiss jemand ob man im "delay=>" eine sub eintragen kann? Ich möchte bei einer Logik die Delayzeit in abhängikeit eines Input regeln, bekomme aber immer eine Fehlermeldung. Da ich in perl nur copy/paste kann bin ich nicht sicher ob das nicht geht, oder mein code falsch ist.
Folgende Logik habe ich:
Wenn das Fenster zu lange (abhängig von temp) offen ist, kommt ein Alarm
Code:fensteralarm_badOG => { receive=>'8/0/60', fetch=>'7/2/0', transmit=>'8/0/61', delay=> sub { '0.46667' * $input->[1] + '6' } , translate => sub { if ($input->[0] == 1) {return "1";} else {return "cancel";} }, },
8/0/61 Alarm
7/2/0 Aussentemp
Folgenden Fehler bekomme ich: (logik ist in Zeile 40)
Code:[TABLE="class: ui_table sortable"] [TR="class: mainhigh, bgcolor: #EFEFEF"] [TD] [/TD] [TD]config error: Global symbol "$input" requires explicit package name at (eval 236) line 40.[/TD] [/TR] [/TABLE]
Gruess Markus
Kommentar
-
Zitat von mmarkus Beitrag anzeigenHallo zusammen
Weiss jemand ob man im "delay=>" eine sub eintragen kann? Ich möchte bei einer Logik die Delayzeit in abhängikeit eines Input regeln, bekomme aber immer eine Fehlermeldung. Da ich in perl nur copy/paste kann bin ich nicht sicher ob das nicht geht, oder mein code falsch ist.
Ich habe Deinen Code mal kurz formatiert, damit er übersichtlicher wird, bzw die Fehlermeldungen zumindest man näher zum Fehler kommen:
Code:fensteralarm_badOG => { receive=>'8/0/60', fetch=>'7/2/0', transmit=>'8/0/61', delay=> sub { '0.46667' * $input->[1] + '6' }, translate => sub { if ($input->[0] == 1) { return "1"; } else { return "cancel"; } }, },
BTW - return "cancel"? Sollte da nicht return undef stehen?
Kommentar
-
Hallo johnny
Danke für deine Hilfe.
Habs soeben mit deinem code ausprobiert, er gibt die Fehlermeldung tatsächlich in der Delay Zeile.
Ich habs jetzt anders gelöst, die Delayzeit berechne ich in der Translate sub, und speichere sie im Hash. Bei Delay rufe ich einfach den Hash auf, scheint bis jetzt zu funktionieren.
Code:fensteralarm_badOG => { receive=>'8/0/60', fetch=>'7/2/0', transmit=>'8/0/61', translate => sub { $plugin_info{"Fenser_alarm_timer"} = ('0.46667' * $input->[1] + '6')*'60' ; if ($input->[0] == 1) { return "1"; } else { return "cancel"; } }, delay=> $plugin_info{"Fenser_alarm_timer"} , debug=>1, },
Zuletzt geändert von mmarkus; 02.03.2017, 22:33.
Kommentar
-
Hallo,
benutzt jemand erfolgreich die trigger-Option mit der Möglichkeit nur auf bestimmte Werte einer GA zu reagieren?
Ich meine so etwas wie im Beispiel 17c: trigger=>['ga1==1', 'ga2>2', 'ga3==ANY', 'within 2min', 'all'} ,nur für eine GA.
Genügt dafür ein trigger=>'meineGa==1' ?
Ciao, PP
Kommentar
Kommentar