TCW120
TERACOM TCW120
Das TCW120 ist ein einfaches Netzwerkinterface mit 2 digitalen und 2 analogen Eingängen, 2 Relais-Ausgängen und einem Eingang für einen Termperatur-Sensor.
Dieses Modul ist nur ein schneller Hack, der allerdings schon fast 2 Jahre stabil bei mir läuft.
$ cat 00_TCW.pm
package main;
# This is a quick and dirty implementation to use fhem with a TCW120 Network Interface
use strict;
use warnings;
use Time::HiRes qw(gettimeofday);
sub TCW_defer
{
my $time = shift;
my $cmd = shift;
InternalTimer(gettimeofday()+$time, "TCW_onDefer", $cmd, 0);
}
sub TCW_onDefer() {
my $cmd = shift;
fhem ($cmd);
}
sub TCW_Initialize($)
{
my ($hash) = @_;
$hash->{DefFn} = "TCW_Define";
$hash->{ShutdownFn} = "TCW_Shutdown";
$hash->{ReadFn} = "TCW_Read";
$hash->{SetFn} = "TCW_Set";
$hash->{GetFn} = "TCW_Get";
}
#####################################
sub
TCW_Shutdown($)
{
my ($hash) = @_;
return undef;
}
#####################################
sub
TCW_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
if(@a != 5) {
my $msg = "wrong syntax: define <name> TCW host readCommunity writeCommunity";
Log 2, $msg;
return $msg;
}
$hash->{host}=$a[2];
$hash->{readcom}=$a[3];
$hash->{writecom}=$a[4];
$hash->{STATE} = "Initialized";
$hash->{INTERVAL} = 1;
InternalTimer(gettimeofday()+$hash->{INTERVAL}, "TCW_Update", $hash, 1);
return 0;
}
################################
#
#
sub TCW_Set
{
my ($hash, @a) = @_;
my $oid;
if ($a[1] eq "dout1") { $oid = "iso.3.6.1.4.1.38783.3.1.1.0"; }
elsif ($a[1] eq "dout2") { $oid = "iso.3.6.1.4.1.38783.3.1.2.0"; }
if (defined $oid) {
my $newval;
if (lc $a[2] eq 'on') {
$newval = 1;
}
elsif (lc $a[2] eq 'off') {
$newval = 0;
}
elsif (lc $a[2] eq 'on-for-timer') {
$newval = 1;
TCW_defer ($a[3], "set ".$hash->{NAME}." $a[1] off");
}
else {
return 'SYNTAX: set (out1|out2) (on|off|on-for-timer sec)';
}
my $cmd = "snmpset -Oqv -v 1 -c '".$hash->{'writecom'}."' '".$hash->{'host'}."' '".$oid."' 'i' '".$newval."'";
if (defined $newval) { `$cmd`; }
}
}
################################
#
#
sub
TCW_Get($@)
{
my ($hash,@a) = @_;
return "get: <OID>" if (@a !=2);
my $oid = $a[1];
my $cmd = "snmpget -Oqv -v 1 -c '".$hash->{'readcom'}."' '".$hash->{'host'}."' '".$oid."'";
my $reading = `$cmd`;
$reading =~ s/\r|\n//g;
return $reading;
}
sub TCW_Update($)
{
my ($hash) = @_;
InternalTimer(gettimeofday()+$hash->{INTERVAL}, "TCW_Update", $hash, 0);
TCW_Update_private($hash, 'DIN1', 'iso.3.6.1.4.1.38783.3.3.1.0');
TCW_Update_private($hash, 'DIN2', 'iso.3.6.1.4.1.38783.3.3.2.0');
TCW_Update_private($hash, 'AIN1', 'iso.3.6.1.4.1.38783.3.2.1.0');
TCW_Update_private($hash, 'AIN2', 'iso.3.6.1.4.1.38783.3.2.3.0');
TCW_Update_private($hash, 'TEMPERATURE', 'iso.3.6.1.4.1.38783.3.4.0');
TCW_Update_private($hash, 'DOUT1', 'iso.3.6.1.4.1.38783.3.1.1.0');
TCW_Update_private($hash, 'DOUT2', 'iso.3.6.1.4.1.38783.3.1.2.0');
}
sub TCW_Update_private($$)
{
my ($hash, $key, $oid) = @_;
my $oldval = $hash->{READINGS}{$key}{'VAL'};
my $newval = TCW_Get($hash, 'GET', $oid);
$newval =~ s/"//g;
my @changed;
if (!defined $oldval || $newval ne $oldval) {
$hash->{READINGS}{$key}{'VAL'} = $newval;
$hash->{READINGS}{$key}{'TIME'} = TimeNow();
push @changed, "$key: $newval";
}
$hash->{CHANGED} = \@changed;
DoTrigger($hash->{NAME}, undef) if (scalar(@changed) > 0);
}
1;