59_WUup Code Review

Begonnen von RichardCZ, 26 März 2020, 12:50:49

Vorheriges Thema - Nächstes Thema

CoolTux

Zitat von: mahowi am 27 März 2020, 21:02:20
Wie schon gesagt, ich hatte hier ein bereits vorhandenes Modul genommen und für meine Zwecke umgebaut. Zumindest in https://wiki.fhem.de/wiki/DevelopmentModuleAPI finde ich leider nichts zu CommandAttr. Wo finde ich denn eine Erklärung dazu?

Das ist eine ewig offene Baustelle und die alten Hasen würden Dir sagen schaue in den Code von fhem.pl
Im Grunde gibt es mittlerweile für alles eine Funktion in der fhem.pl. Also das Setzen von Attributen, Readings. Auslesen von Attributen und Readings und so weiter.
Es sollte vermieden werden Hash selbst von Hand zu befüllen wo FHEM interne Dinge gesetzt werden. Readings, Timestamp, Attribute und so weiter. Beispiel $attr
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

mahowi

Schade, daß die Doku leider etwas vernachlässigt wird. Dann werde ich mir wohl mal den Code zu Gemüte führen müssen.
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

CoolTux

Das mit der Doku aka Developer Guide ist ein bekanntes Problem in fast allen Projekten. Markus hat das komplette Developer Guide fast alleine aufgesetzt. Das ist schon Wahnsinn. Aber so war es bis jetzt halt. Funktionen hielten Einzug in fhem.pl und wurden dort und vielleicht im Forum kurz dokumentiert. Das war es. Erst in letzter Zeit, so zwei drei Jahre, kommen Dokumentationen in die Developer Guides von neuen Funktionen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

KernSani

Zitat von: mahowi am 27 März 2020, 21:17:26
Schade, daß die Doku leider etwas vernachlässigt wird. Dann werde ich mir wohl mal den Code zu Gemüte führen müssen.
Du kannst auch z.B. mal in 44_ROLLO schauen, da nutze ich CommandAttr um im define default-Werte zu setzen.


Gesendet von iPhone mit Tapatalk
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

RichardCZ

11:39 - und ich überlege stark ob ich zum Vodka greifen soll. Ihr macht mich noch zum Alkoholiker.

96           $attr{$name}{room}                //= "Weather";
97           $attr{$name}{unit_windspeed}      //= "km/h";
98           $attr{$name}{unit_solarradiation} //= "lux";
99           $attr{$name}{round}               //= 4;
   96       #$attr{$name}{room}                //= "Weather";
   97       CommandAttr( undef, "$name room Weather" )
   98           if ( AttrVal( $name, "room", "" ) eq q{} );
   99   
   100       #$attr{$name}{unit_windspeed}      //= "km/h";
   101       CommandAttr( undef, "$name unit_windspeed km/h" )
   102           if ( AttrVal( $name, "unit_windspeed", "" ) eq q{} );
   103   
   104       #$attr{$name}{unit_solarradiation} //= "lux";
   105       CommandAttr( undef, "$name unit_solarradiation lux" )
   106           if ( AttrVal( $name, "unit_solarradiation", "" ) eq q{} );
   107   
   108       #$attr{$name}{round}               //= 4;
   109       CommandAttr( undef, "$name round 4" )
   110           if ( AttrVal( $name, "round", "" ) eq q{} );
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

mahowi

Wein und Whiskey hätte ich im Angebot.  ;)

Schöner ist definitv der erste Ansatz. Wie ich aber jetzt auch gelernt habe, soll man die Atrribute nicht direkt manipulieren sondern das FHEM-eigene CommandAttr nutzen:
Zitat von: KernSani am 27 März 2020, 16:23:37
Ich würde gerne nochmal diese Zeilen hier augreifen:


$attr{$name}{unit_windspeed}      //= "km/h";
$attr{$name}{unit_solarradiation} //= "lux";
$attr{$name}{round}               //= 4;

Das sieht schön aus und ist sicherlich Perl-technisch super. Ich gebe allerdinmgs zwei Punkte zu bedenken:
Für einen Perl-Noob (die wir ja zu großen Teilen hier sind) ist das völlig unverständliches Zeug, ein "if" kann dagegen jeder lesen, der ein bisschen programmieren kann. Ich werde das mal an mir persönlich ausprobieren, wenn ich das irgendwo in meinem Code verwende und in 4 Wochen nochmal drauf schaue ;-) Das ist aber garnicht mein eigentlicher Kritikpunkt, was auch bedacht werden sollte:
Wenn schon aufgeräumt wird, dann könnte man auch gleich FHEM-technisch aufräumen (das kann Richard sicher noch nicht leisten) und dazu würde m.E. gehören, dass $attr nicht direkt manipuliert wird, sondern CommandAttr verwendet wird.

Grüße,

Oli
   

Ich würde das auch gerne wieder kürzer schreiben, sehe da aber jetzt keinen Ansatz.
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

Beta-User

#36
Ungetestet:
AttrVal($name,"unit_windspeed",)//CommandAttr(undef,"$name unit_windspeed km/h");
Der Trick ist dabei der, dass bei AttrVal ausdrücklich kein default angegeben wird, sondern gerade darauf "gelauscht" wird, dass ggf. undef zurückkommt...

(Na ja, ist eigentlich nur ein Teil der Lösung, denn wenn man sicherstellen will, dass es den Attributwert gibt, muß man sowas ähnliches z.B. in Initialize() packen , oder dann eben mit Variablen arbeiten, die nur intern gültig sind. Für mich sieht das nach "Mischmasch" aus.)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

RichardCZ

Zitat von: mahowi am 30 März 2020, 11:57:35
Wein und Whiskey hätte ich im Angebot.  ;)

Schöner ist definitv der erste Ansatz. Wie ich aber jetzt auch gelernt habe, soll man die Atrribute nicht direkt manipulieren sondern das FHEM-eigene CommandAttr nutzen:
Ich würde das auch gerne wieder kürzer schreiben, sehe da aber jetzt keinen Ansatz.

Also - da ich nicht weiß wohin zuerst - es fehlt z.B. noch ein Thread zum Thema:

'', 0, undef - ist doch alles dasselbe oder?

möchte ich zu diesem Diff nur folgende Stichpunkte loswerden:

* Verwendung "dafür vorgesehener Methoden" ist natürlich immer gut. Aber diese Methoden sollten auch gut sein.
* Nach Sichtung halte ich CommandAttr und AttrVal für schlecht designed und schlecht programmiert (ersteres ist das größere Übel)
* Hier (diff) wird leichtfertig mit "not true" und "is undef" umgegangen als sei es das Selbe. dasselbe. Das Gleiche. Scheinbar anscheinend.

Richtig richtig wäre es gewesen, wenn $Attr ein Objekt gewesen wäre und man eben nur mittels Methoden darauf zugreift (Getter), oder was ändert (Setter), oder gleich bei der Definition eines Attributs implizit vom Objekt Default-Werte setzen lässt.

Das ist für FHEM auf absehbare Zukunft aber leider noch Sci-Fi.

Von diesem Sci-Fi ist sowohl //= wie auch CommandAttr() if AttrVal weit entfernt. Mit dem Unterschied, dass letzteres ca. 200x langsamer und 23.5x unleserlicher ist als ersteres.
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

Beta-User

#38
Ansichten eines DAM:

Attribute sind in FHEM das Mittel, um Usereingaben statischer Art zu speichern. Defaults machen (als Attribut!) wenig Sinn. Der Modulautor sollte aber intern natürlich einen default festlegen. Aber eben als Variable innerhalb des Moduls, die einmal initialisiert wird bzw. erneuert, wenn der User tatsächlich eine Eingabe tätigt...

An sich macht die Konstruktion unten daher keinen Sinn, es ist schlicht nicht nötig, Defaults irgendwo außerhalb des Moduls fest abzulegen.
Die Schreib- oder Lesegeschwindigkeit dieser beiden Funktionen ist daher auch reichlich sekundär, da man diese eben nicht ständig brauchen sollte.

Edit
Verwendung als Variable:
my $unit_windspeed = AttrVal($name,"unit_windspeed","km/h");
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

herrmannj

Zitat von: mahowi am 27 März 2020, 21:17:26
Schade, daß die Doku leider etwas vernachlässigt wird. Dann werde ich mir wohl mal den Code zu Gemüte führen müssen.
Kannst Du maßgeblich mit beeinflussen. Das ist ein community Projekt!

herrmannj

Zitat von: Beta-User am 30 März 2020, 12:38:17

my $unit_windspeed = AttrVal($name,"unit_windspeed","km/h");
Ja, so ist die das korrekt.

mahowi

Zitat von: herrmannj am 30 März 2020, 12:44:26
Kannst Du maßgeblich mit beeinflussen. Das ist ein community Projekt!
Natürlich. Wo ich kann, arbeite ich auch gerne im Wiki mit. Aber Funktionen, die ich nicht kenne, kann ich nicht dokumentieren.  ;)
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

RichardCZ

Zitat von: Beta-User am 30 März 2020, 12:38:17
Verwendung als Variable:
my $unit_windspeed = AttrVal($name,"unit_windspeed","km/h");

Und das sieht auch schon wesentlich besser aus. Jetzt noch

my $unit_windspeed = AttrVal($name, 'unit_windspeed', 'km/h');

und ich muss noch nicht zur Flasche greifen.
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

mahowi

Okay, ich habe jetzt die Defaults für Attribute aus dem Define rausgeworfen. Jetzt habe ich nur noch
    my $unit_windspeed      = AttrVal( $name, 'unit_windspeed', 'km/h' );
    my $unit_solarradiation = AttrVal( $name, 'unit_solarradiation', 'lux' );
    my $rnd                 = AttrVal( $name, 'round', 4 );

für benötigte Default-Werte drin.

Wo finde ich denn Näheres zur Verwendung von " und '?
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

RichardCZ

#44
Zitat von: mahowi am 30 März 2020, 14:10:20
Okay, ich habe jetzt die Defaults für Attribute aus dem Define rausgeworfen. Jetzt habe ich nur noch
    my $unit_windspeed      = AttrVal( $name, 'unit_windspeed',      'km/h' );
    my $unit_solarradiation = AttrVal( $name, 'unit_solarradiation', 'lux' );
    my $rnd                 = AttrVal( $name, 'round',                4 );

für benötigte Default-Werte drin.

Wo finde ich denn Näheres zur Verwendung von " und '?

https://forum.fhem.de/index.php/topic,109616.0.html
und PBP 51-53
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.