You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

293 lines
7.5 KiB
Perl

package main;
use strict;
use warnings;
sub
EBN_Initialize($)
{
my ($hash) = @_;
$hash->{Match} = "^R";
$hash->{DefFn} = "EBN_Define";
$hash->{ParseFn} = "EBN_Parse";
$hash->{GetFn} = "EBN_Get";
$hash->{SetFn} = "EBN_Set";
$hash->{AttrList} = "IODev loglevel:0,1,2,3,4,5,6";
}
#############################
sub
EBN_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
my $u = "wrong syntax: define <name> EBN addr type";
return "wrong syntax: define <name> EBN addr type" if(int(@a) != 4);
$modules{EBN}{defptr}{$a[2]} = $hash;
$hash->{STATE} = "Defined";
$hash->{EBTYPE} = $a[3];
$hash->{ADDR} = $a[2];
$hash->{channel1} = "Init";
AssignIoPort($hash);
return undef;
}
sub
EBN_Parse($$)
{
my ($hash, $msg) = @_;
# Msg format: R addr chan value
my @cmp = split(" ", $msg);
my $def = $modules{EBN}{defptr}{$cmp[1]};
my $changed;
my $log;
my $v1;
my $v2;
my $v3;
my $v4;
Log 5, "$hash->{NAME} parse: " . $msg;
if($def) {
my $name = $def->{NAME};
if ($cmp[2] == 0) {
IOWrite($def, "R", $cmp[1]. " 1 0");
return $name;
}
# TYPE 1: Test Node
# Channel 1:
# Bit 0 : Test LED
# Bit 1 : Exp LED
# Channel 2:
# Vcc
$changed = 0;
$v1 = $cmp[3] & 0x1;
$v2 = $cmp[3] & 0x2;
$v3 = $cmp[3] & 0x4;
$v4 = $cmp[3] & 0x8;
if ($def->{EBTYPE} == 1) {
if ($cmp[2] == 1) {
if (($v1 != ($def->{channel1} & 0x1)) || ($def->{channel1} eq "Init")) {
$def->{READINGS}{testled}{TIME} = TimeNow();
$def->{READINGS}{testled}{VAL} = $v1 ? "on" : "off";
$changed = 1;
}
if (($v2 != ($def->{channel1} & 0x2)) || ($def->{channel1} eq "Init")) {
$def->{READINGS}{expled}{TIME} = TimeNow();
$def->{READINGS}{expled}{VAL} = $v2 ? "on" : "off";
$changed = 1;
}
if ($def->{channel1} eq "Init") {
IOWrite($def, "R", $cmp[1]. " 2 0");
}
$def->{channel1} = $cmp[3];
if ($changed == 1) {
$log = "testled: " . ($v1 ? "on" : "off") . " expled: " . ($v2 ? "on" : "off");
$def->{STATE} = $log;
push @{$def->{CHANGED}}, $log;
DoTrigger($def->{NAME}, undef);
}
}
if ($cmp[2] == 2) {
$def->{READINGS}{vcc}{TIME} = TimeNow();
$def->{READINGS}{vcc}{VAL} = $cmp[3];
}
}
# TYPE 2: Alarm Node
# Channel 1:
# Bit 0 : Tuerkontakt
# Bit 1 : Buzzer aus
# Channel 2:
# Vcc
if ($def->{EBTYPE} == 2) {
if ($cmp[2] == 1) {
if (($v1 != ($def->{channel1} & 0x1)) || ($def->{channel1} eq "Init")) {
$def->{READINGS}{tuer}{TIME} = TimeNow();
$def->{READINGS}{tuer}{VAL} = $v1 ? "closed" : "open";
$changed = 1;
}
if (($v2 != ($def->{channel1} & 0x2)) || ($def->{channel1} eq "Init")) {
$def->{READINGS}{buzzer}{TIME} = TimeNow();
$def->{READINGS}{buzzer}{VAL} = $v2 ? "disabled" : "enabled";
$changed = 1;
}
if ($def->{channel1} eq "Init") {
IOWrite($def, "R", $cmp[1]. " 2 0");
}
$def->{channel1} = $cmp[3];
if ($changed == 1) {
$log = "tuer: ". ($v1 ? "closed" : "open") . " buzzer: " . ($v2 ? "disabled" : "enabled");
$def->{STATE} = $log;
push @{$def->{CHANGED}}, $log;
DoTrigger($def->{NAME}, undef);
}
}
if ($cmp[2] == 2) {
$def->{READINGS}{vcc}{TIME} = TimeNow();
$def->{READINGS}{vcc}{VAL} = $cmp[3];
}
}
# TYPE 3: Relais Node
# Channel 1:
# Bit 0 : LED
# Bit 1 : Relais 1
# Bit 2 : Relais 2
if ($def->{EBTYPE} == 3) {
if ($cmp[2] == 1) {
if (($v1 != ($def->{channel1} & 0x1)) || ($def->{channel1} eq "Init")) {
$def->{READINGS}{led}{TIME} = TimeNow();
$def->{READINGS}{led}{VAL} = $v1 ? "on": "off";
$changed = 1;
}
if (($v2 != ($def->{channel1} & 0x2)) || ($def->{channel1} eq "Init")) {
$def->{READINGS}{relais1}{TIME} = TimeNow();
$def->{READINGS}{relais1}{VAL} = $v2 ? "on": "off";
$changed = 1;
}
if (($v3 != ($def->{channel1} & 0x4)) || ($def->{channel1} eq "Init")) {
$def->{READINGS}{relais2}{TIME} = TimeNow();
$def->{READINGS}{relais2}{VAL} = $v3 ? "on": "off";
$changed = 1;
}
$def->{channel1} = $cmp[3];
if ($changed == 1) {
$log = "led: " . ($v1 ? "on": "off") . " relais1: " . ($v2 ? "on": "off") . " relais2: " . ($v3? "on": "off");
$def->{STATE} = $log;
push @{$def->{CHANGED}}, $log;
DoTrigger($def->{NAME}, undef);
}
}
}
return $name;
} else {
Log 3, "EBN Unknown device $cmp[1], please define it";
if ($cmp[2] == 0) {
return "UNDEFINED EBN_$cmp[1] EBN $cmp[1] $cmp[3]";
} else {
return undef;
}
}
}
sub
EBN_Get($@)
{
my ($hash, @args) = @_;
return 'EBN_Get needs two arguments' if (@args != 2);
my $get = $args[1];
my $val;
if ( $get eq "?"){
if ($hash->{EBTYPE} == 1) {
return "Unknown argument ?, choose one of testled expled";
}
if ($hash->{EBTYPE} == 2) {
return "Unknown argument ?, choose one of tuer buzzer";
}
if ($hash->{EBTYPE} == 3) {
return "Unknown argument ?, choose one of led relais1 relais2";
}
return "EBN_Get: no such reading: $get";
}
if (defined($hash->{READINGS}{$get})) {
$val = $hash->{READINGS}{$get}{VAL};
} else {
return "EBN_Get: no such reading: $get";
}
Log 3, "$args[0] $get => $val";
return $val;
}
sub
EBN_Set($@)
{
my ($hash, @args) = @_;
my $set = $args[1];
my $num;
my $msg;
if ( $set eq "?"){
if ($hash->{EBTYPE} == 1) {
return "Unknown argument ?, choose one of testled expled";
}
if ($hash->{EBTYPE} == 2) {
return "Unknown argument ?, choose one of buzzer";
}
if ($hash->{EBTYPE} == 3) {
return "Unknown argument ?, choose one of led relais1 relais2";
}
return "EBN_Get: no such reading: $set";
}
return 'EBN_Set needs three arguments' if (@args != 3);
my $val = $args[2];
Log 3, "$args[0] $set => $val";
if ($hash->{EBTYPE} == 1) {
if ($val eq "on") {
$num = 1;
} else {
$num = 0;
}
if ($set eq "testled") {
$msg = ($hash->{channel1} & 0x3FE) | $num;
}
if ($set eq "expled") {
$msg = ($hash->{channel1} & 0x3FD) | ($num << 1);
}
IOWrite($hash, "W", $hash->{ADDR} . " 1 " . $msg);
}
if ($hash->{EBTYPE} == 2) {
if ($val eq "disabled") {
$num = 1;
} else {
$num = 0;
}
if ($set eq "buzzer") {
$msg = ($hash->{channel1} & 0x3FD) | ($num << 1);
}
IOWrite($hash, "W", $hash->{ADDR} . " 1 " . $msg);
}
if (($hash->{EBTYPE} == 3) || ($hash->{EBTYPE} == 4)) {
if ($val eq "on") {
$num = 1;
} else {
$num = 0;
}
if ($set eq "led") {
$msg = ($hash->{channel1} & 0x3FE) | $num;
}
if ($set eq "relais1") {
$msg = ($hash->{channel1} & 0x3FD) | ($num << 1);
}
if ($set eq "relais2") {
$msg = ($hash->{channel1} & 0x3FB) | ($num << 2);
}
IOWrite($hash, "W", $hash->{ADDR} . " 1 " . $msg);
}
return undef;
}
1;