Schleifen und Variablen in Fhem

Begonnen von harway2007, 22 September 2015, 21:45:36

Vorheriges Thema - Nächstes Thema

harway2007

Wie erzeugt man eine Schleife mit Zähler und Varibalen Übergabe
an ein Fhem Objekt bzw. an den Gong und wie erzeugt man vorher
globale Variablen die im ganzen Fhem gelten?
A=5
B=10
C=1
gelernt in alten Zeiten :
For I = A to B Step C
Print I
SchalterNr = String "Schalter" + "VAL(I)"
set SchalterNr on
Next I

der Hintergrund ist der Gong soll den Stundenschlag
abhängig von der aktuellen Stunde wiederholen ..
um 7 Uhr also 7 mal...um beim obigen Beispiel zu bleiben
in etwa so:
For I = 1 to $hour
set Gong3 playTone 45
Next I

Beispiele aus dem Codeschnispel Wanduhr mit DOELSEIF hab ich versucht ...
bin daran aber gescheitert ...

MFG Harway

Bennemannc

Hallo,

ich würde das auslagern in die 99_myUtils. Als nächstes würde ich mich mal in perl einlesen. Die Logik hast Du ja schon - also einfach die Funktion in 99_myUtils aufrufen und die Stundenzahl übergeben.
Dann hilft googlen - Perl Schleifen und Du findest:
http://www.hs-kl.de/~peter.liell/html_Referenz/tgce.htm oder Ähnliches.
Dazu die commandref lesen, damit man aus Perl fhem befehle ausgeben kann.
Daraus kannst Du dann die Schleife bauen und bei jedem Durchlauf mit Zähler++ den Zähler raufsetzen bis die Stundenzahl erreicht ist.

Gruß Christoph
Cubietruck, Fhem 5.8
CC-RT-DN|LC-SW2-FM|RC-12|RC-19|LC-SW4-BA-PCB|LCp-SW1-BA-PCB|ES-PMSw1-Pl|LC-Bl1PBU-FM|PBI-4-FM|CC-VD|CC-TC|SEC-SC(2)|RC-KEY3-B|LC-Sw1PBU-FM|PB-2-FM|WDS100-C6-O|WDC7000|LC-Bl1-FM
Module: Dewpoint,FB_Callmonitor,HCS,Panstamp,at,notify,THRESHOLD,average,DOIF

harway2007

erste Tip war gut:
den Teil in perl hab ich wahrscheinlich verstanden

#!/usr/bin/perl
#Stundenschlag

sub Stundenschlag()
{
$i = $hour;
while($i <= $hour)
{
fhem("set Gong3 playTone 45")   
  $i++;
}
}
# Ende Stundenschlag

Frage wie erfolgt dann der Aufruf aus Fhem und wie kommt die sub an den Fhem Wert
$hour - oder ist das ein perl wert ?

franky08

#3
Der Aufruf aus fhem erfolgt, indem du die sub über{name sub} aufrufst. Die $hour Geschichte geht in Perl über localtime.

P.S. Hier ein Beispiel von mir, Zeit und Datum:
sub date_time()

{

my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat,
    $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
my $CTIME_String = localtime(time);
$Monat += 1;
$Jahrestag += 1;
$Jahr += 1900;

my @Wochentage = qw(Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag);
my @Monatsnamen = qw(Januar Februar März April Mai Juni Juli August September Oktober November Dezember);



my $datum_2 = sprintf("%s der %2d..%s %04d",
   $Wochentage[$Wochentag],
   $Monatstag,
   $Monatsnamen[$Monat-1],
   $Jahr,
);

my $zeit_1 = sprintf("Es ist %02d:%02d Uhr",
   $Stunden,
   $Minuten,
);


Siehe: http://wiki.selfhtml.org/wiki/Perl/Funktionen_für_Datum_und_Uhrzeit

VG
Frank
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

harway2007

mmh
CUL_HM_HM_PBI_4_FM_1EF508_Btn_03:Short.* set MyTTS tts sage {date_time( )};
sagt leider date unterstrich time ...


franky08

Sieh mal hier, da hatte ich mal so etwas für Android gebaut, dass funktioniert prinzipiell auch mit TTS.

http://forum.fhem.de/index.php/topic,25621.0.html

VG
Frank
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

Puschel74

Zitat von: harway2007 am 22 September 2015, 21:45:36

Beispiele aus dem Codeschnispel Wanduhr mit DOELSEIF hab ich versucht ...
bin daran aber gescheitert ...

MFG Harway
D.h. du scheiterst an einer Anleitung zum Fahrrad fahren willst dir aber dann doch ein Fahrrad bauen um das Fahrrad fahren zu lernen.
Nun ja, es finden sich sicher genug Freiwillige die dir helfen werden  8)
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

franky08

Hab ich gerade erst gesehen, der Aufruf der sub erfolgt über {sub_name} und nicht {sub_name()}

VG
Frank

P.S. jedenfalls rufe ich alle meine Subroutinen ohne runde Klammern auf  8)
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

harway2007

schon gemerkt .. DANKE .. ich bin schon recht gut  :)..
wenn man so alleine vor den Problemen sitzt ohne mal reden zu können ist das schon
verdammt schwer.. jetzt redet mein Fhem ohne Ende mit mir  8) Dank deiner Hilfe
noch Lust auf ein weiteres Problem ?



franky08

Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

harway2007

mein Readingsval ergibt bei der Gradzahl zum Beispiel 15.7 Grad ..
die Ausgabe sagt 15 macht ne mini Pause .. ohne punkt .. und sagt 7 ..
also 15 7
mein Versuch nur den INT Anteil zu bekommen führt zu einer riesigen Zahl:

my $temp = ReadingsVal('CUL_HM_HM_CC_RT_DN_2E1ED7_Weather','measured-temp','Fehler');
my $Gradzahl =  int{$temp};
fhem "set MyTTS tts im Dachgeschoß ist es  $Gradzahl Grad";

 

franky08

Das Problem hatte ich mit TTS auch, bei mir läuft sämtliche Sprachausgabe auf einem Android Tablet über WVC. M.W. arbeiten beide Sprachausgaben mit der gleichen Google Engine, warum das bei WVC funktioniert und mit TTS say nicht, ist mir bis jetzt ein Rätsel. Du könntest aber das Komma einfach als "Komma" ansagen lassen  :)
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

Starkstrombastler

Nicht aufgeben, sondern weiter in Perl einlesen.
Zitat von: harway2007 am 23 September 2015, 23:11:11
my $Gradzahl =  int{$temp};
sollte mit int($temp) zum Ziel führen
IPC\Ubuntu + Fhem, 1wire, Shellies, Siemens Logo!, Z-Wave, PhilipsTV, Vu+duo2, KM200

franky08

#13
Da hat er aber immer noch kein Komma, auf dem tablet übersieht man geschweifte und runde Klammer schnell mal  :o
Wenn man nur den integer der Temperatur braucht, sollte das aber so funktionieren.

P.S. Über die passende regex kann man auch einfach vor dem Komma abschneiden und genauso nach dem Komma und zum Schluss bei TTS tts alles wieder zusammensetzen und das Komma als "Komma" mit ansagen lassen

VG
Frank
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

harway2007

int($temp) tuts nicht sagt dann "int 15 7"
der int Befehl in perl soll so etwas machen:
Die int()-Funktion dient zum Einen dazu, den ganzzahligen Teil einer Zahl zu bestimmen. Nachkommastellen werden also abgeschnitten.
$zahl=1.23456;
print int($zahl);
1