FHEM Forum

FHEM => Automatisierung => Thema gestartet von: fhainz am 09 Dezember 2013, 19:56:48

Titel: Skript untoggle Problem
Beitrag von: fhainz am 09 Dezember 2013, 19:56:48
Hallo!

Ich hab mir dieses Script für die 99_Utils.pm geschrieben um den Stromverbrauch jedes Aktors über die Laufzeit zu errechnen. Es funktioniert wenn ich über die Weboberfläche ein on bzw. off sende. Wenn ich nun aber ein toggle über die Weboberfläche bzw. einen FS20 TC6 sende komme ich direkt in den else Zweig.
Im aktor hab ich als comment Untoggle und die devStateIcons funktionieren auch immer schon richtig.

#-------------------------     Stromverbrauch nach Laufzeit ermitteln     ---------------#
#-----     Stromverbrauch -----#

sub stromverbrauch($$)
{
my $device = shift;
my $watt = shift;
my $start = "";
my $ende = 0;
my $laufzeit = 0;
my $verbrauch = 0;
my $heuteEin = 0;
my $heuteBisJetztEin = 0;
my $verbrauchHeute = 0;
my $verbrauchBisJetzt = 0;
my $verbrauch = 0;
my $verbrauchGesamt;

if(Value($device) eq "on"){
  $start = int(time());
  setReading($device, "start", $start);
  setReading($device, "power", $watt);
}
elsif(Value($device) eq "off"){
  $start = ReadingsVal($device,"start","0");
  $ende = int(time());

  $laufzeit = $ende-$start;

  $heuteBisJetztEin = ReadingsVal($device,"heuteEin","0");
  $verbrauchHeute = ReadingsVal($device,"consumptionToday","");
  $verbrauchBisJetzt = ReadingsVal($device,"consumptionTotal","");   
  $heuteEin = int($heuteBisJetztEin+$laufzeit);

  $verbrauch = $laufzeit*$watt/1000/3600;
  $verbrauchHeute = $verbrauchHeute+$verbrauch;
  $verbrauchGesamt = $verbrauchBisJetzt+$verbrauch;
 
  $verbrauchHeute  = sprintf "%.2f", $verbrauchHeute;
  $verbrauchGesamt = sprintf "%.2f", $verbrauchGesamt;
 
  if( $start > 0 ){
    setReading($device, "start", 0); 
    setReading($device, "ende", $ende);
    setReading($device, "zeitEin", $laufzeit);
    setReading($device, "heuteEin", $heuteEin);
    setReading($device, "power", "0");
    setReading($device, "consumptionTotal", $verbrauchGesamt);
    setReading($device, "consumptionToday", $verbrauchHeute);
  }
  else{
  Log 3, "Keine Startzeit";
  }
}
else{
  Log 3, "untoggle Problem";
}
}


#-----     setReading     -----#
sub setReading($$$)
{
my $device = shift;
my $readingsName = shift;
my $readingsWert = shift;

readingsBeginUpdate($main::defs{$device});
  readingsBulkUpdate($main::defs{$device}, $readingsName, $readingsWert);
  readingsBulkUpdate($main::defs{$device}, $readingsName, $readingsWert);
readingsEndUpdate($main::defs{$device}, 1);
}


Kann mir jemand sagen warum das untoggle hier nicht funktioniert?


Grüße
Titel: Antw:Skript untoggle Problem
Beitrag von: fhainz am 12 Dezember 2013, 18:03:16
Ich muss das thema nochmals hoch holen.
Hab das Problem immer noch und ich weiß leider keine Lösung.

Kann mir jemand helfen?

Edit:
Mit diesem Fix funktioniert es mittlerweile:


        #----- Untoggle Fix-----#
if ( Value($device) eq "toggle" ) {
if ( OldValue($device) eq "off" ) {
fhem("set $device on");
}
else {
fhem("set $device off");
}
}
Titel: Antw:Skript untoggle Problem
Beitrag von: Zrrronggg! am 24 Dezember 2013, 17:39:08
Der Fix (also das Prinzip) ist genau dass was ich auch immer zum schalten mit toggle verwende. Ich habe eigentlich nicht verstanden, was die "untoggel" Funktion von FHEM überhaupt macht.
Titel: Antw:Skript untoggle Problem
Beitrag von: UliM am 25 Dezember 2013, 10:43:59
Zitat von: Zrrronggg! am 24 Dezember 2013, 17:39:08
Der Fix (also das Prinzip) ist genau dass was ich auch immer zum schalten mit toggle verwende. Ich habe eigentlich nicht verstanden, was die "untoggel" Funktion von FHEM überhaupt macht.
Hi,
das hast Du ja schon gelegentlich mal angemerkt :)
Wenn ein Sensor nur "toggle" meldet, man aber im webfrontend statt toggle ein "on" oder "off" sehen möchte, setzt untoggle den Status auf on oder off, obgleich vom Sensor nur "toggle" kommt.
Und dazu gibt es die Varianten für direkt oder indirekt gepairte Aktoren.
Was ist denn daran so unsinnig?
Gruß, Uli
Titel: Antw:Skript untoggle Problem
Beitrag von: Zrrronggg! am 25 Dezember 2013, 17:30:57
"Unsinnig" hab ich nicht gesagt und auch nicht gemeint. Ich verstand (und verstehe) nur nicht, was das genau bringt und die Anzahl der Fragen zu untoggle hier im Forum zeigen, dass ich nicht der Einzige bin.

Und offen gestanden verstehe ich es eigentlich noch immer nicht. Zählt FHEM das irgendwie mit? Wird dann da auch konkret ein on / off Befehl draus oder ist das rein auf die Anzeige beschränkt?

Ich habe einfach den Eindruck, dass das kein mir schon mal untergekommenes praktisches Problem löst. Aber - und das meine ich ernsthaft - ich verstehe den Sinn nicht richtig.

Zum Beispiel: ich habe eine Lampe.
und einen Button einer Fernbedienung. Die toggelt.

Was lasse ich mir den nun am Webfrontend anzeigen?

Doch wohl die LAMPE oder? Und die ist on oder off. Sowieso.

Und selbst wenn der untoggle Befehl nun den Status der Fernbedienung untoggelt und auch tatsächlich on und off nutzbar weitergibt, so kommt das doch spätestens dann durcheinander, wenn irgendein anderer Prozess die Lampe schaltet. Und ab da hat man dann den Effekt, das der Vorteil des Toogles, nämlich den Zustand egal wie er ist  (und auch ohne Kenntnis des selben!) zu ändern eben nicht mehr greift.

Wenns hingegen um einen Sensor geht:
ZitatWenn ein Sensor nur "toggle" meldet, man aber im webfrontend statt toggle ein "on" oder "off" sehen möchte
Auch das verstehe ich nicht. Bei einem SENSOR der nur einen Schaltzustand kennt, interessiert doch eigentlich nur WANN der zuletzt ausgelöst wurde. Dann am Webfrontend on/off zu zeigen bringt doch keinen Mehrwert und ist im Zweifel sogar irreführend.

Also kurzum: Ich kapier den Sinn nicht. Wenn du vielleicht ein Scenario hast, wo das praktisch zum Einsatz kommt, dann schnalle ich's bestimmt.

Noch mal zur Sicherheit: ich glaube, dass es da einen Sinn gibt, aber ich kenne ihn nicht, der Befehl/attribut löst kein mir bekanntes Problem und das Problem, dass viele Leute mit FBs haben die toggel senden (nämlich damit einen Aktor mit anderer Adresse on/off zu schalten) löst er NICHT.

Ich sage aber nicht "untoggel ist unsinnig" sondern "ICH verstehs leider NICHT".

Titel: Antw:Skript untoggle Problem
Beitrag von: UliM am 25 Dezember 2013, 17:51:02
Zitat von: Zrrronggg! am 25 Dezember 2013, 17:30:57
Zum Beispiel: ich habe eine Lampe.
und einen Button einer Fernbedienung. Die toggelt.

Was lasse ich mir den nun am Webfrontend anzeigen?

Doch wohl die LAMPE oder? Und die ist on oder off. Sowieso.
Huhu,
genau dieses "sowieso" ist bei mir nicht so. Schalter an der Wand, der togggelt. Wenn ich ihn drücke, erscheint standardmäßig im webfrontend "toggle" mit dem zugehörigen icon - und eben NBICHT on oder off. Genau dafür ist Untoggle da :)
=8-)

PS: Ich bezeichne auch einen Wandschalter als Sensor - der "misst", ob eine Taste gedrückt wurde.
Titel: Antw:Skript untoggle Problem
Beitrag von: Zrrronggg! am 26 Dezember 2013, 04:00:34
Okay verstehe ich immer noch nicht.

Das geht schon so bei mir los, dass ich den Schalter im Webfrontend gar nicht anzeige, sondern nur die Lampe. Welchen Sinn hätte es, den Schalter am Webfrontend anzuzeigen?

Das was du da beschreibst würde nur stimmen, wenn der "Sensor" und die Lampe bei z.b. FS20 die selbe Adresse haben.

Das ist ja eigentlich nicht, was man bei Fhem normalerweise macht, weil man dann den Schalter und den Sensor nicht mehr frei "verdrahten" kann.

Ferner: Wenn man es doch macht, und der Schalter (Sensor) hat als Attr untoggle, und dann schaltet irgendwas ANDERS in Fhem die Lampe auf z.b. off, was macht untoggle denn dann?