Originally posted by: <email address deleted>
Hallo,
ich möchte die Homefunktion (WLan Erkennung) verbessern.
Hintergrund: Die FBox ändert (voraussichtlich bei Neustart) ab und zu die
Zuordnung der Landevices und dann muss man wieder die neuen
Landevicenummern eintragen.
Idee: Verwendung von "globalen" Variablen (Anzahl der globalen Variablen
entspricht Anzahl der Bewohner und enhält die Landdevicenummer).
Die globale Variable wird auf einen Standardwert (z.B. Landevice1) gesetzt.
Im Notify wird dann der Status und auch der Name des Landdevice1 geprüft.
Entspricht der Name nicht dem erwarteten "Handy Bewohner1" werden alle
landdevices gescannt, bis "Handy Bewohner1" gefunden wird, und die globale
Variable wird auf die neue Landevice Adresse eingestellt.
Entspricht der Name dem erwarteten "Handy Bewohner1" wird der Status der
WLan Verbindung ausgewertet.
Jetzt ist mir bewusst, wie ich z.b. mit eine lokale Variable in der Routine
(define testwlan at +*00:05:00) belegen kann, ich benötige jedoch die
Globale Variable ausserhalb der Routine, damit diese Variable nicht bei
jedem Aufruf wieder zurückgesetzt wird.
Liege ich als Programmierdummy hier völlig falsch ?
Alles Tips sind hier wilkommen, ggf. gibt es einen besseren Lösungsansatz ?
--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
> ich benötige jedoch die Globale Variable ausserhalb der Routine, damit diese
> Variable nicht bei jedem Aufruf wieder zurückgesetzt wird.
Vorschlag: dummy . Wird gespeichert, man kann es ueber Forntends direkt
anschauen/aendern.
Im Perl setzen:
fhem("set bewohner1 Landevice1")
Auslesen:
Value("bewohner1")
Fuer nicht persistente Daten steht das %data Hash zur Verfuegung.
--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Originally posted by: <email address deleted>
Hallo Rudi,
danke für die schnelle Hilfe. Mir gebührt mal wieder der Tomaten auf den
Augenpreis. Dummy benutze ich bereits ausgiebig ... habs aber irgendwie
nicht richtig eingeordnet.
Am Sonntag, 27. Mai 2012 09:39:40 UTC+2 schrieb AnonymousHolger:
>
> Hallo,
>
> ich möchte die Homefunktion (WLan Erkennung) verbessern.
>
> Hintergrund: Die FBox ändert (voraussichtlich bei Neustart) ab und zu die
> Zuordnung der Landevices und dann muss man wieder die neuen
> Landevicenummern eintragen.
>
> Idee: Verwendung von "globalen" Variablen (Anzahl der globalen Variablen
> entspricht Anzahl der Bewohner und enhält die Landdevicenummer).
>
> Die globale Variable wird auf einen Standardwert (z.B. Landevice1)
> gesetzt. Im Notify wird dann der Status und auch der Name des Landdevice1
> geprüft. Entspricht der Name nicht dem erwarteten "Handy Bewohner1" werden
> alle landdevices gescannt, bis "Handy Bewohner1" gefunden wird, und die
> globale Variable wird auf die neue Landevice Adresse eingestellt.
> Entspricht der Name dem erwarteten "Handy Bewohner1" wird der Status der
> WLan Verbindung ausgewertet.
>
> Jetzt ist mir bewusst, wie ich z.b. mit eine lokale Variable in der
> Routine (define testwlan at +*00:05:00) belegen kann, ich benötige jedoch
> die Globale Variable ausserhalb der Routine, damit diese Variable nicht bei
> jedem Aufruf wieder zurückgesetzt wird.
>
> Liege ich als Programmierdummy hier völlig falsch ?
>
> Alles Tips sind hier wilkommen, ggf. gibt es einen besseren Lösungsansatz ?
>
>
>
--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Originally posted by: <email address deleted>
Mal wieder habe ich das übliche Parsingproblem. Wie die Parameter übergeben
? Was ist Perl, was ist SH ... ich blick da echt nicht durch.
Aktuelles kleines Testprogramm:
In beiden Fällen (mit ${$lanDev} und mit $value(LandDeviceHolger)) scheint
es nicht zu klappen ... hab schon verschiedene Varianten ausprobiert !
Was wäre denn noch zu probieren ? Parameter in '' oder mit @ oder ... ?
define LanDeviceMaria dummy
define LanDeviceHolger dummy
set LanDeviceHolger 8
set LanDeviceMaria 13
define testwlan1 at +*00:01:00 {\
my
@Devicelist=("1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25");;\
my $Status="";;\
my $User="";;\
foreach my $lanDev (@Devicelist){\
$Status=qx(/usr/bin/ctlmgr_ctl r landevice
settings/landevice${$lanDev}/active );;\
print $Status;;\
$Status=qx(/usr/bin/ctlmgr_ctl r landevice
settings/landevice$value(LandDeviceHolger)/active );;\
print $Status;;\
}\
}
Am Sonntag, 27. Mai 2012 09:55:53 UTC+2 schrieb AnonymousHolger:
>
> Hallo Rudi,
>
> danke für die schnelle Hilfe. Mir gebührt mal wieder der Tomaten auf den
> Augenpreis. Dummy benutze ich bereits ausgiebig ... habs aber irgendwie
> nicht richtig eingeordnet.
>
> Am Sonntag, 27. Mai 2012 09:39:40 UTC+2 schrieb AnonymousHolger:
>>
>> Hallo,
>>
>> ich möchte die Homefunktion (WLan Erkennung) verbessern.
>>
>> Hintergrund: Die FBox ändert (voraussichtlich bei Neustart) ab und zu die
>> Zuordnung der Landevices und dann muss man wieder die neuen
>> Landevicenummern eintragen.
>>
>> Idee: Verwendung von "globalen" Variablen (Anzahl der globalen Variablen
>> entspricht Anzahl der Bewohner und enhält die Landdevicenummer).
>>
>> Die globale Variable wird auf einen Standardwert (z.B. Landevice1)
>> gesetzt. Im Notify wird dann der Status und auch der Name des Landdevice1
>> geprüft. Entspricht der Name nicht dem erwarteten "Handy Bewohner1" werden
>> alle landdevices gescannt, bis "Handy Bewohner1" gefunden wird, und die
>> globale Variable wird auf die neue Landevice Adresse eingestellt.
>> Entspricht der Name dem erwarteten "Handy Bewohner1" wird der Status der
>> WLan Verbindung ausgewertet.
>>
>> Jetzt ist mir bewusst, wie ich z.b. mit eine lokale Variable in der
>> Routine (define testwlan at +*00:05:00) belegen kann, ich benötige jedoch
>> die Globale Variable ausserhalb der Routine, damit diese Variable nicht bei
>> jedem Aufruf wieder zurückgesetzt wird.
>>
>> Liege ich als Programmierdummy hier völlig falsch ?
>>
>> Alles Tips sind hier wilkommen, ggf. gibt es einen besseren Lösungsansatz
>> ?
>>
>>
>>
--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Originally posted by: <email address deleted>
Hallo,
die verbesserte Home-Funktion ist fast fertig ... allerdings habe ich noch
ein Problem mit dem String Vergleich.
Vorgehen der Routine:
Routine prüft den Status von LandeviceX und Name von LandeviceX
Die zu prüfende Devicenummer X ist in einem Dummy gespeichert.
Wenn der Devicename nicht der Vorgabe (in meinem Beispiel = "Holger-IP4" )
entspricht, sollen alle Landdevices abgefragt werden und im Dummy dann die
neue korrekte Devicenummer X gespeichert werden.
Es scheint alles zu funktionieren, bis auf den Stringvergleich.
--
$TestUser=qx(/usr/bin/ctlmgr_ctl r landevice
settings/landevice$lanDev/name);;\
if ($TestUser eq "Holger-IP4"){\
--
Ich verstehe nicht, warum ! Wenn ich mit Log den Wert von $TestUser
anzeigen lasse, steht für landDevice7 "Holger-IP4" aber trotzdem wird nicht
in die if Schleife gesprungen, die den Dummy neu setzt ....
Bin mal wieder hilflos !! Irgendwelche Tips ?
Anbei Routine (muss später dann noch um die Prüfung für "Maria" erweitert
werden, daher auch die Maria Parameter ...)
define LanDeviceMaria dummy
define LanDeviceHolger dummy
set LandDeviceMaria 1
set LanDeviceHolger 2
define testwlan2 at +*00:01:00 {\
my
@Devicelist=("1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20");;\
my $UserHolgerLanID="";;\
my $StatusHolgerLanID="";;\
my $TestUser="";;\
my $HolgerLanID = $value{LanDeviceHolger};;\
$UserHolgerLanID=qx(/usr/bin/ctlmgr_ctl r landevice
settings/landevice$HolgerLanID/name);;\
$StatusHolgerLanID=qx(/usr/bin/ctlmgr_ctl r landevice
settings/landevice1/active);;\
$StatusHolgerLanID=$StatusHolgerLanID * 1;;\
if ($UserHolgerLanID eq "Holger-IP4") {\
if ($StatusHolgerLanID == 1) {\
if ($value{Holger_zu_Hause} eq "off") {\
fhem "set HomeStatus ZuHause";;\
}\
fhem "set Holger_zu_Hause on";;\
}\
else {\
if ($value{Holger_zu_Hause} eq "on") {\
if ($value{Maria_zu_Hause} eq "off") {\
fhem "set HomeStatus NichtzuHause";;\
}\
}\
fhem "set Holger_zu_Hause off";;\
};;\
}\
else {\
print $UserHolgerLanID;;\
foreach my $lanDev (@Devicelist){\
$TestUser=qx(/usr/bin/ctlmgr_ctl r landevice
settings/landevice$lanDev/name);;\
if ($TestUser eq "Holger-IP4"){\
fhem "set LanDeviceHolger $lanDev";;\
fhem "set LanDeviceMaria G";;\
}\
}\
};;\
}
Am Sonntag, 27. Mai 2012 11:11:06 UTC+2 schrieb AnonymousHolger:
>
> Mal wieder habe ich das übliche Parsingproblem. Wie die Parameter
> übergeben ? Was ist Perl, was ist SH ... ich blick da echt nicht durch.
>
> Aktuelles kleines Testprogramm:
> In beiden Fällen (mit ${$lanDev} und mit $value(LandDeviceHolger)) scheint
> es nicht zu klappen ... hab schon verschiedene Varianten ausprobiert !
>
> Was wäre denn noch zu probieren ? Parameter in '' oder mit @ oder ... ?
>
> define LanDeviceMaria dummy
> define LanDeviceHolger dummy
>
> set LanDeviceHolger 8
> set LanDeviceMaria 13
>
> define testwlan1 at +*00:01:00 {\
> my
> @Devicelist=("1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25");;\
> my $Status="";;\
> my $User="";;\
> foreach my $lanDev (@Devicelist){\
> $Status=qx(/usr/bin/ctlmgr_ctl r landevice
> settings/landevice${$lanDev}/active );;\
> print $Status;;\
> $Status=qx(/usr/bin/ctlmgr_ctl r landevice
> settings/landevice$value(LandDeviceHolger)/active );;\
> print $Status;;\
> }\
> }
>
> Am Sonntag, 27. Mai 2012 09:55:53 UTC+2 schrieb AnonymousHolger:
>>
>> Hallo Rudi,
>>
>> danke für die schnelle Hilfe. Mir gebührt mal wieder der Tomaten auf den
>> Augenpreis. Dummy benutze ich bereits ausgiebig ... habs aber irgendwie
>> nicht richtig eingeordnet.
>>
>> Am Sonntag, 27. Mai 2012 09:39:40 UTC+2 schrieb AnonymousHolger:
>>>
>>> Hallo,
>>>
>>> ich möchte die Homefunktion (WLan Erkennung) verbessern.
>>>
>>> Hintergrund: Die FBox ändert (voraussichtlich bei Neustart) ab und zu
>>> die Zuordnung der Landevices und dann muss man wieder die neuen
>>> Landevicenummern eintragen.
>>>
>>> Idee: Verwendung von "globalen" Variablen (Anzahl der globalen Variablen
>>> entspricht Anzahl der Bewohner und enhält die Landdevicenummer).
>>>
>>> Die globale Variable wird auf einen Standardwert (z.B. Landevice1)
>>> gesetzt. Im Notify wird dann der Status und auch der Name des Landdevice1
>>> geprüft. Entspricht der Name nicht dem erwarteten "Handy Bewohner1" werden
>>> alle landdevices gescannt, bis "Handy Bewohner1" gefunden wird, und die
>>> globale Variable wird auf die neue Landevice Adresse eingestellt.
>>> Entspricht der Name dem erwarteten "Handy Bewohner1" wird der Status der
>>> WLan Verbindung ausgewertet.
>>>
>>> Jetzt ist mir bewusst, wie ich z.b. mit eine lokale Variable in der
>>> Routine (define testwlan at +*00:05:00) belegen kann, ich benötige jedoch
>>> die Globale Variable ausserhalb der Routine, damit diese Variable nicht bei
>>> jedem Aufruf wieder zurückgesetzt wird.
>>>
>>> Liege ich als Programmierdummy hier völlig falsch ?
>>>
>>> Alles Tips sind hier wilkommen, ggf. gibt es einen besseren
>>> Lösungsansatz ?
>>>
>>>
>>>
--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
> Ich verstehe nicht, warum ! Wenn ich mit Log den Wert von $TestUser
> anzeigen lasse, steht für landDevice7 "Holger-IP4" aber trotzdem wird nicht
> in die if Schleife gesprungen, die den Dummy neu setzt ....
Evtl. steht in $TestUser "Holger-IP4\n" (also mit Zeilenende), sowas kan man
mit chomp($TestUser); entfernen. Oder man bittet regexp um Hilfe:
if($TestUser =~ m/Holger-IP4/){\
dann ist es egal, ob davor oder danach was steht.
Statt $value{x} empfehle ich Value("x"), da ich $value{x} in der Zukunft
entfernen will. Aus dem gleichen Grund sollte man
$defs{dname}{READINGS}{rname}{VAL} meiden, und stattdessen ReadingsVal("dname",
"rname", "defaultWert") verwenden. Siehe http://fhem.de/commandref.html#perl
Btw. solch grosse Code-Stuecke wuerde ich in 99_MyUtils als Funktion
realisieren, da kann man sich ;; und \ sparen. Aufrufen tut man es einfach mit
{ Function() }
Auf meinem FB dauert ctrl_mgr 22-mal aufzurufen etwa 5 Sekunden, d.h. fhem ist
in dieser Zeit blockiert, ein Caching wie Du das machst ist sinvoll. Eine
Alternative waere die Logik in einem externen Programm (shellskript) zu
realisieren, diese werden von fhem imer im Hintergrund gestartet.
Btw.: ctlmgr_ctl kommuniziert mit ctlmgr, indem es ueber named pipes xml
Nachrichten schreibt und auch solche wieder zurueckbekommt, siehe strace
ctlmgr_ctl. Die Aufgabe koennte man mit einem fhem-modul auch nicht blockierend
erledigen :)
--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com