Ubiquiti mFi/mPower Steckdosenleisten Wlan/Lan - neues Modul: 98_UbiquitiMP.pm

Begonnen von pipp37, 01 April 2015, 11:10:51

Vorheriges Thema - Nächstes Thema

Wzut

@det. , wie hast du den timeout Wert gesetzt ? die Meldungen deuten darauf hin das du dem Modul etwas zuwenig Zeit gibst mit der Ubi fertig zu reden.
verbose auf 5 wird dir im log zeigen das ein Teil der Kommandos schon abgerabeitet wurde.
Ich empfehle den timeout auf min 4-6 zu stellen. Das Modul brauch etwas länger (ca.1 Sekunde) als seine Vorgänger bis es sich zurückmeldet. Hintergrund :
Ich hatte bei mir gesehen das ab und an die Telnet Kommandos zur Ubi etwas zu schnell hintereinander kamen, darum ist jetzt zwischen jedem Komando (das sind bei Get Status 3) eine Wartezeit von 0.5 Sekunden
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Wzut

Zitat von: det. am 24 April 2015, 21:48:05
Verbose steht bei mir generell auf 0, sorry.
Global oder für das Ubi Modul ? Ich würde gerade jetzt am Anfang den Level für das Ubi Modul auf 3 setzen, so bekommst wenigstens mit wenn ab und an mal was schief läuft und um grundsätzliche Fehler zu finden ist der verbose 5 (für das Modul) halt sehr hilfreich.
Aber guter Einwand mit der 2 in der commandref , werde ich gleich mal ändern.   
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

carlos

FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

Wzut

ja mit den timeout muss jeder selbst schauen was in seinem Umfeld nötig ist. Die meiste Zeit verbraucht das set ALL Kommando,
da hier z.B. bei einer 6er Leiste sechs mal die Wartezeit zuschlägt -> aktuell sind das schon 3 Sekunden !
Bei mir war die WLAN Verbindung die ganze Zeit im Grenzbereich (etliche Timeouts über 24 Stunden mit 300 Sekunden Interval)
nachdem ich das gestern etwas verbessern konnte kann ich auch wieder kleinere Timeout und Wartezeiten Werte verwenden ohne eine einzige Meldung im Log zu haben.   
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Wzut

kannst du bitte mal schauen ob die Zeile 429 bei dir so auschaut :
Log3 $name, 5, "$name, ret -> ".$ret[0];
und wenn ja mal ändern in :
Log3 $name, 5, "$name, ret -> ".$ret[0] if($ret[0]);
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

pipp37

Hallo Wzut.
Hatte endlich wieder Zeit für Fhem und dein SVN Modul per Update installiert und alles umgestellt.
Meine 3 Stk. Leisten wurden perfekt eingebunden und ich habe keinerlei Fehlermeldungen im Log (3).

Etwas ist mir aufgefallen:
Ich habe attr groupPorts  Licht=1,3 bei der noch immer für dich verfügbaren Leiste definiert.
Leider erscheint der Punkt dann nicht mehr nach einem Fhem Neustart. Siehe Grafik 1 groupPorts.jpg.

Wenn eine Gruppe definiert wird und Fhem nicht neu gestartet wird sieht es wie in groupPorts-noreboot.jpg  aus.

Und in Device specific help sollte es  statt groupList groupPorts lauten.



Ich bin begeistert, wie  weit du das Modul schon programmiert hast. Alle Achtung. Danke.

Denkst du noch, dass du die Offset Geschichte machen wirst?




Vmware-ESX-VM-Ubuntu 16.04 Docker Main-FHEM -> Raspberry Pi-B ser2net
HMLAN mit HomeMatic, Busware SCC433 stacked SCC868 (culfw), Jeelink, MAX Heizkörperthermostate, Enigma2 (Vudo2/DM800SE), Philips 55" Ambilight PHTV - WMBUS EnergyCam+Engelmann FAW, Intertechno-Komponenten, Ubiquiti mPower

pipp37

Nachtrag: Auf einmal funktioniert groupPorts  wenn 2 Gruppen definiert wurden nach fhem Neustart.
Dann passt alles.

Dann wurde die 2. Gruppe gelöscht und Fhem neu gestartet.
Auch dann ging es auf einmal???

Licht=1,3 Lüfter=1,2

Vmware-ESX-VM-Ubuntu 16.04 Docker Main-FHEM -> Raspberry Pi-B ser2net
HMLAN mit HomeMatic, Busware SCC433 stacked SCC868 (culfw), Jeelink, MAX Heizkörperthermostate, Enigma2 (Vudo2/DM800SE), Philips 55" Ambilight PHTV - WMBUS EnergyCam+Engelmann FAW, Intertechno-Komponenten, Ubiquiti mPower

Wzut

Zitat von: pipp37 am 01 Mai 2015, 17:13:00
Leider erscheint der Punkt dann nicht mehr nach einem Fhem Neustart. Siehe Grafik 1 groupPorts.jpg.
Wenn eine Gruppe definiert wird und Fhem nicht neu gestartet wird sieht es wie in groupPorts-noreboot.jpg  aus.

Und in Device specigic help sollte es  statt groupList groupPorts lauten.

Ich bin begeistert, wie  weit du das Modul schon programmiert hast. Alle Achtung. Danke.

Denkst du noch, dass du die Offset Geschichte machen wirst?
a  - da läuft was gewaltig schief bei dir  mt den Gruppen, den Fehler vom ersten Bild kann ich geistig ja noch nachvollziehen aber beim zweiten Bild ??? da wird irgendwie der String nicht richtig zerlegt , hmmm
b. commandref -> ok beim nächsten Update heute Abend ( @det :  ich hatte später  deinen Fehler auch im Log :) )
c. ja die Offsets, ich muss leider zugeben das ich es immer noch nicht kapiert habe  wozu die deiner Meinung nach benötigen werden :(

Ansonsten war die schnelle (und gute ha ha ha ) Arbeit reiner Eigennutz , dein Wunsch kam genau zur der Zeit als ich mir eigentlich gerade noch zwei EDIPLUG 1101 für ein neues Projekt kaufen wollte. Nun werkelt da statt der beiden EDIPLUGS eine 3er Ubi, Die Tage wird noch eine 1er dazu kommen  :)
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Wzut

@pipp37 , tut mir leid :( ich kann machen was ich will, es gelingt mir einfach nicht deinen Fehler mit dem verwürfelten Set Menü nachzustellen.
wie sieht denn dein attr groupPorts aus ?

Fix :
a. Es war bisher möglich Gruppen zu definieren mit nur einem Port in der Gruppe
b. Änderungen am attr groupPorts zur Laufzeit haben nicht die Internals group_x aktualisiert
bzw . beim kompletten löschen des Attributes blieben die Gruppen beim Set Kommando bestehen. 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

pipp37

Hallo Wzut.
Ich habe nun mal meine UBI-CFG  in das Testsystem kopiert.
Vorher ein update und shutdown restart.

Dann habe ich eine neues Attribut groupPorts mit dem Button attr angelegt: Licht=1,3
Die beiden Bilder zeigen die seltsamen Sets.

Wenn ich dann shutdown restart eingebe und im Chrome dann auf einen anderen Punkt klicke (z.b. Everything) und dann wieder zurück auf den Raum UBI, dann passt es.

Weitere Info.
Ich habe die ganzen UBI CFGs mit include fhem-ubi-inc.cfg in die fhem.cfg eingebunden.


Nachtrag.
Wenn das Attribut groupPorts gelöscht wird,  kann ich trotzdem immer noch mit dem set Button die Gruppe auswählen und auch schalten.
-----
Dann mit dem Firefox das selbe Verhalten.

Weiters habe ich dann mit den Attr. Button groupPorts in LichtFF=1,2 Heizung=3  geändert. Das selbe Bild allerdings ist es nach dem Neustart immer noch falsch.
Auch wenn ich es in LichtFF=1,2 Heizung=3,2  ändere bleibt es so (auch nach dem Neustart shutdown restart).
Dann wurde es in LichtFF=1,2 Heizung=2,3 geändert. - Fehler noch immer da - dann shutdown restart in der UI. Auf einmal keine Gruppe mehr da.
Erst nach service fhem stop und service fhem start passte es dann perfekt.








Vmware-ESX-VM-Ubuntu 16.04 Docker Main-FHEM -> Raspberry Pi-B ser2net
HMLAN mit HomeMatic, Busware SCC433 stacked SCC868 (culfw), Jeelink, MAX Heizkörperthermostate, Enigma2 (Vudo2/DM800SE), Philips 55" Ambilight PHTV - WMBUS EnergyCam+Engelmann FAW, Intertechno-Komponenten, Ubiquiti mPower

Wzut

Zitat von: det. am 02 Mai 2015, 20:44:44
bedeutet a. das morgen nach dem Update die Gruppe Licht, die nur aus Port 6 besteht nicht mehr funktioniert?
Richtig , warum den Umweg über Gruppe statt Port 6 direkt zu schalten ? Aber wenn es denn unbedingt sein muss Licht=6,6 sollte es möglich machen :)

@pipp37, bitte teste nochmal mit der neuen Version von gestern Abend. Wichtig ist vor allem :
Wenn du eine Gruppe veränderst müssen sich immer zwei Dinge verändern : 
a. die Gruppe bei Sets und
b. ein Internal mit dem Namen group_<Gruppe> und den Ports der Gruppe.

Auch wenn ich mich wiederhole : das fehlerhafte  set dropdown Menü kann ich mir nicht erklären und schaffe es auch nicht das bei mir nachzubilden.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

pipp37

Hallo Wzut.
Hilft es, wenn ich dir über einen Pptp Vpn Tunnel einen Zugang zu einem  Test-Dev-Fhem einrichte?
Dann hast du Ssh und http Zugriff.
Gruss
------------
Info: Es gibt eine neue Ubi-Firmware 2.1.11.
Das Update über das WebUi hat mit dem Firefox nicht geklappt. Musste den IE nehmen.




Gesendet von iPhone mit Tapatalk
Vmware-ESX-VM-Ubuntu 16.04 Docker Main-FHEM -> Raspberry Pi-B ser2net
HMLAN mit HomeMatic, Busware SCC433 stacked SCC868 (culfw), Jeelink, MAX Heizkörperthermostate, Enigma2 (Vudo2/DM800SE), Philips 55" Ambilight PHTV - WMBUS EnergyCam+Engelmann FAW, Intertechno-Komponenten, Ubiquiti mPower

Wzut

@pipp37, ich denke das wird nicht viel nützen. Wie ich das sehe liegt dein Problem weniger bei der Ubi oder dem FHEM Modul sondern ehe bei deinen Webbrowsern. Ich würde daher an deiner Stelle mal vollständig auf den Browser verzichten und alle Tests direkt auf Konsolenebene durchführen. Interessant ist vor allem der Punkt wenn der Browser das falsche Set Menü anzeigt , was sagt dann die Konsole bei "set <name> ?"

Ich habe auf meiner Ubi nun auch die neue FW. Leider wurde mein bestehendes Problem das sie immer noch ständig nach einem mFi Server sucht damit nicht behoben. Laut Ubi Forum sollte der Fehler eigentlich schon seit der V2.1.4 gefixt sein. Dadurch das die Leiste permanent  mit dem mFi Server reden will stoppt und startet sie einige Prozesse im 100 Sekunden Takt ( = 10 Fehlversuche , ein Versuch alle 10 Sekunden) Das führt dann jedesmal dazu das sich die Leiste komplett vom WLAN abmeldet und nach einiger Zeit neu anmeldet. FHEM bekommt das auch mit, daher finde ich pro Tag auch etliche Timeout Meldungen im FHEM Log :(

OK, wenn die Leiste von Haus aus so gesprächig ist und sich das nicht abschalten lässt warum dann den Nachteil nicht in einen Vorteil Verwandeln ? D.h. ich werde mal schauen was ich über die Kommunikation zischen mPower und mFi in Erfahrung bringen kann und ob man die mFi Grundfunktionen nicht ins FHEM Modul packen kann, dann bräuchte man die Leiste auch nicht mehr alle X Minuten anpollen um immer den aktuellen Status zu haben.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

pipp37

@wzut:
Dort ist das Protokoll beschrieben.
https://github.com/mcrute/ubntmfi/blob/master/inform_protocol.md
Ob du dir das antun möchtest?

Leider habe ich auch die permanenten Wlan Abbrüche und bin bei Recherchen fündig geworden.
Schuld ist der immer neu startende mcad Prozess der auch das Neustarten mit /usr/etc/syswrapper.sh restart-wpasupplicant auslöst.

Das hat allerdings nur Auswirkungen auf das WPA und WPA2 Wlan-Protokoll.  Ich habe darum bei meinem Mikrotik Accesspoint zusätzlich ein WLAN mit WEP64 eingerichtet und der mcad Prozess der Leiste startet zwar immer noch neu aber die Verbindungsabbrüche sind Geschichte.

Ich hatte auch sehr auf eine neue Firmware gehofft, die das Neustarten der wpa_supplicant ohne Controllerverbindung behebt.



May  4 10:00:48 mFi-mPowerMini-D25DFE user.debug syslog: libubnt_exec.syswrapper_impl(): [EXEC] /usr/etc/syswrapper.sh restart-mcad
May  4 10:03:05 mFi-mPowerMini-D25DFE user.debug syslog: libubnt_exec.syswrapper_impl(): [EXEC] /usr/etc/syswrapper.sh restart-mcad
May  4 10:05:22 mFi-mPowerMini-D25DFE user.debug syslog: libubnt_exec.syswrapper_impl(): [EXEC] /usr/etc/syswrapper.sh restart-mcad
May  4 10:07:40 mFi-mPowerMini-D25DFE user.debug syslog: libubnt_exec.syswrapper_impl(): [EXEC] /usr/etc/syswrapper.sh restart-mcad
May  4 10:09:57 mFi-mPowerMini-D25DFE user.debug syslog: libubnt_exec.syswrapper_impl(): [EXEC] /usr/etc/syswrapper.sh restart-mcad
May  4 10:12:14 mFi-mPowerMini-D25DFE user.debug syslog: libubnt_exec.syswrapper_impl(): [EXEC] /usr/etc/syswrapper.sh restart-mcad
May  4 10:14:32 mFi-mPowerMini-D25DFE user.debug syslog: libubnt_exec.syswrapper_impl(): [EXEC] /usr/etc/syswrapper.sh restart-mcad
May  4 10:16:49 mFi-mPowerMini-D25DFE user.debug syslog: libubnt_exec.syswrapper_impl(): [EXEC] /usr/etc/syswrapper.sh restart-mcad
May  4 10:19:06 mFi-mPowerMini-D25DFE user.debug syslog: libubnt_exec.syswrapper_impl(): [EXEC] /usr/etc/syswrapper.sh restart-mcad
May  4 10:21:25 mFi-mPowerMini-D25DFE user.debug syslog: libubnt_exec.syswrapper_impl(): [EXEC] /usr/etc/syswrapper.sh restart-mcad
MF.





Ein anderer Workaround ist die offizielle Verwendung der /etc/persistent/rc.poststart.
Diese Datei wird 180 Sekunden nach dem Neustart der Leiste ausgeführt.

http://community.ubnt.com/ubnt/attachments/ubnt/mFi/5298/1/2.0.7%20new%20feature%20detail.pdf



Z.B. Habe ich folgendes getestet. (Quick and dirty..)

Inhalt: /etc/persistent/rc.poststart   (chmod +x nicht vergessen)

#echo 0 > /proc/power/output1
/bin/cp /etc/persistent/inittab /etc/inittab
/sbin/init -q
/sbin/pkill -9 syslogd
/sbin/pkill -9 mcad
/sbin/pkill -9 mca-monitor
/sbin/pkill -9 ubnt-websockets
/sbin/pkill -9 upnpd


Datei /etc/persistent/inittab

null::respawn:/bin/dropbear -F -d /var/run/dropbear_dss_host_key -r /var/run/dropbear_rsa_host_key -p 22
null::respawn:/bin/infctld
null::respawn:/bin/syslogd -n -O /var/log/messages -l 8 -s 200 -b 0
null::respawn:/sbin/udhcpc -f -i ath0 -V ubnt -A 10 -s /etc/udhcpc/udhcpc -p /var/run/udhcpc.ath0.pid -h "mFi-mPowerMini-D25DFE"
null::respawn:/bin/lighttpd -D -f /etc/lighttpd.conf
null::respawn:/bin/ubnt-websockets
null::respawn:/bin/ubnt-websockets --ssl -p 7682
null::respawn:/bin/telnetd -F -p 23
null::respawn:/bin/wpa_supplicant -D atheros -i ath0 -c /etc/wpasupplicant_WPA-PSK.conf
null::respawn:/sbin/ntpclient -n -s -c 0 -l -h pool.ntp.org
null::respawn:/bin/crond -f -S
#null::respawn:/bin/mcad
#null::respawn:/bin/mca-monitor
null::respawn:/usr/bin/wevent


Nach dem Ändern/Erstellen ein
save
reboot
nicht vergessen.



Erklärung:
Es wir eine neue inittab installiert die die 2 Prozesse nicht mehr startet. Und damit ist Ruhe.
Was die mcad und mca.monitor machen ist mir noch nicht klar.
Ich für meinen Teil lasse die Leisten im eigenen WEP64 Wlan Netz.




Vmware-ESX-VM-Ubuntu 16.04 Docker Main-FHEM -> Raspberry Pi-B ser2net
HMLAN mit HomeMatic, Busware SCC433 stacked SCC868 (culfw), Jeelink, MAX Heizkörperthermostate, Enigma2 (Vudo2/DM800SE), Philips 55" Ambilight PHTV - WMBUS EnergyCam+Engelmann FAW, Intertechno-Komponenten, Ubiquiti mPower

pipp37

Zur Info.
Ein wichtiges Script in der Leiste:
/usr/etc/syswrapper.sh


#!/bin/sh

#linker...  comment out below debugging code for now(bottom page also).  /var/log/admin fills up
# and cause node to stop functioning.  Talk to Mike about how to recyle this file so we can
# also retain some debug info on released nodes.
#set -x
#exec 2>>/var/log/admin
##exec 2>>/dev/console
COMMAND_LINE="$0 $@"
#echo "BEGIN SYSWRAPPER CMD: ${COMMAND_LINE}" >&2

log() {
logger -s -t "syswrapper" "$*"
}

exit_if_fake() {
if [ "`uname -a | grep mips`" = "" -o -f "/tmp/FAKE" ] ; then
# fake, simply dump it to console and exit 0
logger -s -t "syswrapper" "[fake] skipping $*"
exit 0
fi
}

set_state() {
echo $1 > /var/run/system.state
}

set_led() {
status=$1
freq=$2
locating="false"
if [ -f /proc/ubnthal/status/IsLocated ]; then
locating=`cat /proc/ubnthal/status/IsLocated`
fi
if [ -f /var/etc/persistent/cfg/mgmt ] ; then
led_disabled=`grep mgmt.led_enabled=false /var/etc/persistent/cfg/mgmt`
fi
if [ -z "$led_disabled" ] || [ "$locating" == "true" ]; then
# use new policy of not indicating controller status, at least if in-wall devices
BOARD=$(cat /etc/board.info | sed -n -r -e "s/board.shortname=(.*)\$/\1/p")
if [ "$BOARD" == "IWD1U" ] || [ "$BOARD" == "IWO2U" ] ; then
#if [ $status -eq 1 -a $freq -eq 1 ] ; then
if [ $status -eq 1 -a $freq -eq 1 ] ; then
freq=0
fi
fi
echo $status > /proc/led/status
echo $freq > /proc/led/freq
else
echo 0 > /proc/led/status
echo 0 > /proc/led/freq
fi
}


lockfile() {
TEMPFILE="$1.$$"
LOCKFILE="$1.lock"
( ( echo $$ > $TEMPFILE ) > /dev/null 2>&1 ) || \
{
log "[permission denied] fail to lock $1"
return 1
}
ln $TEMPFILE $LOCKFILE > /dev/null 2>&1 && \
{
rm -f $TEMPFILE
return 0
}
kill -0 `cat $LOCKFILE` > /dev/null 2>&1 && \
{
rm -f $TEMPFILE
return 1
}
log "[stale lock] removing stale lock file"
rm -f $LOCKFILE
ln $TEMPFILE $LOCKFILE > /dev/null 2>&1 && \
{
rm -f $TEMPFILE
return 0
}
rm -f $TEMPFILE
return 1
}

state_lock() {
until lockfile /var/run/system.state; do
log "[state is locked] waiting for lock"
sleep 1
done
trap "state_unlock" EXIT
}

# baud doesn't matter here, since serial sets it directly
# setting 7DATABITS and EVEN | ODD parity will cause ser2net to set them in software
#  parity NONE with 7DATABITS isn't supported, since Hornet only supports 8 data bits
# ser2net.conf is supported here to allow config like 7DATABITS, EVEN|ODD parity, and RAW mode
start_ser2net() {
if [ -f /etc/persistent/ser2net.conf ] ; then
/usr/bin/ser2net -c /etc/persistent/ser2net.conf
else
/usr/bin/ser2net -C "2323:telnet:0:/dev/ttyS0:115200"
fi
if [ -f /usr/etc/mfi/ser2net.cgi ] ; then
cgi -q /usr/etc/mfi/ser2net.cgi
fi
}

state_unlock() {
trap "" EXIT
/bin/rm -f "/var/run/system.state.lock"
}

# obtain lock first
set_state_ready() {
set_state 'ready'
state_reload
}

exit_if_busy() {
if [ -f /var/run/system.state ] ; then
state=`cat /var/run/system.state`
if [ "$state" != "ready" ] ; then
logger -s -t "syswrapper" "[busy] skipping: $*"
exit 0
fi
fi
}

# this would lock system state
exit_if_state_lock_failed() {
lockfile /var/run/system.state || \
{
log "[state is locked] skipping $*"
exit 0
}
trap "state_unlock" EXIT
}

# obtain lock first
state_reload() {
state="init"
default="true"
locating="false"
mcad_state="unknown"
mode=$(expr "`iwconfig ath0 | grep 'Mode:'`" : '.*Mode:\(M[a-z]*\)')
if [ -f /etc/counterfeit ]; then
set_led 4 4
return
fi
if [ -f /proc/ubnthal/status/IsDefault ]; then
default=`cat /proc/ubnthal/status/IsDefault`
fi
if [ -f /proc/ubnthal/status/IsLocated ]; then
locating=`cat /proc/ubnthal/status/IsLocated`
fi
if [ -f /var/run/system.state ] ; then
state=`cat /var/run/system.state`
fi
if [ -f /var/run/mcad.state ] ; then
mcad_state=`cat /var/run/mcad.state`
fi
if [ "$state" == "upgrading" ]; then
# echo upgrading
set_led 4 1
return
fi
if [ "$locating" == "true" ]; then
if [ "$default" == "true" ]; then
# echo default-locating
set_led 2 4
else
# echo locating
set_led 1 4
fi
return
fi

if [ -f /var/run/system.selfrun ]; then
# echo eth-selfrun
set_selfrun
#set_led 1 0
#return
else
# echo eth-managed
unset_selfrun
#set_led 1 0
#return
fi
#if [ "$state" == "ready" ]; then
# echo ready
#set_led 1 0
#return
#fi


if [ "$mcad_state" == "managed" ]; then
set_led 1 0
return
else
# not connected to the server
if [ -f /var/run/wificonfigured.ath0 ]; then
if [ -f /var/run/wifiready.ath0 ]; then
# wifi connected
count=0
        if [ -f /var/etc/persistent/cfg/mgmt ] ; then
count=`grep -c mgmt.servers /var/etc/persistent/cfg/mgmt`
        fi
if [ $count -gt 0 ]; then
set_led 1 1
else
# if controller is not configured
set_led 1 0
fi
else
# wifi is hunting
set_led 2 1
fi
# blink wifi status over DEFAULT state
return
else
# no wifi is configured
set_led 1 2
fi
fi
if [ "$default" == "true" ]; then
# echo default-ready
set_led 2 0
return
fi

# echo $state
#set_led 2 1
}

set_selfrun() {
if [ -f /var/run/system.selfrun.lock ]; then
return
fi
touch /var/run/system.selfrun.lock
if [ -f /var/run/system.selfrun_guest_pass ]; then
# echo selfrun-guest
exit_if_no_guest_portal
# bypass the guest authorization
ebtables -t nat -F AUTHORIZED_GUESTS
ebtables -t nat -A AUTHORIZED_GUESTS -j ACCEPT
fi
}

unset_selfrun() {
if [ -f /var/run/system.selfrun.lock ]; then
rm -f /var/run/system.selfrun.lock
if [ -f /var/run/system.selfrun_guest_pass ]; then
# echo unset-selfrun-guest
# re-enforce the guest authorization
rm /var/run/guest.authorized
authorized_guests_updated /var/run/guest.authorized
fi
fi
}
analog_off() {
if [ -f /usr/www/mfi/disable_analog.cgi ] ; then
cgi -q /usr/www/mfi/disable_analog.cgi
fi
}
disable_proc_power() {
if [ -d /proc/power/ ] ; then
#disable all outlet reading in the driver
for enabled in `ls /proc/power/enabled*`; do
# -99 means fw upgrade
echo -99 > $enabled
done
sleep 2
fi
}

wlan_overwrite_save() {
echo "wlan_overwrite_save" > /dev/ttyS0
cfgmtd -w -p /etc/persistent
}
# obtain lock first
cfg_save() {
set_state 'cfgupdate'
cfgmtd -w -p /etc /tmp/system.cfg
set_state_ready
}

# add_mac <file> <mac>
add_mac() {
del_mac "$1" "$2"
echo "$2" >> $1
}

# del_mac <file> <mac>
del_mac() {
file=$1
mac=$2
tmp=/tmp/macs.`basename $file`

grep -v "$mac" $file > $tmp
cp $tmp $file
}

# mac2serial <mac>
mac2serial() {
echo $1 | sed -e 's/://g' -e 'y/ABCDEF/abcdef/'
}

exit_if_no_guest_portal() {
portal_status=`cat /tmp/system.cfg|grep redirector.status=enabled`
if [ -z "$portal_status" ]; then
exit 0;
fi
}

# authorized_guests_updated
authorized_guests_updated() {
exit_if_no_guest_portal
ebtables -t nat -F AUTHORIZED_GUESTS
if [ -f $1 ]; then
ebtables -t nat -A AUTHORIZED_GUESTS --among-src `tr '\n' ',' < /var/run/guest.authorized` -j ACCEPT
fi
}

led_default() {
# was --> led: BOTH
echo 0 > /proc/led/freq
echo 2 > /proc/led/status
}

cmd="$1"
shift

case $cmd in
set-tmp-ip)
exit_if_fake $cmd $*
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_filter
    echo 1 > /proc/sys/net/ipv4/conf/$1/arp_filter
;;
set-adopt)
# set-adopt <url> <authkey>
mca-ctrl -t connect -s "$1" -k "$2"
;;
set-channel)
# set-channel <radio> <channel>
# FIXME: dual radio
for ath in `ls /proc/sys/net/*/%parent | cut -d '/' -f 5`; do
iwconfig $ath channel $1
done
;;
ip-changed)
# ip-changed <interface> <ip>
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_filter
    echo 1 > /proc/sys/net/ipv4/conf/$1/arp_filter
echo "$2" > /var/run/ipready.$1
echo "TODO notify processes that needs to know"
;;
led-locate)
exit_if_busy $cmd $*
# led-locate <duration>
/usr/bin/pkill led_locate.sh
# background this one so we'll return immediately
/usr/etc/led_locate.sh $1 &
;;
set-locate)
exit_if_busy $cmd $*
exit_if_state_lock_failed $cmd $*
/usr/bin/pkill led_locate.sh
echo "true" > /proc/ubnthal/status/IsLocated
state_reload
state_unlock
;;
unset-locate)
exit_if_busy $cmd $*
exit_if_state_lock_failed $cmd $*
/usr/bin/pkill led_locate.sh
echo "false" > /proc/ubnthal/status/IsLocated
state_reload
state_unlock
;;
scan)
exit_if_busy $cmd $*
/usr/bin/iwlist scan
;;
apply-config-nosave)
# apply-config <file>
analog_off
disable_proc_power
exit_if_busy $cmd $*
state_lock
/usr/etc/rc.d/rc restart
state_reload
state_unlock
;;
apply-config-save-reboot)
analog_off
disable_proc_power
exit_if_busy $cmd $*
state_lock
cfg_save "$1"
state_unlock
reboot
;;
apply-config)
# apply-config <file>
analog_off
disable_proc_power
exit_if_busy $cmd $*
state_lock
cfg_save "$1"
    sleep 2
/usr/etc/rc.d/rc restart
state_reload
state_unlock
;;
apply-config-mcad-setparam)
# apply-config-mcad-setparam <file>
# analog_off
# disable_proc_power
exit_if_busy $cmd $*
state_lock
cfg_save "$1"
#       sleep 2
/usr/etc/rc.d/rc restart-mcad-setparam
state_reload
state_unlock
;;
save-wlan-overwrite)
state_lock
wlan_overwrite_save
state_unlock
;;
save-config)
    state_lock
cfg_save
state_unlock
;;
reload)
exit_if_busy $cmd $*
exit_if_state_lock_failed $cmd $*
state_reload
state_unlock
;;
set-ready)
# called by mcagent
set_state_ready
;;
set-selfrun)
guestmode=$1
touch /var/run/system.selfrun
if [ "$1" == "off" ] ; then
# disable guest wlans
for ath in `cat /var/run/guest_devnames` ; do
ifconfig $ath down
done
else
exit_if_no_guest_portal
# bypass the guest authorization
ebtables -t nat -F AUTHORIZED_GUESTS
ebtables -t nat -A AUTHORIZED_GUESTS -j ACCEPT
fi
;;
unset-selfrun)
guestmode=$1
rm -f /var/run/system.selfrun
if [ "$1" == "off" ] ; then
# re-enable guest wlans
for ath in `cat /var/run/guest_devnames` ; do
ifconfig $ath up
done
else
# re-enforce the guest authorization
rm /var/run/guest.authorized
authorized_guests_updated /var/run/guest.authorized
fi
;;
restart)
exit_if_fake $cmd $*
exit_if_busy $cmd $*
echo 2 > /proc/led/status
echo 2 > /proc/led/freq
sleep 2
disable_proc_power
reboot
;;
iwd-default)
if [ -e /proc/power/dimmer_mode1 ] ; then
echo switch > /proc/power/dimmer_mode1
fi
rm /var/etc/persistent/cfg/iwd-default
cfg_save
;;
restore-default)
exit_if_fake $cmd $*
exit_if_busy $cmd $*
set_led 4 2
sleep 3
if [ -e /proc/power/dimmer_mode1 ] ; then
echo switch > /proc/power/dimmer_mode1
fi
sleep 2
disable_proc_power
    state_lock
led_default
# Erase the config partition
CFGPART="$(cat /proc/mtd | sed -n -r -e '/\"cfg\"/ { s/:.*//;s/mtd//;p }')"
tr '\000' '\377' </dev/zero | dd of=/dev/mtdblock${CFGPART} bs=1 count=$((0x40000))
reboot
#NB: trying to keep it locked until reboot to avoid race conditions
state_unlock
reboot
;;
download-firmware)
$0 _download-firmware "$1" &
;;
_download-firmware)
# downlaod-firmware <url>
wget -O /tmp/fwupdate.bin "$1" --tries=3 -c --timeout=30
cat /proc/uptime > /var/run/download_firmware.finished
;;
upgrade)
exit_if_fake $cmd $*
# upgrade <url>
wget -O /tmp/fwupdate.bin "$1" --timeout=30
fwupdate.real -c
if [ "$?" == "0" ] ; then
state_lock
set_state 'upgrading'
analog_off
disable_proc_power
/usr/etc/rc.d/rc stop
echo 1 > /proc/led/freq
echo 4 > /proc/led/status
fwupdate.real -m
set_state_ready
state_unlock
fi
;;
upgrade2)
exit_if_fake $cmd $*
# upgrade2
fwupdate.real -c
if [ "$?" == "0" ] ; then
exec 2>>/dev/console
/usr/etc/rc.d/rc stop
    state_lock
set_state 'upgrading'
echo 1 > /proc/led/freq
echo 4 > /proc/led/status
disable_proc_power
fwupdate.real -m
set_state_ready
    state_unlock
fi
;;

kick-serial)
# just a copy of apply-ser2net-cfg for now
killall ser2net
start_ser2net
;;

kick-sta)
exit_if_fake $cmd $*
for ath in `ls /proc/sys/net | grep ath` ; do
iwpriv $ath kickmac "$1"
done
;;
block-sta)
exit_if_fake $cmd $*
for ath in `ls /proc/sys/net | grep ath` ; do
iwpriv $ath addmac "$1"
iwpriv $ath kickmac "$1"
done
add_mac /etc/persistent/cfg/blocked_sta "$1"
state_lock
cfg_save
state_unlock
;;
unblock-sta)
exit_if_fake $cmd $*
for ath in `ls /proc/sys/net | grep ath` ; do
iwpriv $ath delmac "$1"
done
del_mac /etc/persistent/cfg/blocked_sta "$1"
state_lock
cfg_save
state_unlock
;;
apply-blocked-sta)
for ath in `ls /proc/sys/net | grep ath` ; do
# clear the acl
iwpriv $ath maccmd 3
# add acl
for mac in `cat /etc/persistent/cfg/blocked_sta` ; do
iwpriv $ath addmac "$mac"
done
done
;;
authorize-guest)
exit_if_fake $cmd $*
add_mac /var/run/guest.authorized $1
authorized_guests_updated /var/run/guest.authorized
;;
unauthorize-guest)
exit_if_fake $cmd $*
del_mac /var/run/guest.authorized $1
authorized_guests_updated /var/run/guest.authorized
;;
apply-authorized-guests)
exit_if_fake $cmd $*
if [ "`cat /var/run/guest.authorized`" != "" ] ; then
authorized_guests_updated /var/run/guest.authorized
fi
;;
clear-authorized-guests)
exit_if_fake $cmd $*
rm -f /var/run/guest.authorized
authorized_guests_updated /var/run/guest.authorized
;;
kill-cgi)
log "kill-cgi. reason: $*"
killall -9 cgi
sleep 1
;;
kill-mcad)
log "kill-mcad. reason: $*"
killall -9 mcad
    rm -f /var/run/mcad.setparam
sleep 1
# rely on /etc/inittab to start it
;;
set-led)
set_led $1 $2
;;
set-rmsSum)
    echo $1 > $2
    ;;
apply-port-nooutput-cfg)
# linker...
# configure port direction/modes
if [ -f /usr/etc/mfi/port_config.cgi ] ; then
cgi -q /usr/etc/mfi/port_config.cgi
fi
# initialize/configure/writing shift register value for gpio power
if [ -f /usr/sbin/ubnt-sr-cfg ] ; then
sed -i "s/\(DO[.0-9]*volt\=[0-9]*\)//" /etc/persistent/cfg/digital_cfg
/usr/sbin/ubnt-sr-cfg -i
fi
;;
apply-port-cfg)
# linker...
# configure port direction/modes
if [ -f /usr/etc/mfi/port_config.cgi ] ; then
cgi -q /usr/etc/mfi/port_config.cgi
fi
# initialize/configure/writing shift register value for gpio power
if [ -f /usr/sbin/ubnt-sr-cfg ] ; then
/usr/sbin/ubnt-sr-cfg -i
fi
;;
apply-device-cfg)
if [ -f /usr/etc/mfi/device_config.cgi ] ; then
cgi -q /usr/etc/mfi/device_config.cgi
fi
;;
restart-mcad)
pkill -9 mcad
rm -f /var/run/mcad.setparam
;;
restart-wpasupplicant)
pkill -9 wpa_supplicant
;;
refresh-ap-bssid)
(expr "`iwconfig ath0 | grep 'Access Point:'`" : '.*Access Point: \([^ ]*\)') > /tmp/ap_mac
;;
kill-ath-dhcp)
# kill only the wifi dhcpc
ps | grep udhcpc | grep ath0 | awk '{print $1}' | xargs kill
;;
kill-eth-dhcp)
# kill only the Ethernet dhcpc
ps | grep udhcpc | grep eth0 | awk '{print $1}' | xargs kill
;;
disable-analog)
analog_off
;;
apply-analog-cfg)
# linker...
# configure analog ports
if [ -f /usr/etc/mfi/analog_config.cgi ] ; then
cgi -q /usr/etc/mfi/analog_config.cgi
fi
;;
apply-vpower-norelay-cfg)
# configure vpower ports
if [ -f /usr/etc/mfi/vpower_config.cgi ] ; then
sed -i "s/\([a-z.0-9]*relay\=[0-9]\)//" /etc/persistent/cfg/vpower_cfg
    cgi -q /usr/etc/mfi/vpower_config.cgi
fi
;;
apply-vpower-cfg)
# configure vpower ports
if [ -f /usr/etc/mfi/vpower_config.cgi ] ; then
    cgi -q /usr/etc/mfi/vpower_config.cgi
fi
;;
apply-power-on-defaults)
if [ -f /usr/etc/mfi/default_config.cgi ] ; then
    cgi -q /usr/etc/mfi/default_config.cgi
fi
;;
preserve-vpower-output)
sed -i 's/vpower.'${1}'.relay\=[0-9]*/vpower.'${1}'.relay\='${2}'/' /etc/persistent/cfg/config_file
sed -i 's/vpower.'${1}'.relay\=[0-9]*/vpower.'${1}'.relay\='${2}'/' /etc/persistent/cfg/vpower_cfg
;;
process-wlan-overwrite)
#echo "process-wlan-overwrite" > /dev/ttyS0
if [ -f /tmp/wlan_overwrite ] ; then
cp /tmp/wlan_overwrite /etc/persistent/cfg/wlan_overwrite.cfg
rm /tmp/wlan_overwrite
cfg_save
fi
;;
set-vpower-output)
echo $1 > /proc/power/relay$2
;;
apply-ser2net-cfg)
killall ser2net
# maybe we shouldn't restart ser2net here? 
start_ser2net
;;
apply-serial-cfg)
if [ -f /etc/persistent/cfg/serial_cfg ] ; then
speed=`cat /etc/persistent/cfg/serial_cfg | grep -m 1 speed | cut -d \= -f 2`
if [ "$speed" == "" ] || [ "$speed" == "default" ] ; then
speed="115200"
fi
destination=`cat /etc/persistent/cfg/serial_cfg | grep -m 1 destination | cut -d \= -f 2`
if [ "$destination" == "" ] || [ "$destination" == "default" ] ; then
destination="remote"
fi
else
speed="115200"
destination="remote"
fi
if [ "$speed" != "off" ] ; then
/usr/bin/stty $speed < /dev/ttyS0
if [ "$destination" == "flash" ] ; then
# kill ser2net if it is running
killall ser2net
# start flash/serial if it is not running
pid=`ps | grep "location.cgi" | grep -v grep | cut -d" " -f 3`
if [ "$pid" == "" ] ; then
/usr/bin/cgi -q /etc/persistent/bin/location.cgi &
fi
pid=`ps | grep "inform.cgi" | grep -v grep | cut -d" " -f 3`
if [ "$pid" == "" ] ; then
/usr/bin/cgi -q /etc/persistent/bin/inform.cgi &
fi
#elif [ "$destination" == "console" ] ; then
# need to dynamically add console, but inittab isn't friends to this
else
# kill flash/serial if it is running
pid=`ps | grep "serial.cgi" | grep -v grep | cut -d" " -f 3`
if [ "$pid" != "" ] ; then
kill $pid
fi
fi
else
killall ser2net
pid=`ps | grep "serial.cgi" | grep -v grep | cut -d" " -f 3`
if [ "$pid" != "" ] ; then
kill $pid
fi
fi
;;
gen-sup)
filename=$1
if [ -z "$filename" ]; then
filename=support_info.tgz
fi
file=/tmp/$filename
dirname=support_info
ddir=/tmp/$dirname
rm -rf $ddir
rm -rf $file
mkdir -m 0755 $ddir

cp /tmp/sysinit.txt $ddir
cp /etc/board.info $ddir
cp /tmp/system.cfg $ddir
cp /usr/lib/version $ddir
ifconfig -a > $ddir/ifconfig.txt
iwconfig > $ddir/iwconfig.txt
athstats > $ddir/athstats.txt
80211stats -a > $ddir/80211stats.txt
wlanconfig ath0 list > $ddir/wlist.txt
dmesg -s 16384 > $ddir/dmesg.txt
ps > $ddir/ps.txt
log_status=`cat /tmp/system.cfg|grep syslog.status=enabled`
if [ -n "$log_status" ]; then
log_file=`cat /tmp/system.cfg|grep syslog.file|cut -d= -f2`
if [ -z "$log_file" ]; then
log_file=/var/log/messages
fi
log_rotate=`cat /tmp/system.cfg|grep syslog.rotate|cut -d= -f2`
if [ -z "$log_rotate" ]; then
log_rotate=0
fi
while [ $log_rotate -gt 0 ]; do
log_rotate=`expr $log_rotate - 1`
cat $log_file.$log_rotate >> $ddir/syslog.txt
done
cat $log_file >> $ddir/syslog.txt
fi
cp /proc/meminfo /proc/slabinfo /proc/loadavg /proc/vmstat /proc/modules /proc/kallsyms /proc/net/arp $ddir
dd if=/dev/mtdblock`cat /proc/mtd |grep cfg|cut -d: -f1|cut -dd -f2` of=$ddir/part.cfg > /dev/null 2>&1
dd if=/dev/mtdblock`cat /proc/mtd |grep EEPROM|cut -d: -f1|cut -dd -f2` of=$ddir/part.cfg > /dev/null 2>&1
tar -C /tmp -zcf $file $dirname
;;
restore-ap)
state_lock
led_default
cp /etc/default.cfg /tmp/system.cfg
#cfg_save /tmp/system.cfg
state_unlock
/usr/etc/rc.d/rc restart_wifi
    ;;
restore-captiveportal)
# killall watch.sh
state_lock
led_default
cp /etc/default.cfg /tmp/system.cfg
#cfg_save /tmp/system.cfg
state_unlock
/usr/etc/rc.d/rc restart_captiveportal
    ;;
*)
exit 1
;;
esac


Vmware-ESX-VM-Ubuntu 16.04 Docker Main-FHEM -> Raspberry Pi-B ser2net
HMLAN mit HomeMatic, Busware SCC433 stacked SCC868 (culfw), Jeelink, MAX Heizkörperthermostate, Enigma2 (Vudo2/DM800SE), Philips 55" Ambilight PHTV - WMBUS EnergyCam+Engelmann FAW, Intertechno-Komponenten, Ubiquiti mPower