Hallo,
ich nutze den Multi-RTR v0.6 aus dem openautomation SVN für 8 Räume mit jeweils Fußboden- und Wandheizung.
Da ich keinen Heizungsaktor habe, sondern die Ventile über mehrere 1wire 8-fach Outputs ansteuere, habe ich einen PWM (stetig, DPT 5, 1 Byte) zu schalt (schaltend, DPT 1, 1 Bit) umsetzer-Plugin gebraucht.
Klar ist das Plugin derzeit very basic, aber vielleicht ist es hier für jemanden von Nutzen.
Config:
ActuatorGA (Input): GA für den 1 Byte Wert aus dem Multi-RTR (deswegen heißt der Key hier gleich wie im Multi-RTR)
SwitchGA (Output): GA für den Schalt-Kanal
Invert: für normale (NC) Ventile 0, für NO-Ventile 1
SwitchRRD (optional): Name eines RRD-Files für den Schaltzustand
Global:
CycleMinutes: Minuten pro PWM-Zyklus
ResolutionPercent: Auflösung in %
Schöne Grüße,
Patrick
ich nutze den Multi-RTR v0.6 aus dem openautomation SVN für 8 Räume mit jeweils Fußboden- und Wandheizung.
Da ich keinen Heizungsaktor habe, sondern die Ventile über mehrere 1wire 8-fach Outputs ansteuere, habe ich einen PWM (stetig, DPT 5, 1 Byte) zu schalt (schaltend, DPT 1, 1 Bit) umsetzer-Plugin gebraucht.
Klar ist das Plugin derzeit very basic, aber vielleicht ist es hier für jemanden von Nutzen.
Config:
ActuatorGA (Input): GA für den 1 Byte Wert aus dem Multi-RTR (deswegen heißt der Key hier gleich wie im Multi-RTR)
SwitchGA (Output): GA für den Schalt-Kanal
Invert: für normale (NC) Ventile 0, für NO-Ventile 1
SwitchRRD (optional): Name eines RRD-Files für den Schaltzustand
Global:
CycleMinutes: Minuten pro PWM-Zyklus
ResolutionPercent: Auflösung in %
Schöne Grüße,
Patrick
Code:
#############################################################################
# Plugin: Multi-PWM
#
# @version 0.1
# @copyright Copyright (c) 2011, Patrick Prasse
# @license http://opensource.org/licenses/gpl-license.php GNU Public License
#
# Credits to Christian Mayer (mail at ChristianMayer.de) for his Multi-RTR plugin, which inspired this plugin
# Credits to Michael Markstaller
#
#############################################################################
# Configuration:
my %controllers = (
'Schlafzimmer' => {
'ActuatorGA' => '1/7/40',
'SwitchGA' => '1/7/41',
'SwitchRRD' => 'Schlafzimmer_Switch',
'Invert' => 1,
},
'Bad' => {
'ActuatorGA' => '1/7/42',
'SwitchGA' => '1/7/43',
'SwitchRRD' => 'Bad_Switch',
'Invert' => 1,
},
);
my %default = (
'CycleMinutes' => 7.5,
'ResolutionPercent' => 5,
);
# $plugin_info{$plugname.'_cycle'} wird unten dynamisch berechnet.
use List::Util qw[min max];
use POSIX;
my $busActive = !(!keys %msg); # true if script was called due to bus traffic
my $ret_val = '';
if( !$busActive ) # unnecesary during bus traffic
{
my $min_cycle = 60;
for my $this_controller_name ( keys %controllers )
{
my %this_controller = (%{$controllers{ $this_controller_name }}, %default);
$min_cycle = ceil( min( $min_cycle, $this_controller{'CycleMinutes'}*60/100*$this_controller{'ResolutionPercent'} ) );
$plugin_subscribe{ $this_controller{'ActuatorGA'} }{$plugname} = 1;
if( !defined $plugin_info{$plugname.'_'.$this_controller_name.'_pct_count'} )
{
$plugin_info{$plugname.'_'.$this_controller_name.'_pct_count'} = 0;
}
if( !defined $plugin_info{$plugname.'_'.$this_controller_name.'_pwm_value'} )
{
$plugin_info{$plugname.'_'.$this_controller_name.'_pwm_value'} = 0;
}
}
$plugin_info{$plugname.'_cycle'} = $min_cycle;
}
else
{
for my $this_controller_name ( keys %controllers )
{
my %this_controller = (%{$controllers{ $this_controller_name }}, %default);
if( $msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $this_controller{'ActuatorGA'} )
{
if (!defined $msg{'value'})
{
# falls GA/DPT nicht importiert
$msg{'value'} = decode_dpt5($msg{'data'});
}
$plugin_info{$plugname.'_'.$this_controller_name.'_pwm_value'} = $msg{'value'};
}
}
}
for my $this_controller_name ( keys %controllers )
{
my %this_controller = (%{$controllers{ $this_controller_name }}, %default);
my $pct_per_sec = 1/($this_controller{'CycleMinutes'}*60/100);
my $timediff = time() - $plugin_info{$plugname.'_tlast'};
my $pctdiff = $timediff * $pct_per_sec;
my $change_value;
$plugin_info{$plugname.'_'.$this_controller_name.'_pct_count'} += $pctdiff;
# $ret_val .= ' '.$this_controller_name.' pct_count='.$plugin_info{$plugname.'_'.$this_controller_name.'_pct_count'};
if( $plugin_info{$plugname.'_'.$this_controller_name.'_pct_count'} >= 100 )
{
$plugin_info{$plugname.'_'.$this_controller_name.'_pct_count'} = 0;
if( $plugin_info{$plugname.'_'.$this_controller_name.'_pwm_value'} > 0 )
{
$change_value = 1;
}
else
{
$change_value = 0;
}
}
else
{
if( $plugin_info{$plugname.'_'.$this_controller_name.'_pct_count'} >= $plugin_info{$plugname.'_'.$this_controller_name.'_pwm_value'} )
{
$change_value = 0;
}
}
if( defined $change_value )
{
if( defined $this_controller{ 'SwitchRRD' } )
{
update_rrd( $this_controller{ 'SwitchRRD' }, '', $change_value ? 10 : 0 );
}
if( $this_controller{ 'Invert' } )
{
knx_write( $this_controller{ 'SwitchGA' }, $change_value ? 0 : 1, 1 );
}
else
{
knx_write( $this_controller{ 'SwitchGA' }, $change_value ? 1 : 0, 1 );
}
$plugin_info{$plugname.'_'.$this_controller_name.'_last'} = $change_value;
}
$ret_val .= ' '.$this_controller_name.
'('.$plugin_info{$plugname.'_'.$this_controller_name.'_pwm_value'}.'/'.$plugin_info{$plugname.'_'.$this_controller_name.'_pct_count'}.'): '.
($plugin_info{$plugname.'_'.$this_controller_name.'_last'} ? 'AN' : 'AUS').($this_controller{ 'Invert' } ? '-INVERT' : '');
}
$plugin_info{$plugname.'_tlast'} = time();
return $ret_val;



Kommentar