[beantwortet] Array in einer Programmdatei "global" verfügbar machen

Begonnen von TomLee, 27 Juli 2023, 18:23:46

Vorheriges Thema - Nächstes Thema

TomLee

Vorab, das ist der erste Versuch den Code auszulagern, bisher hab ich ihn in den at und dem notify selbst genutzt, hoffe hab keinen Fehler drin. Hab aber vor das wenns zeitlich klappt noch vor Sonnenuntergang umzustellen, sonst halt morgen.

Kann sich das bitte mal wer anschauen und zeigen wie man das mit dem Array evtl. "wartbarer" umsetzen kann ?
Wenn es was mit dem data-Hash zu tun hat (dazu hab ich gelesen was mir mal Beta-User verlinkt hat), dann versteh ich immer noch nicht wie es umzusetzen wäre.

Kann man es (praktisch nur das aus der Funktion notdeko) nicht irgendwie nur oben in der Programmdatei angeben ?

Die Zeile mit dem pahColor wär auch sowas, was ich mir vorstelle nur einmal angeben zu müssen.

Wenn jemand sonst irgendwo Verbesserungsbedarf sieht, wär ich auch dafür dankbar.


package main;

use strict;
use warnings;

sub deko_Utils_Initialize {
  my $hash = shift // return;
  return;
}

sub dekosunrise { #at_Deko_sunrise
my $atdss = shift;
my $tl = shift;
my $month = localtime->mon;
my $x = sunrise();
my $pc = substr(Color::pahColor(0,15,30,ReadingsVal('HF_Aussensensor_Vorderhaus','temperature','0'),2,0),0,6);
my @dev = ( 'MQTT2_WLED_G1',
'MQTT2_WLED_Haustuer_Pen',
'MQTT2_WLED_FR',
'MQTT2_WLED_TV',
'MQTT2_zigbee_rgbw_bulb_flur_privat',
'MQTT2_zigbee_bodenlichterkette');
my $d = qq($dev[0]|$dev[1]|$dev[3]|$dev[4]|$dev[5]);
my $do = qq($dev[0]|$dev[1]|$dev[3]);

return fhem("
set not_BM_Garage status on;
set $do effectname Solid;
set $d:FILTER=state!=on on-till $x;
set $d rgb $pc;
setreading $tl ftui_hide 1;
setreading $atdss ftui_hide 0") if $month < 5 || $month > 7;
}

sub dekosunset { #at_Deko_sunset
my $self = shift;
my $tl = shift;
my $month = localtime->mon;
my $x = rand(60);
$x = sprintf("%02d:%02d",$x/60,$x%60);
my $pc = substr(Color::pahColor(0,15,30,ReadingsVal('HF_Aussensensor_Vorderhaus','temperature','0'),2,0),0,6);
my @dev = ( 'MQTT2_WLED_G1',
'MQTT2_WLED_Haustuer_Pen',
'MQTT2_WLED_FR',
'MQTT2_WLED_TV',
'MQTT2_zigbee_rgbw_bulb_flur_privat',
'MQTT2_zigbee_bodenlichterkette',
'MQTT2_Tasmota_Bulb1');
my $d = qq($dev[0]|$dev[1]|$dev[3]|$dev[4]|$dev[5]|$dev[6]);
my $do = qq($dev[0]|$dev[1]|$dev[3]);

return fhem("
set $do effectname Solid;
set $d:FILTER=state!=on on-till-overnight $x;
set $d rgb $pc;
setreading $self ftui_hide 1;
setreading $tl ftui_hide 0");
}

sub notdeko { #not_Deko
my $self = shift;
my $stat = ReadingsVal($self,'status','off');
my $pc = substr(Color::pahColor(0,16,30,ReadingsVal('HF_Aussensensor_Vorderhaus','temperature','0'),2,0),0,6);
my @dev = ( 'MQTT2_WLED_G1',
'MQTT2_WLED_Haustuer_Pen',
'MQTT2_WLED_FR',
'MQTT2_WLED_TV',
'MQTT2_zigbee_rgbw_bulb_flur_privat',
'MQTT2_zigbee_bodenlichterkette',
'MQTT2_Tasmota_Bulb1',
'MQTT2_zigbee_Lager_Decke1',
'MQTT2_zigbee_Lager_Decke_1');

return if $stat eq 'off';
fhem("set $dev[0]|$dev[1]|$dev[2]|$dev[3]|$dev[4]|$dev[5]|$dev[6]|$dev[8]:FILTER=state=on rgb $pc");
return fhem("set $dev[7]:FILTER=state=on rgb $pc") if localtime->hour >= 21;
}

1;

frober

Schau dir mal die LandroidUtils.pm unter FHEM an, vielleicht hilft dir das weiter.
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

betateilchen

#2
ZitatKann man es (praktisch nur das aus der Funktion notdeko) nicht irgendwie nur oben in der Programmdatei angeben ?

Wie wäre es denn, wenn Du mal strukturiert anfangen würdest, einen perl-Kurs (online oder als Buch) durchzuarbeiten, um wenigstens die simpelsten Basics zu kennen?


package main;

use strict;
use warnings;

my $variable1 = "qwertz";

sub myUtils_Initialize($$)
{ }

sub test {
  Debug $variable1;
}

1;

#

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

... einen perl-Kurs (online oder als Buch) durchzuarbeiten, ...
Ein Buch hab ich schon Jahre im Regal stehen, vermutl. nur wegen dir (weiß nicht mehr), aber bisher nur mal kurz reingeschnuppert.

Danke für das Beispiel, das hätt ich nicht erwartet das es so einfach funzt und erst gar nicht ausprobiert.

Bei mir ist was dazwischen gekommen und ich mach mich erst später ran (nach Sonnenuntergang), oder morgen.

TomLee

Zitat... und erst gar nicht ausprobiert.

Jetzt ist das schon leicht peinlich  ::)



Sehr cool, danke nochmal.

TomLee

Es scheint nach etwas testen jetzt so zu klappen heute Abend:

use warnings;

my @dev = ( 'MQTT2_WLED_G1',
'MQTT2_WLED_Haustuer_Pen',
'MQTT2_WLED_FR',
'MQTT2_WLED_TV',
'MQTT2_zigbee_rgbw_bulb_flur_privat',
'MQTT2_zigbee_bodenlichterkette',
'MQTT2_Tasmota_Bulb1',
'MQTT2_zigbee_Lager_Decke1',
'MQTT2_zigbee_Lager_Decke_1');
my $do = qq($dev[0]|$dev[1]|$dev[3]);

sub deko_Utils_Initialize {
  my $hash = shift // return;
  return;
}


sub dekosunrise { #at_Deko_sunrise
my $self = shift;
my $tl = shift;
my $x = sunrise();
my $d = qq($dev[0]|$dev[1]|$dev[3]|$dev[4]|$dev[5]);
my $pc = substr(Color::pahColor(0,16,30,ReadingsNum('HF_Aussensensor_Vorderhaus','temperature',0),2,0),0,6);
return fhem("
set not_BM_Garage status on;
set $do effectname Solid;
set $d:FILTER=state!=on on-till $x;
set $d rgb $pc;
setreading $tl ftui_hide 1;
setreading $self ftui_hide 0") if localtime->mon < 5 || localtime->mon > 7;
}

sub dekosunset { #at_Deko_sunset
my $self = shift;
my $tl = shift;
my $month = localtime->mon;
my $x = rand(60);
$x = sprintf("%02d:%02d",$x/60,$x%60);
my $d = qq($dev[0]|$dev[1]|$dev[3]|$dev[4]|$dev[5]|$dev[6]);
my $pc = substr(Color::pahColor(0,16,30,ReadingsNum('HF_Aussensensor_Vorderhaus','temperature',0),2,0),0,6);

return fhem("
set $do effectname Solid;
set $d:FILTER=state!=on on-till-overnight $x;
set $d rgb $pc;
setreading $tl ftui_hide 0;
setreading $self ftui_hide 1;");
}

sub notdeko { #not_Deko
my $self = shift;
my $stat = ReadingsVal($self,'status','off');
my $pc = substr(Color::pahColor(0,16,30,ReadingsNum('HF_Aussensensor_Vorderhaus','temperature',0),2,0),0,6);

return if $stat eq 'off';
fhem("set $dev[0]|$dev[1]|$dev[2]|$dev[3]|$dev[4]|$dev[5]|$dev[6]|$dev[8]:FILTER=state=on rgb $pc");
return fhem("set $dev[7]:FILTER=state=on rgb $pc") if localtime->hour >= 21;
}

1;

"Oben" einen Wert (die Zeile mit pahColor) auslesen geht aber net. Kann man das mit $pc noch anders lösen, das ich die Zeile nur einmal angebe und in jeder Sub nutzen kann ?

frober

Nach meinem Verständnis wird die Datei einmalig beim Fhemstart eingelesen, die oberen Variablen angelegt und die Subs bekannt gemacht.

Die Temp möchtest du aber jedesmal aktuell haben, somit sehe ich nur die Möglichkeit, diese aus Fhem mit zu übergegben. Das macht aber mMn keinen Unterschied zu deiner Version.
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

TomLee

Danke, jetzt ::) versteh ich auch die Werte die ich mir mit Debug hab ausgeben  lassen.

TomLee

Ich hab mir jetzt überlegt die Rückgabe von pahcolor in einem userreadings von dem Temperatursensor zu hinterlegen und in den Subs nur noch mit ReadingsVal den Wert auszulesen.