Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Nachdem es im Moment praktischerweise regnet habe ich gerade mal überprüft was sich am entsprechenden Binäreingang so tut...
...und es kommt alle 10-15 Minuten ein "EIN" an die entsprechende GA.
->Das ist doch eine gute Grundlage.
Gibt es schon einen Code der sich zum (Beta-)Testen eignen würde? Im Moment ist hier (wieder) Regen und ein Test würde sich deshalb anbieten.
Nur falls ich damit zur Weiterentwicklung beitragen kann...
Ich schick dir per PN mal den akt. Status.
Muss heute noch das Thema zykl. rrd befüllen bei azykl. Aufruf implementieren. Ich hasse nämlich Performance Verschwendung .
Hab heute noch einen Bug gesucht, da die Intensität und Mengenzahler nicht 100% korreliert haben. Sollte nun passen.
Ich hab mich bemüht den Code gut zu kommentieren, gerne mit Fragen melden.
Im Moment hab ich das mal so umgesetzt, dass die aktuellen Zahlerstände mit jedem Impuls gesendet werden (mit wählbarer Ratenbegrenzung).
Zusätzlich werden Zählerstände inkl. Vortages/Vormonats etc. daten beim Reset nach Mitternacht gesendet.
Ich weiß im Moment nicht, wie lange Werte aus dem eibd-Cache kommen, wenn man die CV verwendet. Sollte aber so reichen. Das heist im schlimmsten Fall nach einem Reboot des WireGates, dass man erst wieder nach 24h die Zaehlerstände angezeigt bekommt.
Wäre nett wenn du die Werte etc. ein wenig plausibilisieren könntest.
Die rrds sind im Moment so gebaut, dass sie immer auch den Verlauf über den Tag/Woche etc. anzeigen (Sägezahnkurven), der Endwert ist dann immer der Tages/Wochensummenwert. Das ist aus meiner Sicht aussagekräftiger als eine waagrechte Linie. Den genauen Wert lasse ich mir als Infofeld in der CV anzeigen, hab ich aber noch nicht konfiguriert.
Edit 23:35 - Intensitätsmittelung für rrd nochmal korrigiert.
lg
Robert
Code:
# Regenmengenmessung abtasten und verarbeiten
# V1.00 2013-10-30
#return;
use Date::Calc qw(:all); # benötigt ein Paket, das mit "apt-get install libdate-calc-perl" am WG unter "Updates" installiert werden kann.
### Definitionen
### Hier werden die Werte/Gruppenadressen definiert
my $Impuls_ga = "10/1/100"; # Binaereingang Status DPT1
my $Intensitaet_ga = "10/1/101"; # Leistung, Regenintensität, etc. DPT9
my $Zaehlerstand_ga = "10/1/102"; # Zaehlerstand DPT14
my $Tageszaehler_ga = "10/1/103"; # Zaehlerstand DPT14
my $Tageszaehler_alt_ga = "10/1/104"; # Zaehlerstand DPT14
my $Wochenzaehler_ga = "10/1/105"; # Zaehlerstand DPT14
my $Wochenzaehler_alt_ga = "10/1/106"; # Zaehlerstand DPT14
my $Monatszaehler_ga = "10/1/107"; # Zaehlerstand DPT14
my $Monatszaehler_alt_ga = "10/1/108"; # Zaehlerstand DPT14
my $Jahreszaehler_ga = "10/1/109"; # Zaehlerstand DPT14
my $Jahreszaehler_alt_ga = "10/1/110"; # Zaehlerstand DPT14
my $Userzaehler_ga = "10/1/111"; # Zaehlerstand DPT14
my $Userzaehler_alt_ga = "10/1/112"; # Zaehlerstand DPT14
my $Userzaehler_ResetTime = "10/1/13"; # Zaehlerstand DPT14
my $Reset_Userzaehler_ga = "10/1/114"; # Reset User-Zaehlerstand DPT1
# Als Impuls wird jede Änderung der Impuls_ga gezaehlt 0=>1 und 1=>0
# Sollte der Regenmengenzähler etc. nicht zw. 0 und 1 wechseln, sondern nur kurze Impulse schicken,
# so ist der Binäreingang auf UM zu parametrieren.
# Die Einheit der Menge je impuls wird auch für die Intensitäts bzw. Leistungsberechnung verwendet
# 0.3mm/Impuls => Intensität wird mit mm/h ausgegeben
# 0.001kWh/Impuls => Leistung wird in kW ausgegeben, wenn Watt gewünscht => 1Wh/Impuls eingeben
my $Menge_je_Impuls = 0.3; # 0.3mm je Impuls = 0.3L/m2 je Impuls
my $Min_Intervall = 5; # zB >5s Telegramm wir nur gesendet, wenn mind. 5s vergangen sind
# Bei 5s erfolgt eine Aktualisierung alle max. 5 und min. 10sec
### Ende Definitionen
# Eigenen Aufruf-Zyklus auf 300 Sekunden setzen
# Zyklischer Aufruf fuer rrd-update
$plugin_info{$plugname.'_cycle'} = 300;
# Manuelles setzen des Zaehlerstandes. Zeile einkommentieren und editieren, speichern,
# wieder auskommentieren und erneut speichern.
#$plugin_info{$plugname.'_Zaehlerstand'} = 178;
# Reset der Tages/Wochen/Monats/Jahres-Zaehler jeweils innerhalb der ersten 5min nach Mitternacht
my $sec;
my $min;
my $hour;
my $mday;
my $mon;
my $year;
my $wday; # Wochentag 0-6 entspricht So-Sa
my $yday;
my $isdst;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900;
$mon += 1;
my $write = $plugin_info{$plugname.'_written'};
if (($hour == 0 and $min < 6) and $write == 0) {
# Sicherstellen, dass Reset nur 1x Aufgerufen wird
$plugin_info{$plugname.'_written'} = 1;
$plugin_info{$plugname.'_Tageszaehler_alt'} = $plugin_info{$plugname.'_Tageszaehler'};
$plugin_info{$plugname.'_Tageszaehler'} = 0; # Tageszahler 0 setzen
if ($wday == 1) { # Montag
$plugin_info{$plugname.'_Wochenzaehler_alt'} = $plugin_info{$plugname.'_Wochenzaehler'};
$plugin_info{$plugname.'_Wochenzaehler'} = 0; # Wochenzaehler 0 setzen
}
if ($mday == 1) { # 1. Tag des Monats
$plugin_info{$plugname.'_Monatszaehler_alt'} = $plugin_info{$plugname.'_Monatszaehler'};
$plugin_info{$plugname.'_Monatszaehler'} = 0; # Monatszaehler 0 setzen
}
if ($yday == 0) { # 1. Tag des Jahres
$plugin_info{$plugname.'_Jahreszaehler_alt'} = $plugin_info{$plugname.'_Jahreszaehler'};
$plugin_info{$plugname.'_Jahreszaehler'} = 0; # Jahreszaehler 0 setzen
}
# Aktuelle zaehlerstaende senden (1x/Tag)
knx_write($Zaehlerstand_ga,$plugin_info{$plugname.'_Zaehlerstand'},14); # Zaehlerstand als DPT14 auf den Bus schreiben
knx_write($Tageszaehler_ga,$plugin_info{$plugname.'_Tageszaehler'},14); # Zaehlerstand als DPT14 auf den Bus schreiben
knx_write($Wochenzaehler_ga,$plugin_info{$plugname.'_Wochenzaehler'},14); # Zaehlerstand als DPT14 auf den Bus schreiben
knx_write($Monatszaehler_ga,$plugin_info{$plugname.'_Monatszaehler'},14); # Zaehlerstand als DPT14 auf den Bus schreiben
knx_write($Jahreszaehler_ga,$plugin_info{$plugname.'_Jahreszaehler'},14); # Zaehlerstand als DPT14 auf den Bus schreiben
knx_write($Userzaehler_ga,$plugin_info{$plugname.'_Userzaehler'},14); # Zaehlerstand als DPT14 auf den Bus schreiben
# Vorperiodenzaehlerstaende senden (1x/Tag)
knx_write($Tageszaehler_alt_ga,$plugin_info{$plugname.'_Tageszaehler'},14); # Zaehlerstand als DPT14 auf den Bus schreiben
knx_write($Wochenzaehler_alt_ga,$plugin_info{$plugname.'_Wochenzaehler'},14); # Zaehlerstand als DPT14 auf den Bus schreiben
knx_write($Monatszaehler_alt_ga,$plugin_info{$plugname.'_Monatszaehler'},14); # Zaehlerstand als DPT14 auf den Bus schreiben
knx_write($Jahreszaehler_alt_ga,$plugin_info{$plugname.'_Jahreszaehler'},14); # Zaehlerstand als DPT14 auf den Bus schreiben
knx_write($Userzaehler_alt_ga,$plugin_info{$plugname.'_Userzaehler'},14); # Zaehlerstand als DPT14 auf den Bus schreiben
}
elsif (($hour == 0 and $min > 6) and $write == 1) {
$plugin_info{$plugname.'_written'} = 0;
}
# Plugin an Gruppenadressen "anmelden"
$plugin_subscribe{$Impuls_ga}{$plugname} = 1;
$plugin_subscribe{$Reset_Userzaehler_ga}{$plugname} = 1;
# aktuelle Zeit merken, um überall mit der exakt gleichen Zeit zu rechnen
my $Zeit_aktuell = time();
# Auf Reset Telegram EIN reagieren => Userzaehlerstand zuruecksetzen
if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $Reset_Userzaehler_ga) {
$plugin_info{$plugname.'_Userzaehler_alt'} = $plugin_info{$plugname.'_Userzaehler'};
$plugin_info{$plugname.'_Userzaehler'} = 0; # Monatszaehler 0 setzen
return;
}
# Auf Write Befehl EIN/AUS reagieren, zyklischen Aufruf ignorieren
elsif ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $Impuls_ga) {
# bei jedem Aufruf Zaehlerstand um eine Einheit erhöhen
$plugin_info{$plugname.'_Zaehlerstand'} = $plugin_info{$plugname.'_Zaehlerstand'} + $Menge_je_Impuls;
$plugin_info{$plugname.'_Tageszaehler'} = $plugin_info{$plugname.'_Tageszaehler'} + $Menge_je_Impuls;
$plugin_info{$plugname.'_Wochenzaehler'} = $plugin_info{$plugname.'_Wochenzaehler'} + $Menge_je_Impuls;
$plugin_info{$plugname.'_Monatszaehler'} = $plugin_info{$plugname.'_Monatszaehler'} + $Menge_je_Impuls;
$plugin_info{$plugname.'_Jahreszaehler'} = $plugin_info{$plugname.'_Jahreszaehler'} + $Menge_je_Impuls;
$plugin_info{$plugname.'_Userzaehler'} = $plugin_info{$plugname.'_Userzaehler'} + $Menge_je_Impuls;
$plugin_info{$plugname.'_ZS_tlast'} = $Zeit_aktuell ;
$plugin_info{$plugname.'_impulse'} = $plugin_info{$plugname.'_impulse'} +1;
# Intesitaet/Zaehlerstand auf Bus schicken nur wenn Intervall überschritten
if ($Zeit_aktuell - $plugin_info{$plugname.'_tlast'} > $Min_Intervall ) {
# Leistung = Impulse*Menge_je_Impuls*3600/dt
my $Intensitaet_aktuell = $plugin_info{$plugname.'_impulse'} * 3600.0 * $Menge_je_Impuls/($Zeit_aktuell-$plugin_info{$plugname.'_tlast'});
knx_write($Intensitaet_ga,$Intensitaet_aktuell,9); # Leistung als DPT9 auf den Bus schreiben
knx_write($Zaehlerstand_ga,$plugin_info{$plugname.'_Zaehlerstand'},14); # Zaehlerstand als DPT14 auf den Bus schreiben
knx_write($Tageszaehler_ga,$plugin_info{$plugname.'_Tageszaehler'},14); # Zaehlerstand als DPT14 auf den Bus schreiben
knx_write($Wochenzaehler_ga,$plugin_info{$plugname.'_Wochenzaehler'},14); # Zaehlerstand als DPT14 auf den Bus schreiben
knx_write($Monatszaehler_ga,$plugin_info{$plugname.'_Monatszaehler'},14); # Zaehlerstand als DPT14 auf den Bus schreiben
knx_write($Jahreszaehler_ga,$plugin_info{$plugname.'_Jahreszaehler'},14); # Zaehlerstand als DPT14 auf den Bus schreiben
knx_write($Userzaehler_ga,$plugin_info{$plugname.'_Userzaehler'},14); # Zaehlerstand als DPT14 auf den Bus schreiben
$plugin_info{$plugname.'_tlast'} = $Zeit_aktuell;
$plugin_info{$plugname.'_impulse'} = 0;
}
return;
}
else {
# zyklischer Aufruf ==> rrd aktualisieren
# Intensitaet fuer rrd wird bereits gemittelt aus den Impulsen der letztem 5min berechnet.
my $Menge = ($plugin_info{$plugname.'_Zaehlerstand'}-$plugin_info{$plugname.'_Zaehlerstand2'});
my $Intensitaet= $Menge * 3600.0 /($Zeit_aktuell-$plugin_info{$plugname.'_tlast2'});
# Zeit/Zaehlerstand zum rrd-Speicherzeitpunkt merken
$plugin_info{$plugname.'_tlast2'} = $Zeit_aktuell;
$plugin_info{$plugname.'_Zaehlerstand2'} = $plugin_info{$plugname.'_Zaehlerstand'};
update_rrd("Regen_Intensitaet","",$Intensitaet);
update_rrd("Regen_Zaehlerstand","",$plugin_info{$plugname.'_Zaehlerstand'});
update_rrd("Regen_Tageszaehler","",$plugin_info{$plugname.'_Tageszaehler'});
update_rrd("Regen_Wochenzaehler","",$plugin_info{$plugname.'_Wochenzaehler'});
update_rrd("Regen_Monatszaehler","",$plugin_info{$plugname.'_Monatszaehler'});
update_rrd("Regen_Jahreszaehler","",$plugin_info{$plugname.'_Jahreszaehler'});
update_rrd("Regen_Userzaehler","",$plugin_info{$plugname.'_Userzaehler'});
}
return;
Werd mir das die nächsten Tage mal ansehen. Ich denke, das wäre ein brauchbarer Weg, dass eine leere GAs auch verhindert, dass ein rrd bzw. Zähler angelegt wird.
Das apt-get für die lib werde ich in den Kommentar hinzufügen.
Ich habe testhalber alle Werte und rrd's in der CV angelegt und nachdem es über Nacht auf gestern geregnet hat sieht es jetzt so aus, dass bis auf Intensität und Gesamtmgenge (noch?) nichts angezeigt wird.
rrd's sind aber befüllt worden und zeigen immer noch den letzten(?) Wert an. Soll das so sein? Ich denke zumindest bei der Tagesmenge müsste ich ja einen Wert haben, oder?
Das ist erstmal eigenartig, aber mir ist auch nicht ganz klar, welche Werte hinter den Anzeigen in der CV stehen.
Hatte die Telegramme soweit getestet und grad wiederholt, siehe Anhang.
==> Die Aktuellen Zählerstände werden mit jedem Impuls gesendet.
Hast du in den Info-Felder die Zählerstände der Vorperiode oder die aktuellen? Die Vorperioden-Zählerstände werden nämlich nur 1x/Tag gesendet, ich kann hier gerne noch ein zyklisches senden bzw. Aktualisieren per GA (über Trigger in der CV) hinzufügen.
Wie lange läuft das plugin bzw. die CV Seite schon bei dir?
Hab da noch einen Bug gefunden, werde den im letzten Post korrigieren, hat aber nichts mit deinem Problem zu tun.
Werde in jedem Fall heute noch eine CV Seite zusammenbasteln, damit ich dein Problem besser nochvollziehen kann. Ideal wäre es, wenn du mir den Ausschnitt aus der CV config bzw. dein parametriertes Plugin per PN schicken kannst, dann kann ich das querchecken.
EDIT: Hab grad in der CV eine Seite dazugebastelt. Also bei mir funktioniert das soweit .
Nachdem man leider nur den letzten Beitrag editieren kann, hier die korrigierte Passage (hier haben die _alt gefehlt):
Code:
# Vorperiodenzaehlerstaende senden (1x/Tag)
knx_write($Tageszaehler_alt_ga,$plugin_info{$plugname.'_Tageszaehler_alt'},14); # Zaehlerstand als DPT14 auf den Bus schreiben
knx_write($Wochenzaehler_alt_ga,$plugin_info{$plugname.'_Wochenzaehler_alt'},14); # Zaehlerstand als DPT14 auf den Bus schreiben
knx_write($Monatszaehler_alt_ga,$plugin_info{$plugname.'_Monatszaehler_alt'},14); # Zaehlerstand als DPT14 auf den Bus schreiben
knx_write($Jahreszaehler_alt_ga,$plugin_info{$plugname.'_Jahreszaehler_alt'},14); # Zaehlerstand als DPT14 auf den Bus schreiben
knx_write($Userzaehler_alt_ga,$plugin_info{$plugname.'_Userzaehler_alt'},14); # Zaehlerstand als DPT14 auf den Bus schreiben
Soweit ich erinnere bedient sich die CV nur der Werte die ein bestimmtes maximales Alter haben.
Nun wird (warum eigentlich) aber nur 1x am Tag gesendet. Ich tippe auf einen Fehler an dieser Stelle. Ich würde das Plugin komplett umbauen und mit einem "Array of Hashes" (->google) arbeiten.
Dem Plugin würde ich dann also noch so was in der Art spendieren:
ACHTUNG - BEISPIELCODE !!!
Code:
my @zaehler;
push @zaehler,{ga => "1/2/1", dpt => 14, name => "tageszaehler"}; #Wir bauen ein "array of hashes"
push @zaehler,{ga => "1/2/2", dpt => 14, name => "monatszaehler"};#das können/müssen wir dann aber durchs ganze Plugin ziehen
push @zaehler,{ga => "1/2/3", dpt => 14, name => "jahreszaehler"};#Ist aber super pkratisch und wird die Codelänge halbieren
foreach my $zaehler (@zaehler){ #Also für jedes array das wir angelegt haben
$plugin_subscribe_read{$zaehler->{ga}}{$plugname} = 1; #abonnieren wir auch
if ($msg{'apci'} eq "A_GroupValue_Read" && $msg{'dst'} eq $zaehler->{ga}){ #wenn nun ein Lesetelegramm kommt dann antworten wir mit passender GA/Wert
plugin_log($plugname,"Response $msg{'apci'}"); #Log
$answer = $plugin_info{$plugname.'$zaehler->{name}'} #den Wert holen wir uns aus Plugin_info->müsste man also auch schon mit dem Array Namen füllen sonst gehts nicht
knx_write($zaehler->{ga},$answer,$zaehler->{dpt},0x40)} #Antwort auf den Bus senden, als echtes Response
}
Das ist ne ziemlich große Umbauarbeit, lohnt sich aber m.M.n.
Der Code wird scheinbar komplizierter, aber das Plugin flexibler.
Soweit ich erinnere bedient sich die CV nur der Werte die ein bestimmtes maximales Alter haben.
Nun wird (warum eigentlich) aber nur 1x am Tag gesendet. Ich tippe auf einen Fehler an dieser Stelle. Ich würde das Plugin komplett umbauen und mit einem "Array of Hashes" (->google) arbeiten.
Dem Plugin würde ich dann also noch so was in der Art spendieren:
Hallo JuMi!
Danke für deine Anmerkungen. Die Frage ist, welches Alter die CV beim lesen aus dem eibd zulässt?
Dass ich aber nur 1x / Tag die alten Zählerstände sende, war durchaus beabsichtigt, da ich nichts mehr hasse, als einen Gruppenmonitor in der ETS, der aufgrund der Diagrammflut nicht mehr lesbar ist. Und ich will auch bei starkem Regen was sehen .
Die Array of Hashes sind mir auch schon in den Sinn gekommen, verwende die durchaus des öfteren, habe aber in diesem Fall geglaubt, dass diese aufgrund des unterschiedlichen Handlings hinsichtlich Reset etc. keine Sinn machen. Mittlerweile sehe ich natürlich, dass sich viele Stellen im Code wiederholen, und ich überlege schon einige Tage es umzubauen.
Um ein zyklisches Senden oder gezielte Antwort auf Read-Telegramme werde ich aber nicht herumkommen, damit die CV immer einen Wert bekommt.
Mit dieser Eerweiterung kann ich dann auch gleich die Abfrage hinzufügen, ob die ga belegt ist und nur dann ein rrd füllen bzw. Telegramme sende.
Das ist eher ein Verständnissproblem mit KNX-Grundlagen: eine GA die man in (egal welcher) Visu oder sonstwo 100% zuverlässig anzeigen/verwenden will, muss jederzeit vom Bus lesbar sein. Fakt. Punkt.
Makki
Dann erübrigt sich die Frage. Ich werd das Lesen einfach hinzufügen.
Du kannst einzelne DPTs vergeben, Counter-RRDs erstellen (imho oft sinnvoller als diese Sägezahn-Grafiken), Werte aktivieren/deaktivieren usw.. Es ergibt sich einfach eine tolle Konfiguration.
P.S.: Für mich gibt es nichts sinnvolleres als zyklische Telegramme. Jeder Busmonitor lässt sich durch Filter oder grep auf das gesucht eingrenzen.
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar