FHEM Status eines Gerätes mit Ping.

Begonnen von Guest, 18 Juni 2012, 12:32:28

Vorheriges Thema - Nächstes Thema

Guest

Originally posted by: <email address deleted>

Hallo zusammen,

ich habe einen Satellitenreceiver der über eine Funksteckdose
gesteuert wird.
Das Problem:
Der Receiver ist immer aus (GreenIT).
Die Steckdose ist natürlich an, da man den SatReceiver per
Fernbedienung einschalten kann.
Im Floorplan ist die Steckdose natürlich gekennzeichnet als
eingeschaltet, was  auch stimmt.
Aber:
Der SatReceiver ist aus. Nun kann man durch aus- und einschalten der
Steckdose den Receiver einschalten.
Der Receiver schaltet sich ein wenn man Ihn vom Strom trennt und dann
wieder mit Strom verbindet.

Nun hätte ich gern ein Symbol im Floorplan welches den Zustand des
"SatReceivers" wiederspiegelt.
Den kann man nur durch einen Netzwerkping ermitteln.
1. Der Zustand des Receivers (vllt. ein virtuelles Device) soll im
WebInterface sichtbar sein.
2. Wenn der Zustand dann aus ist weil kein Ping funktioniert dann soll
ein Klick aufs Symbol ein aus-& einschalten der Steckdose bewirken.

Ich hoffe ich habe mich verständlich ausgedrückt.

gruss
Frank

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Vielleicht hilft der Link

https://groups.google.com/forum/#!msg/fhem-users/5lqzI15ZyuE/sya9FjkswjwJ

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Danke das hat mich weitergebracht.
2 Dinge habe ich noch. Wie definiere ich global gültige Varibalen.

1.
Hab schon gesucht aber nichts gefunden. Mit my & local komme ich nicht
weiter.
Also z.Bsp.
SAT1=192.168.x.x
SAT2=192.168.x.y
und dann in meinen späteren Funktionen darauf zugreifen zu können.

2. Hier der Perl/FHEM Code zu meinem Problem
Das u.a. funktioniert ganz gut. Ich bekomme im Log von FHEM aber immer
eine "1" wenn "a2" läuft. Ist wahrscheinlich der Rückgabewert. Kann
ich dafür sorgen das der Rückgabewert nicht im Log landet?
Ist das was fürs FHEM Wiki?

#icon for Sat Receiver Real Status
define wz_ReceiverRealState dummy
attr wz_ReceiverRealState webCmd start
attr wz_ReceiverRealState fp_oben 100,100,1,SatReceiver Realstate
define a2 at +*00:00:10 { \
use Net::Ping;; my $p = Net::Ping->new("icmp",5);;\
my $RCVR=Value("wz_ReceiverRealState");; \
if($p->ping("192.168.x.x", 2)) { \
if ( $RCVR ne "on") { fhem "set wz_ReceiverRealState on";;} }\
else{\
if ( $RCVR ne "off") { fhem "set wz_ReceiverRealState off";;} }\
;;$p->close();; \
}

#start receiver, but check whether ping is successful
#to avoid shutdown when sat receiver already runs
define wz_ReceiverRealState_on notify wz_ReceiverRealState:start { \
use Net::Ping;; my $p = Net::Ping->new("icmp",5);; if(!($p-
>ping("192.168.x.x", 2))) {fhem "set wz_ReceiverRealState off";;sleep
5;;fhem "set wz_ReceiverRealState on";;};; $p->close();;\
}

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Die set Variablen im notify passen natürlich noch nicht.
Da kommt in der finalen Konfig die richtige Steckdose rein.

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

rudolfkoenig

                                                   

> Wie definiere ich global gültige Varibalen.

In den Einzeilern als
  $data{MeineWariable} = ;
Aber wenn man auf solche gedanken kommt, sollte man ueberlegen das Zeug nach
99_MyUtils.pm auszulagern.


> Kann ich dafür sorgen das der Rückgabewert nicht im Log landet?

Indem man das "Programm" mit undef anschliesst, also
define a2 at +*00:00:10 { \
  ...
  undef;\
}


Achtung: falls das ZielGeraet aus ist, dann blockiert ping 5 Sekunden lang
fhem, also in dieser Konstallation ist fhem zu 50% "tot".

Laenger blockierende Sachen wuerde ich in einem Shellskript auslagern, und
diesen regelmaessig aufrufen. Von da aus kann man ja auch fhem dummys setzen.

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Ok, verstanden. "undef" klappt.
Mit Shellskript auslagern meinst Du:
Ping im Shellskript, den Status dann über ein Shellskript per socat
oder fhemcmd oder wie auch immer irekt in fhem setzen.

Also alle Funktionen die Zeit benötigen, also auch meine Schaltrouting
mit dem Check Gerät bereits an/aus, blockieren den FHEM.
In der Notify Funktion der "sleep" z.Bsp.

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

rudolfkoenig

                                                   

> Ping im Shellskript, den Status dann über ein Shellskript per socat
> oder fhemcmd oder wie auch immer irekt in fhem setzen.

Ja. Offiziell verwendet man
  perl fhem.pl 7072 ""
das ist aber etwas traeger auf kleinen Systemen als
  echo "" | /sbin/socat -  TCP:127.0.0.1:7072

> Also alle Funktionen die Zeit benötigen, also auch meine Schaltrouting
> mit dem Check Gerät bereits an/aus, blockieren den FHEM.
> In der Notify Funktion der "sleep" z.Bsp.

Ja, perl sleep() ist zu vermeiden. Ausnahme ist das fhem eigene sleep
(blockiert fhem NICHT), ist aber auch nur fuer "reine" fhem Kommandos sinnvoll,
also nicht aus einem perl Ausdruck heraus. Beispiel (on-for-timer fuer Arme :)
OK
  define notify schalter:on set lamp on;; sleep 2.5;; set lamp off
Nicht OK:
  define notify schalter:on { \
    fhem("set lamp on");;  \
    fhem("sleep 2.5");;  \
    fhem("set lamp off");; \
  }

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Ich habe es jetzt mit 2 shellskripts realisiert.
Eins als eine Art Cronjob, zum check und setzen des Status und das
andere als Schaltroutine.
Die Schaltroutine prüft wie lange der letzte Schaltvorgang her ist,
der Satreceviver benötigt ca. 60 secs zum starten.
Wenn der Schaltvorgang nich lange genug her ist passiert gar nichts.
Es wird auch geprüft ob der Receiver zwischenzeitlich erreichbar ist
dann passiert auch nichts.
Das mache ich deshalb weil das Statusskript "nur" alle 5 Minuten
läuft.

Vielen Dank für die Hilfe!

Gruss
Frank

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Mitch

                                                     

Hallo Frank,

Deine Lösung würde mich brennend für meinen Topfield Receiver interessieren.
Leider habe ich von Programmierung und Perl keine Ahnung.
Könntest du mir deinen Script zur Verfügung stellen, oder evtl. ins Wiki eintragen?

Vielen Dank
Markus

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
FHEM im Proxmox Container

Guest

Originally posted by: <email address deleted>

Noch ein Hinweis: das WOL Modul pingt in regelmäßigen Zeitabständen eine
Netzwerkadresse. Der Zustand kann dann im entsprechenden Attribut abgerufen
werden. Eventuell hilft das ja auch schon weiter.

Matthias

Am Dienstag, 19. Juni 2012 22:45:24 UTC+2 schrieb Mitch:
>
> Hallo Frank,
>
> Deine Lösung würde mich brennend für meinen Topfield Receiver
> interessieren.
> Leider habe ich von Programmierung und Perl keine Ahnung.
> Könntest du mir deinen Script zur Verfügung stellen, oder evtl. ins Wiki
> eintragen?
>
> Vielen Dank
> Markus

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Ok, mit OWL Modul schaue ich mal.

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Ich habe noch keinen Account im Wiki. Vielleicht liest jemand mit der
mir einen Account erstellt.:-)
Ich werde aber noch an die Admins des Wikis wenden.
Anbei die Konfig von FHEM für das Dumy Device, den Floorplan etc.
Denk dran ist mir Floorplan. Floorplan Attribute löschen wenn nicht
gebraucht
Ist alles nur so schnell dahin geschrieben. Wird mit Sicherheit noch
überarbeitet. Bitte nicht steinigen,
bin aber offen für Kritik und Verbesserungen,
Habe das auch in Betrieb für meinen HomeServer der per WOL gestartet
wird.
Läuft auf eine FB7390.

####fhem.cfg
#dummy symbol für den Zustand des Receivers im Wohnzimmer
define wz_ReceiverRealState dummy
attr wz_ReceiverRealState building Wohnung
attr wz_ReceiverRealState room Wohnzimmer, Wohnung
attr wz_ReceiverRealState fp_oben 240,180,1,Satelliten Receiver
attr wz_ReceiverRealState webCmd start
define FL_wz_ReceiverRealState FileLog ./log/wz_ReceiverRealState.log
wz_ReceiverRealState
attr FL_wz_ReceiverRealState fm_order 19
attr FL_wz_ReceiverRealState logtype fs20:text
attr FL_wz_ReceiverRealState room Plots

#trigger for starting devices
define wz_ReceiverRealState_startup notify wz_ReceiverRealState:start
"/var/media/ftp/tools/fhem/own/startupVUDuo.sh"

#check with ping via external shell script
define triggercheckVUDuo notify triggercheckVUDuo "/var/media/ftp/
tools/fhem/own/checkVUDuostate.sh"

#Zeitsteuerung
define at.04.checkVUDuo at +*00:02:00 trigger triggercheckVUDuo
####fhem.cfg

####startupVUDuo.sh
#!/bin/sh
IP2PING=192.168.255.17
TEMPFILE=$0.temp
DUMMYSTATEDEVICE=wz_ReceiverState
REALDEVICE=wz_SatReceiver
TARGET=TCP:192.168.255.2:7072


SWITCHON=NOK
#check ob temp datei alt genug, um zu verhindern das jemand die
Befehle zu schnell ausfuehrt
if [ -r $0.temp ] ; then
    find $0.temp -mmin +1| grep $0.temp > /dev/null
    if [ $? = 0 ] ; then
        echo "set $DUMMYSTATEDEVICE on-for-timer" | /sbin/socat -
$TARGET
      echo "OK, $REALDEVICE einzuschalten"
        SWITCHON=OK
    else
        /bin/ping $IP2PING -c 1 -w 1 >> /dev/null
      if [ $? = 0 ]; then
         echo "set $DUMMYSTATEDEVICE on" | /sbin/socat -  $TARGET
         exit
      else
         echo "set $DUMMYSTATEDEVICE on-for-timer" | /sbin/socat -  $TARGET
         exit
      fi
   fi
else
    touch $0.temp
    SWITCHON=OK
fi

if [ $SWITCHON = OK ]; then
    /bin/ping $IP2PING -c 1 -w 1 >>  /dev/null
    if [ $? = 1 ]; then
#       echo "Ping nicht erfolgreich, Recvr wird eingeschaltet"
        echo "set $REALDEVICE off" | /sbin/socat -  $TARGET
        sleep 5
        echo "set $REALDEVICE on" | /sbin/socat -  $TARGET
        echo "set $DUMMYSTATEDEVICE on-for-timer" | /sbin/socat -
$TARGET
        #check when Vu+Duo is up
        i=0
        while [ $i -le 20 ]; do
            #echo $i
            i=$(($i + 1))
            j=$(($i * 2))
            /bin/ping $IP2PING -c 1 -w 1 >> /dev/null
            if [ $? = 0 ]; then
                echo "$REALDEVICE Startzeit: $j secs"
                echo "set $DUMMYSTATEDEVICE on" | /sbin/socat -
$TARGET
                exit
            fi
            sleep 1
        done
        echo "set $DUMMYSTATEDEVICE off" | /sbin/socat -  $TARGET
        echo "Problem $REALDEVICE ist nicht eingeschaltet nach $j
secs"
        rm $0.temp
        date > $0.temp
    else echo "Ping erfolgreich, HomeServer schon an"
    echo "set $DUMMYSTATEDEVICE on" | /sbin/socat -  $TARGET
   fi
fi
####startupVUDuo.sh

####checkVUDuostate.sh
#!/bin/sh
IP2PING=192.168.255.17
TEMPFILE=$0.temp
DUMMYSTATEDEVICE=wz_ReceiverState
TARGET=TCP:192.168.255.2:7072

#echo $0
if [ -r $0.temp ] ; then
OLDSTATE=`head -n1 $0.temp`
#echo $OLDSTATE
if [ -z $OLDSTATE ]; then
   OLDSTATE=notinit
fi
else
touch $0.temp
OLDSTATE=notinit
fi

/bin/ping $IP2PING -c 1 -w 1 >>  /dev/null
if [ $? = 0 ]; then
#echo "Ping erfolgreich"
NEWSTATE=on
echo on > $0.temp
else
NEWSTATE=off
#echo "Ping nicht erfolgreich"
echo off > $0.temp
fi

if [ $OLDSTATE != $NEWSTATE ]; then
   if [ $NEWSTATE = on ] ; then
      # echo on
      echo "set $DUMMYSTATEDEVICE on" | /sbin/socat -  $TARGET
   else
      # echo off
      echo "set $DUMMYSTATEDEVICE off" | /sbin/socat -  $TARGET
   fi
fi
####checkVUDuostate.sh

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com