FHEM Forum

FHEM => Automatisierung => Thema gestartet von: Damu am 20 April 2017, 20:39:44

Titel: Switch POE Ein/Aus schalten
Beitrag von: Damu am 20 April 2017, 20:39:44
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.



Titel: Antw:Switch POE Ein/Aus schalten
Beitrag von: Damu am 28 April 2017, 21:52:41
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.
Titel: Antw:Switch POE Ein/Aus schalten
Beitrag von: dev0 am 28 April 2017, 22:03:06
Die community private ist eine Art Password, das für ein Heimnetz mMn auch ausreichend ist, wenn man es ändert ;)
Titel: Antw:Switch POE Ein/Aus schalten
Beitrag von: Damu am 29 April 2017, 16:30:30

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.
Titel: Antw:Switch POE Ein/Aus schalten
Beitrag von: Damu am 30 April 2017, 23:36:04
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



Titel: Antw:Switch POE Ein/Aus schalten
Beitrag von: Damu am 02 Mai 2017, 21:57:02
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.
Titel: Antw:Switch POE Ein/Aus schalten
Beitrag von: dev0 am 02 Mai 2017, 23:19:55
Ein & am Ende eines shell commands führt diesen im Hintergrund aus.
Titel: Antw:Switch POE Ein/Aus schalten
Beitrag von: Damu am 07 Mai 2017, 20:14:28
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
Titel: Antw:Switch POE Ein/Aus schalten
Beitrag von: Damu am 10 Mai 2017, 18:58:19

Zitat
Ein & am Ende eines shell commands führt diesen im Hintergrund aus.


Geht das auch in einer Sub?
Titel: Antw:Switch POE Ein/Aus schalten
Beitrag von: dev0 am 11 Mai 2017, 08:59:52
Ja. Das & am Ende des Shell Befehls sagt dem Betriebssystem, dass der Prozess im Hintergrund laufen soll.
https://wiki.ubuntuusers.de/Shell/Prozesssteuerung/