Hallo ich habe ein Switch (D-Link DGS1210-10P)
An diesem möchte ich meine POE Kameras anschliesen.
Mein Switch hat eine Funktion wo ich die einzelnen POE Anschlüsse ein und ausschalten kann. (POE ein/aus)
Es soll auch möglich sein das POE pro Kanal mit SNMP ein und auszuschalten.
Diese Funktion muss aber zuerst im Switch freigeschaltet werden.
Hat damit jemand Erfahrung?
Ist es besser per HTTP Befehl zu schalten oder geht SNMP oau ohne Bedenken?
Mit SNMP hab ich noch gar keine Erfahrung.
Bei meiner Türstationskamera hab ich im Moment ein seperater POE Adapter eingebaut.
Das möchte ich ändern, das heisst das Switch durch ein Switch ersetzen das POE hat und über Web konfiguriert wird.
Hallo
Ich kann bei meinem POE Switch tatsächlich POE einzeln über FHEM mit SNMP Aktivieren und Deaktivieren.
Das geht mit:
Zitat{system('snmpset -v2c -c private 192.168.178.84 1.3.6.1.4.1.171.10.76.12.22.1.1.3.1.1 i 2')}
{system('snmpset -v2c -c private 192.168.178.84 1.3.6.1.4.1.171.10.76.12.22.1.1.3.1.1 i 1')}
PORT 1 disable 2, enable 1
Bei SNMP ohne Password etc ???
Hoffe ich finde auch eine Lösung mit SNMP 3 mit Password.
Die community private ist eine Art Password, das für ein Heimnetz mMn auch ausreichend ist, wenn man es ändert ;)
ZitatDie community private ist eine Art Password, das für ein Heimnetz mMn auch ausreichend ist, wenn man es ändert ;)
Genial, Danke das wusste ich nicht.
Ändern geht nicht.
Aber löschen und neu erstellen geht.
Jetzt muss ich das noch in ein DOIF oder vielleicht in eine SUB packen.
Habe da ein Modul gefunden das sowas auch kann.
https://wiki.fhem.de/wiki/TCW120 (https://wiki.fhem.de/wiki/TCW120)
Habe noch nicht herausgefunden wie der Befehl zum Schalten heisen muss.
Hab es mal auf das POESwitch umgeschrieben, Anzeige klappt.
Aber schalten geht nicht wie, oder ich weis nicht wie.
Den On-for-Timer ist da vielleicht nicht so sinnvoll.
Interval kann vielleicht besser auf 0.
#package main;
# This is a quick and dirty implementation to use fhem with a POESwitch 1210-10P POE Network Interface
use strict;
use warnings;
use Time::HiRes qw(gettimeofday);
sub POESwitch_defer
{
my $time = shift;
my $cmd = shift;
InternalTimer(gettimeofday()+$time, "POESwitch_onDefer", $cmd, 0);
}
sub POESwitch_onDefer() {
my $cmd = shift;
fhem ($cmd);
}
sub POESwitch_Initialize($)
{
my ($hash) = @_;
$hash->{DefFn} = "POESwitch_Define";
$hash->{ShutdownFn} = "POESwitch_Shutdown";
$hash->{ReadFn} = "POESwitch_Read";
$hash->{SetFn} = "POESwitch_Set";
$hash->{GetFn} = "POESwitch_Get";
}
#####################################
sub
POESwitch_Shutdown($)
{
my ($hash) = @_;
return undef;
}
#####################################
sub
POESwitch_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
if(@a != 5) {
my $msg = "wrong syntax: define <name> POESwitch 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}, "POESwitch_Update", $hash, 1);
return 0;
}
################################
#
#
sub POESwitch_Set
{
my ($hash, @a) = @_;
my $oid;
if ($a[1] eq "poe1") { $oid = "iso.3.6.1.4.1.171.10.76.12.22.1.1.3.1.1"; }
elsif ($a[1] eq "poe2") { $oid = "iso.3.6.1.4.1.171.10.76.12.22.1.1.3.1.2"; }
elsif ($a[1] eq "poe3") { $oid = "iso.3.6.1.4.1.171.10.76.12.22.1.1.3.1.3"; }
elsif ($a[1] eq "poe4") { $oid = "iso.3.6.1.4.1.171.10.76.12.22.1.1.3.1.4"; }
elsif ($a[1] eq "poe5") { $oid = "iso.3.6.1.4.1.171.10.76.12.22.1.1.3.1.5"; }
elsif ($a[1] eq "poe6") { $oid = "iso.3.6.1.4.1.171.10.76.12.22.1.1.3.1.6"; }
elsif ($a[1] eq "poe7") { $oid = "iso.3.6.1.4.1.171.10.76.12.22.1.1.3.1.7"; }
elsif ($a[1] eq "poe8") { $oid = "iso.3.6.1.4.1.171.10.76.12.22.1.1.3.1.8"; }
if (defined $oid) {
my $newval;
if (lc $a[2] eq 'on') {
$newval = 1;
}
elsif (lc $a[2] eq 'off') {
$newval = 2;
}
else {
return 'SYNTAX: set (poe1¦poe2|poe3|poe4|poe5|poe6|poe7|poe8) (on|off¦on-for-timer sec)';
}
my $cmd = "snmpset -Oqv -v 2c -c '".$hash->{'writecom'}."' '".$hash->{'host'}."' '".$oid."' 'i' '".$newval."'";
if (defined $newval) { `$cmd`; }
}
}
################################
#
#
sub
POESwitch_Get($@)
{
my ($hash,@a) = @_;
return "get: <OID>" if (@a !=2);
my $oid = $a[1];
my $cmd = "snmpget -Oqv -v 2c -c '".$hash->{'readcom'}."' '".$hash->{'host'}."' '".$oid."'";
my $reading = `$cmd`;
$reading =~ s/\r|\n//g;
return $reading;
}
sub POESwitch_Update($)
{
my ($hash) = @_;
InternalTimer(gettimeofday()+$hash->{INTERVAL}, "POESwitch_Update", $hash, 0);
POESwitch_Update_private($hash, 'POE1', 'iso.3.6.1.4.1.171.10.76.12.22.1.1.3.1.1');
POESwitch_Update_private($hash, 'POE2', 'iso.3.6.1.4.1.171.10.76.12.22.1.1.3.1.2');
POESwitch_Update_private($hash, 'POE3', 'iso.3.6.1.4.1.171.10.76.12.22.1.1.3.1.3');
POESwitch_Update_private($hash, 'POE4', 'iso.3.6.1.4.1.171.10.76.12.22.1.1.3.1.4');
POESwitch_Update_private($hash, 'POE5', 'iso.3.6.1.4.1.171.10.76.12.22.1.1.3.1.5');
POESwitch_Update_private($hash, 'POE6', 'iso.3.6.1.4.1.171.10.76.12.22.1.1.3.1.6');
POESwitch_Update_private($hash, 'POE7', 'iso.3.6.1.4.1.171.10.76.12.22.1.1.3.1.7');
POESwitch_Update_private($hash, 'POE8', 'iso.3.6.1.4.1.171.10.76.12.22.1.1.3.1.8');
}
sub POESwitch_Update_private($$)
{
my ($hash, $key, $oid) = @_;
my $oldval = $hash->{READINGS}{$key}{'VAL'};
my $newval = POESwitch_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;
Schalten geht mit:
set POESwitch out1 on/off
Das Modul geht sehr gut.
Aber wenn das Switch nicht erreichbar ist, blockiert FHEM.
Ist es möglich das so zu machen das es ohne Blockieren von FHEM geht?
Oder mir würde auch nur der Fhem Befehl als nichtblockieren abzusetzen.
Ein & am Ende eines shell commands führt diesen im Hintergrund aus.
Hallo
Habs mal mit einem DOIF gemacht, werde es später eventuell nochmals mit der Sub versuchen.
Zitat
define POE1 Dummy
attr POE1 on:off
define POE DOIF ([POE1_Du] eq "on") {sysem('snmpset -v2c -c private 192.168.178.84 1.3.6.1.4.1.171.10.76.12.22.1.1.3.1.1 i 1&');;()}
DOELSEIF ([POE1_Du] eq "off") {system('snmpset -v2c -c private 192.168.178.84 1.3.6.1.4.1.171.10.76.12.22.1.1.3.1.1 i 2&');;()}
attr POE do always
klappt sehr gut
Zitat
Ein & am Ende eines shell commands führt diesen im Hintergrund aus.
Geht das auch in einer Sub?
Ja. Das & am Ende des Shell Befehls sagt dem Betriebssystem, dass der Prozess im Hintergrund laufen soll.
https://wiki.ubuntuusers.de/Shell/Prozesssteuerung/