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
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;
|
|
|