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):
Die Aussenhelligkeit wird perfekt geschrieben, die Energie nicht.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:
Auf der GA WMZ_3OG_ENERGIE wird tatsächlich geschrieben, das Wiregate loggte zuletzt folgendes: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;
Die RRDs für den WMZ werden aber leider alle nicht geschrieben. Siehe Bild im Anhang. Bild.JPGCode: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
Interessanter Weise kommt die Warnung nur für das selbstgeschriebene PlugIn und nicht für den Aufruf im Logikprozessor...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"
Auch eine Änderung mit int() hilft nicht. Z.B.: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);
Mir ist natürlich klar, dass ich nicht alle drei Zeilen brauche, aber ich möchte den Unterschied verstehen und ich hoffe, dass mir die Anlage von drei RRD dabei hilft.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 numeric
Versuch'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 :
VGCode: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:
Viele GrüßeCode:# 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
-
Hi Matthias,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...
Ich probiere Deinen Code trotzdem einmal über Nacht, aber so richtig würde ich nicht verstehen, warum es damit klappt. Dann müsste es irgendwas mit der Cachezeit zutun haben. Die Temperatur oben wird bei Änderung 5% oder so gesendet. Der Zählerwert nur alle 12h oder so.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
-
Was genau funktioniert denn nicht? Der erste Fehler der mir auffällt: beide Logiken haben den Namen "complex"; Namen müssen aber eindeutig sein, sonst überschreibt die zweite Definition die erstere. Am besten nennst du die Logiken zB "AlarmKuehlschrank" und "AlarmGefriertruhe".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
8/0/60 ist ein FensterkontaktCode: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)
Danke für eure HilfeCode:[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
-
Ich bin nicht auf die Idee gekommen, das mal auszuprobieren, glaube aber nicht, dass sub{} ausserhalb von translate geht.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:
IMHO sollte der Logikprozessor Dir jetzt eine Fehlermeldung auf der Delay-Zeile geben, und wenn Du die durch delay=>60, o.ä. ersetzt das ganze akzeptieren. Dann hast Du Deine AntwortCode: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.
Mit den Return "cancel" setze ich den Timer zurück, sobald das Fenster geschlossen wird.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