Prozentzeichen bei if-Abfrage ignorieren?

Begonnen von Shoddy, 18 Juni 2014, 11:21:33

Vorheriges Thema - Nächstes Thema

Elektrolurch

configDB und Windows befreite Zone!

Shoddy

FHEM auf Raspi 3
FS20, FHT, HMS

betateilchen

define Actuator_WZ_on notify Wohnzimmerheizung {my $v = ReadingsVal ("Wohnzimmerheizung","actuator","0")+0;; fhem ("set Actuator_WZ on") if $v > 10}
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Puschel74

#18
Hallo,

der Wiki-Eintrag ist nicht von mir.
Aber über diesen Fehler bin ich vor 2 Jahren auch schon gestolpert  ;D
Ich sollt mal meinen Wiki-Account ausgraben und den Beitrag bearbeiten

Nur als Tipp: Du solltest die fhem.cfg sowieso nicht direkt bearbeiten sondern alles über FHEMWEB machen.
Das klappt wunderbar.

Nicht schön aber selten  8)
n_Wasserpumpe {
  my $brauche_hitze=0;
  my $brauche_dringend_hitze=0;
  my $ventile_im_leerlauf=0;
  my $vent_ein=(Value("Heizung_pruef_ein"));
  my $vent_aus=(Value("Heizung_pruef_aus"));
  my @@fhts=devspec2array("TYPE=FHT");
  foreach(@@fhts) {
    my $ventil=ReadingsVal($_, "actuator", "101%");
    $ventil=(substr($ventil, 0, (length($ventil)-1)));
    if ($ventil >= 55) {
      $brauche_dringend_hitze=1
    }
    if (($ventil >= $vent_ein) && ($brauche_dringend_hitze == 0)) {
      $brauche_hitze=1
    }
    if ($ventil < $vent_aus) {
      $ventile_im_leerlauf++
    }
  }
  if (($brauche_dringend_hitze != 0) || (($brauche_hitze != 0) && (Value("Freigabe") eq "on"))) {
    if (Value("Wasserpumpe") eq "Aus") {
      fhem("set Wasserpumpe on");
  fhem("set Heizung_Bewaesserung_Led led green");
      fhem("attr Wasserpumpe room 10_Keller,01_Anzeige,00_Bedienung") if(Value("Freigabe") ne "on");
    }
  }
  else {
    if ($ventile_im_leerlauf == @@fhts) {
   if (Value("Wasserpumpe") eq "Ein") {
        fhem("set Wasserpumpe off");
    fhem("set Heizung_Bewaesserung_Led led red");
        fhem("attr Wasserpumpe room 10_Keller") if(Value("Freigabe") ne "on");
      }
}
    else {
      Log(3,"Heizbedarf: " . $ventile_im_leerlauf . " von " . @@fhts . " Stellantrieben im Leerlauf.");
      if((Value("Heizung_Bewaesserung_Led") ne "orange") && (Value("Heizung_Bewaesserung_Led") ne "green")) {
        fhem("set Heizung_Bewaesserung_Led led orange");
        fhem("define at_Heizung_Bewaesserung_Led_rot at +01:00:00 set Heizung_Bewaesserung_Led led red") if(Value("at_Heizung_Bewaesserung_Led_rot") eq "");
      }
    }
  }
}


Heizung_pruef_ein / Heizung_pruef_aus sind 2 Dummys mit denen ich die Ventilstellung vorgeben kann ab wann eingeschaltet und ausgeschaltet werden soll.
Freigabe ist ein Dummy der aus twilight über Weather gefüttert wird und bei nicht sonnigem Wetter die Heizung freigibt.
$brauche_dringend_hitze habe ich diesen Winter mit eingebaut da es im Wohnzimmer, aufgrund der Fensterfront, meiner Frau ab und zu "gefühlt" zu kalt war um die Heizung bei einer Maximal-Ventilstellung von mehr als 55% (von einem Ventil - idR Wohnzimmer) dennoch einschalten zu lassen.

Weiters lasse ich mir den Status meiner Wasserpumpe in unterschiedlichen Räumen anzeigen.
Wenn der Status "Ein" will ich das auch auf meiner Übersichtsseite sehen.

Heizung_Bewaesserung_Led ist ein HM-OU-LED16 - im Winter sieht meine Frau auf einen Blick ob die Wasserpumpe läuft (das war ihr wichtig) und im Sommer sehe ich dann ob im Garten gegossen wird (das ist eine Spielerei von mir).

Fragen?
Immer her damit.

Grüße

P.S.:Ja ich weiß - solch ein Code ist viel besser in einer sub aufgehoben und sollte aus der fhem.cfg raus.
Wenn ich mal Lust und Laune habe werde ich das dieses Jahr mal in Angriff nehmen  ;)

Edith:
Hier
$ventil=(substr($ventil, 0, (length($ventil)-1)));
wird übrigens das %-Zeichen abgeschnitten
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.

betateilchen

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

Shoddy

Zitat von: betateilchen am 18 Juni 2014, 16:28:34
define Actuator_WZ_on notify Wohnzimmerheizung {my $v = ReadingsVal ("Wohnzimmerheizung","actuator","0")+0;; fhem ("set Actuator_WZ on") if $v > 10}

Gefällt mir, weils so nah an meinem Lösungsversuch ist ;) Verstehe nur nicht, wieso (wenn ReadingsVal bspw. 30% ergibt) "30%+0" das Prozentzeichen abschneidet. Tut es das? Sonst würde ja glaube ich auch wieder Gemecker wegen dem numerischen Vergleichsoperator kommen oder?
Auf jeden Fall Danke für den Tipp! Hab vorhin schonmal das Kürzel TMTOWTDI gelesen und verstehe auch gleich, was gemeint ist ;)

Zitat von: Puschel74 am 18 Juni 2014, 18:03:27

Nicht schön aber selten  8)
n_Wasserpumpe {
  my $brauche_hitze=0;
  my $brauche_dringend_hitze=0;
  my $ventile_im_leerlauf=0;
  my $vent_ein=(Value("Heizung_pruef_ein"));
  my $vent_aus=(Value("Heizung_pruef_aus"));
  my @@fhts=devspec2array("TYPE=FHT");
  foreach(@@fhts) {
    my $ventil=ReadingsVal($_, "actuator", "101%");
    $ventil=(substr($ventil, 0, (length($ventil)-1)));
    if ($ventil >= 55) {
      $brauche_dringend_hitze=1
    }
    if (($ventil >= $vent_ein) && ($brauche_dringend_hitze == 0)) {
      $brauche_hitze=1
    }
    if ($ventil < $vent_aus) {
      $ventile_im_leerlauf++
    }
  }
  if (($brauche_dringend_hitze != 0) || (($brauche_hitze != 0) && (Value("Freigabe") eq "on"))) {
    if (Value("Wasserpumpe") eq "Aus") {
      fhem("set Wasserpumpe on");
  fhem("set Heizung_Bewaesserung_Led led green");
      fhem("attr Wasserpumpe room 10_Keller,01_Anzeige,00_Bedienung") if(Value("Freigabe") ne "on");
    }
  }
  else {
    if ($ventile_im_leerlauf == @@fhts) {
   if (Value("Wasserpumpe") eq "Ein") {
        fhem("set Wasserpumpe off");
    fhem("set Heizung_Bewaesserung_Led led red");
        fhem("attr Wasserpumpe room 10_Keller") if(Value("Freigabe") ne "on");
      }
}
    else {
      Log(3,"Heizbedarf: " . $ventile_im_leerlauf . " von " . @@fhts . " Stellantrieben im Leerlauf.");
      if((Value("Heizung_Bewaesserung_Led") ne "orange") && (Value("Heizung_Bewaesserung_Led") ne "green")) {
        fhem("set Heizung_Bewaesserung_Led led orange");
        fhem("define at_Heizung_Bewaesserung_Led_rot at +01:00:00 set Heizung_Bewaesserung_Led led red") if(Value("at_Heizung_Bewaesserung_Led_rot") eq "");
      }
    }
  }
}



Ich glaube einen Großteil verstehe ich (was lange nicht heißt, dass ich sowas auch nur im entferntesten hinbekommen hätte, darum danke erstmal an HCS).. Was mich aber, trotz Erklärung, verwirrt, sind die Variablen $brauche_hitze und $brauche_dringend_hitze..

Also wenn das Ventil >= 55% ist, bekommt die Variable brauche_dringend_hitze den Wert 1. Wenn das Ventil >= als dein Wert für vent_ein ist, aber nicht so hoch (bzw. unter 55), dass $brauche_dringend_hitze auf 1 gesetzt wird, wird $brauche_hitze auf 1 gesetzt.

Die Wasserpumpe wird aber immer angeschaltet, sobald eine der Variablen 1 hat. Einen Unterschied erkenne ich irgendwie nicht.  :o

Das mit der LED ist eine gute Idee. Vorhin beim Testen ist ein Befehl schonmal nicht angekommen. Und weil FS20 das ja leider nicht vorgesehen hat, merkt man sowas dann auhc nciht sofort. ELV ist demnächst sowieso mal wieder fällig ;)

Vielen Dank auf jeden Fall für die gute Anleitung und dein Skript, hilft auf jeden Fall beim Verstehen.
FHEM auf Raspi 3
FS20, FHT, HMS

betateilchen

#21
Zitat von: Shoddy am 18 Juni 2014, 22:46:34
Verstehe nur nicht, wieso (wenn ReadingsVal bspw. 30% ergibt) "30%+0" das Prozentzeichen abschneidet. Tut es das?

Seh ich aus wie ein Clown, der sowas aus Jux und Dollerei schreibt?

Probiers doch einfach aus: Gib in die Befehlszeile des Frontends ein:

{"18%"+0}

und staune...

Klar gibt das eine Warnung von perl (im Log) aber es ist halt nur eine Wanung und kein Fehler. Funktionieren tut das trotzdem zuverlässig. Und selbst die Warnung könnte man noch programmtechnisch unterdrücken. Aber zum Wegzaubern von Einheiten (egal welche und egal ob mit Leerzeichen dazwischen oder nicht) ist es die einfachste Möglichkeit.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Shoddy

#22
Zitat von: betateilchen am 18 Juni 2014, 23:06:23
Seh ich aus wie ein Clown, der sowas aus Jux und Dollerei schreibt?


Ich habe ehrlich gesagt keine Ahnung, wie Du aussiehst... ;)

Aber Danke für den Hinweis...

*edit: Die Warnmeldung hatte ich ja vorher auch schon mit funktionierendem Skript. Es ging mir vorallem um eine Lösung, bei der ich nicht jedes Mal eine Warnmeldung im logfile bekomme.
FHEM auf Raspi 3
FS20, FHT, HMS

betateilchen

Zitat von: Shoddy am 18 Juni 2014, 23:10:32
Ich habe ehrlich gesagt keine Ahnung, wie Du aussiehst... ;)

Ich sag mal so... Ottfried Fischer habe ich damals in der gemeinsamen Selbsthilfegruppe für Magersüchtige kennengelernt, aber inzwischen haben wir beide die schlimmste Zeit hinter uns 8)

Zitat von: Shoddy am 18 Juni 2014, 23:10:32
Es ging mir vorallem um eine Lösung, bei der ich nicht jedes Mal eine Warnmeldung im logfile bekomme.

Die Warnmeldungen bekommst Du, weil im Quelltext von fhem und den allermeisten Modulen explizit drinsteht, dass sie ausgegeben werden sollen. Works as designed.

Natürlich könntest Du jedesmal die Einheiten regexen, aber der Aufwand lohnt sich nicht, zumal Du ja jedesmal wissen musst, um welche Einheit es überhaupt geht. Addiere 0 und die Einheit ist weg. Du hast danach einen rein numerischen Wert, mit dem Du jede weitere Rechnung und jeden Vergleich anstellen kannst, ohne eine Warnung zu bekommen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Shoddy

;)
Zitat von: betateilchen am 18 Juni 2014, 23:19:59
Ich sag mal so... Ottfried Fischer habe ich damals in der gemeinsamen Selbsthilfegruppe für Magersüchtige kennengelernt, aber inzwischen haben wir beide die schlimmste Zeit hinter uns 8)

Die Warnmeldungen bekommst Du, weil im Quelltext von fhem und den allermeisten Modulen explizit drinsteht, dass sie ausgegeben werden sollen. Works as designed.

Natürlich könntest Du jedesmal die Einheiten regexen, aber der Aufwand lohnt sich nicht, zumal Du ja jedesmal wissen musst, um welche Einheit es überhaupt geht. Addiere 0 und die Einheit ist weg. Du hast danach einen rein numerischen Wert, mit dem Du jede weitere Rechnung und jeden Vergleich anstellen kannst, ohne eine Warnung zu bekommen.
Hach ja, der Otti. Held meiner Jugend ;-)

Vielen Dank für die Erklärung mit der 0. Habe nicht wirklich dran gezweifelt, dass das, was du postest, funktioniert (hast mir im Bereich Einplatinencomputer schon ordentlich auf die Sprünge geholfen), hatte aber keine Ahnung, wieso es denn funktioniert. In Zukunft weiß ich es besser..

Und hiermit schließe ich meine heutige Ahnungslosigkeit und verabschiede mich in die Nachtruhe. Schönen Abend noch!

Gesendet von meinem Galaxy Nexus mit Tapatalk

FHEM auf Raspi 3
FS20, FHT, HMS

Puschel74

Moin,

ZitatDie Wasserpumpe wird aber immer angeschaltet, sobald eine der Variablen 1 hat.
Fast.

if (($brauche_dringend_hitze != 0) || (($brauche_hitze != 0) && (Value("Freigabe") eq "on"))) {
Wenn $brauche_dringend_hitze != 0 ODER ($brauche_hitze != 0 UND (Value("Freigabe") eq "on") DANN wird die Wasserpumpe eingeschaltet.
Also für $brauche_hitze = 1 muss auch Freigabe auf on stehen damit die Wasserpumpe eingeschaltet wird.

Damit versuche ich am morgen die Zeit etwas zu "dehnen" bis die Wasserpumpe dann tatsächlich einschaltet.
Freigabe geht ja nur auf on wenn Weather NICHT sonnig meldet.
Wenn Weather sonnig meldet muss ein Ventil auf >= 55% gehen damit die Wasserpumpe dennoch einschaltet.
Es kann ja sonnig sein aber dennoch -15 °C haben  8)

Das LED16 bringt dir bei FS20 aber nicht viel.
Nur weil die LED an ist muss der Aktor nicht zwingend den Befehl erhalten haben.
Daher habe ich meinen FS20-Aktor auch gegen einen HM-LC-SW1-SM getauscht.

Zitat von: betateilchen am 18 Juni 2014, 22:43:31
ihr macht komische Sachen...
Nicht "ihr" betateilchen.
Ich  ;D
Über die rechte Schulter am linken Ohr vorbei von hinten durch den rechten Nasenflügel - ich weiß.
Aber es funktioniert und der WAF ist in Ordnung.
Und es hat Spaß gemacht

Grüße
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.

Shoddy

Zitat von: Puschel74 am 19 Juni 2014, 05:02:58
Moin,
Fast.

if (($brauche_dringend_hitze != 0) || (($brauche_hitze != 0) && (Value("Freigabe") eq "on"))) {
Wenn $brauche_dringend_hitze != 0 ODER ($brauche_hitze != 0 UND (Value("Freigabe") eq "on") DANN wird die Wasserpumpe eingeschaltet.
Also für $brauche_hitze = 1 muss auch Freigabe auf on stehen damit die Wasserpumpe eingeschaltet wird.

Damit versuche ich am morgen die Zeit etwas zu "dehnen" bis die Wasserpumpe dann tatsächlich einschaltet.
Freigabe geht ja nur auf on wenn Weather NICHT sonnig meldet.
Wenn Weather sonnig meldet muss ein Ventil auf >= 55% gehen damit die Wasserpumpe dennoch einschaltet.
Es kann ja sonnig sein aber dennoch -15 °C haben  8)



Ah jetzt ja! So wird auch ein Schuh draus! ;)

Und bei der LED hab ich auch nicht nachgedacht. Scheinbar. Muss ich also doch erstmal bei der "leg-dein-ohr-an-den-heizkörper-und-lausche"-methode bleiben. Klappt auch. Vielleicht gibt es ja einen Schallsensor für sowas, der mir dann eine LED anschalten kann? ;)
FHEM auf Raspi 3
FS20, FHT, HMS

Puschel74

Hallo,

ZitatVielleicht gibt es ja einen Schallsensor für sowas, der mir dann eine LED anschalten kann?
Gibt es, ja.
Durchfluss über Ultraschall - aber die hab ich nur in der Firma im Einsatz.
Das Ausgangssignal würde sich aber auch in FHEM verarbeiten lassen nur kostet das ganze System mehr als es für einen Heimanwender verwertbaren Nutzen hätte  ;D

Was aber noch geht wäre ein HM-WDS30-OT2-SM - wo wir aber wieder bei Homematic wären.
Damit logge ich mir die Temperaturverläufe im Vor- und Rücklauf unserer Heizkreise.

"Früher" (als die Wasserpumpe noch per FS20 geschalten wurde) habe ich nach einem "Wasserpumpe on" auf einen Temperaturanstieg im Vorlauf geschaut.
Wenn der ausgeblieben ist habe ich nochmal ein "Wasserpumpe on" gesendet.

Seit die Wasserpumpe aber ein Homematic-aktor wurde sind die Daten nur noch ... naja, ich seh damit wenn der Wäschetrockner läuft (die Sensoren sind im Heizraum verbaut).
Wobei ich auch belegen konnte das die Fliesen im Badezimmer tatsächlich warm sein müssen - meine Frau hat das vermutet (gefühlt).
Die Heizung wurde lt. Kaminfeger nur "Aus" gestellt aber das Gasventil habe ich dieses Mal offen gelassen.
Dank der Sensoren habe ich gesehen das im Vorlauf tatsächlich noch 30-grädiges Wasser vorhanden ist.
Gasventil zur Heizung geschlossen - Temperatur im Vorlauf ist rapide gesunken - Frau hat kalte Fliesen im Bad - Gasverbrauch hat nochmal einen Knick nach unten gemacht.
Der Kaminfeger soll mir bei der nächsten Revision nochmal unter die Finger kommen  >:(

Da sieht man erstmal wozu FHEM gut sein kann  ;D

Grüße
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.

Shoddy

Zitat von: Puschel74 am 19 Juni 2014, 20:35:58
Seit die Wasserpumpe aber ein Homematic-aktor wurde sind die Daten nur noch ... naja, ich seh damit wenn der Wäschetrockner läuft (die Sensoren sind im Heizraum verbaut).
Wobei ich auch belegen konnte das die Fliesen im Badezimmer tatsächlich warm sein müssen - meine Frau hat das vermutet (gefühlt).
Die Heizung wurde lt. Kaminfeger nur "Aus" gestellt aber das Gasventil habe ich dieses Mal offen gelassen.
Dank der Sensoren habe ich gesehen das im Vorlauf tatsächlich noch 30-grädiges Wasser vorhanden ist.
Gasventil zur Heizung geschlossen - Temperatur im Vorlauf ist rapide gesunken - Frau hat kalte Fliesen im Bad - Gasverbrauch hat nochmal einen Knick nach unten gemacht.
Der Kaminfeger soll mir bei der nächsten Revision nochmal unter die Finger kommen  >:(

Da sieht man erstmal wozu FHEM gut sein kann  ;D

;D

Dann räche Dich auch im fhem-stil:

Die Revisionsklappe des Kamins überwachst du ab jetzt mit einem Fensterkontakt. Dazu ein notify, das über einen Aktor ein Ventil öffnet, das an einem kleinen Kompressor mit Schiffsnebelhorn angeschlossen ist. Dieses Horn befindet sich natürlich direkt an der Decke im Bereich über der Revisionsklappe. Passend dazu IM Schornstein eine IP-Cam, die ab Auslösen des Fensterkontakts 30 Serienbilder schießt. Und die Bilder dann bitte hier hochladen ;)

Soviel dazu, es ist Wochenende!!  ;D


Grüße!

FHEM auf Raspi 3
FS20, FHT, HMS