Hauptmenü

FHEM4PEBBLE

Begonnen von hess, 02 Mai 2015, 23:50:56

Vorheriges Thema - Nächstes Thema

jluitz

Hallo Blueberry63,

das klappt leider so nicht. Das jsonlist Modul liefert bei der derzeitigen Abbrage (cmd=jsonlist+CUL_HM) nur "name" und "state" zurück. Damit kommt die Pebble ganz gut zurecht - auch bei einer umfangreichen Liste an Devices.
Die ursprüngliche fhem4pebble fragt die gesamte Liste ab - aber wie weiter oben vermutet wurde - hängt sich dann das ganze auf. Ich nehme an, dass die Pebble mit einem so grossen Hash nicht mehr zurechtkommt.

Damit das für dieses Scenario funktionieren kann müssen wir wohl ausgehend von der jsonlist ein modul stricken damit wir die notwendigen Infos zurückbekommen. Das ist auch gar nicht schwer und muss sowieso gemacht werden, da ja in der Doku steht, dass:
Note: the old command jsonlist (without the 2 as suffix) is deprecated and will be removed in the future
und die jsonlist2 liefert für <typespec> ja nichts zurück.

Dann könnten auch die ganzen Filter-Wünsche dort hineingepackt werden. Das wäre vielleicht in Hinblick auf eine universelle Pebble app, die nicht nur für CUL_HM und IT funktioniert, auch ganz vernünftig.

Ich muss leider jetzt beruflich verreisen - vielleicht komme ich nach meiner Rückkehr dazu.

lg
  Joachim

blueberry63

Hallo Joachim,

ich will keinen Druck machen. Das ja schon prima so.

Danke
Blueberry63
FHEM auf BBB mit Wheezy: 1x CUL_HM_HM_SCI_3_FM, 1x INSTAR CAM3010, 1x HM-LC-SW1-PL2, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-MDIR-O, Viessmann Heizung, Gaszähler via GPIO, Klingel via HM-LC-Bl1PBU-FM an FBox, Mailcheck, AVR, XBMC, NanoCUL 433+668 an Raspi per Ethernet, Funksteckdosen (Pollin, IT), Automower

Thargor

Hallo zusammen,

wollte nur mal kundtun, dass ich nun auch FHEM4Pebble auf der Uhr habe. Testen kann ich es aber erst heute abend. Die Idee ist auf jeden Fall klasse!

Gruß Lars

jluitz

Hallo Interessierte!

blueberry's Wunsch nach Devices aus nur einem bestimmten Raum habe ich folgendermassen realisiert:

Das nachfolgende Modul 98_Pebble.pm (das ist quasi eine für mich angepasste jsonlist.pm) liefert alle Devices eines bestimmten Raumes, die als state entweder "on" oder "off" haben. Das funktioniert dann mit der ebenfalls folgenden app.js (zumindest für mich) ganz brauchbar. Vielleicht kann sonst noch jemand damit etwas anfangen.

lg
  Joachim

mein 98_Pebble.pm Modul

################################################################
# examples:
# pebble        - returns name and state of all switches
# jsonlist room- returns name and state of all switches in room 'room'
################################################################

package main;
use strict;
use warnings;
use POSIX;

sub CommandPebble($$);
sub JsonEscape($);
sub PrintHashJson($$);


#####################################
sub
Pebble_Initialize($$)
{
  my %lhash = ( Fn=>"CommandPebble",
                Hlp=>"[<devspec>|<devtype>|rooms],list definitions and status info or rooms as JSON" );
  $cmds{pebble} = \%lhash;
}


#####################################
sub
JsonEscape($)
{
  my $a = shift;
  return "null" if(!$a);
  my %esc = (
    "\n" => '\n',
    "\r" => '\r',
    "\t" => '\t',
    "\f" => '\f',
    "\b" => '\b',
    "\"" => '\"',
    "\\" => '\\\\',
    "\'" => '\\\'',
  );
  $a =~ s/([\x22\x5c\n\r\t\f\b])/$esc{$1}/eg;
  return $a;
}

#####################################
sub
PrintHashJson($$)
{
  my ($h, $lev) = @_;
  return if($h->{PrintHashJson});

  my $hc = keys %{$h};
  my @str;
  foreach my $c (sort keys %{$h}) {

    my $str = "";
    if(ref($h->{$c})) {
      if(ref($h->{$c}) eq "HASH" && $c ne "PortObj") {
        if($c eq "IODev" || $c eq "HASH") {
          $str .= sprintf("%*s\"%s\": \"%s\"", $lev," ",$c, JsonEscape($h->{$c}{NAME}));
        } else {
          $str .= sprintf("%*s\"%s\": {\n", $lev, " ", $c);
          if(keys(%{$h->{$c}}) != 0) {
            $h->{PrintHashJson} = 1;
            $str .= PrintHashJson($h->{$c}, $lev+2);
            delete($h->{PrintHashJson});
          } else {
            $str .= sprintf("%*s\"null\": \"null\"\n", $lev+4, " ");
          }
          $str .= sprintf("%*s}", $lev, " ");
        }
      } elsif(ref($h->{$c}) eq "ARRAY") {
        $str .= sprintf("%*s\"%s\": \"%s\"", $lev," ",$c, "ARRAY");
      } elsif($c eq "PortObj") {
        $str .= sprintf("%*s\"%s\": \"%s\"", $lev," ",$c, "PortObj");
      }
    } else {
      $str .= sprintf("%*s\"%s\": \"%s\"", $lev," ",$c, JsonEscape($h->{$c}));
    }
    push @str, $str if($str);
  }

  return join(",\n", @str) . "\n";
}

#####################################
sub
CommandPebble($$)
{
  my ($cl, $param) = @_;
  my $lt = "";
  my $str = "";

  # Text indentation
  my $lev = 2;

  # Search for given device-type
  my %rooms;
  foreach my $d (keys %attr) {
    my $r = $attr{$d}{room};
    map { $rooms{$_} = 1 } split(",", $r) if($r && $r ne "hidden");
  }
  my @rooms = sort keys %rooms;

#  my @devs = grep { $param eq $attr{$_}{room} } keys %defs;

  if(@rooms) {
    my $lt = "";
    my $ld = "";
    # Result counter
    my $c = 0;

    # Open JSON object
    $str .= "{\n";
    $str .= sprintf("%*s\"%s\": \"%s\",\n", $lev, " ", "ResultSet", "room#$param");
    # Open JSON array
    $str .= sprintf("%*s\"%s\": [", $lev, " ", "Results");

    # Sort first by type then by name
   for my $d (sort { my $x = $modules{$defs{$a}{TYPE}}{ORDER} cmp
                               $modules{$defs{$b}{TYPE}}{ORDER};
                         $x = ($a cmp $b) if($x == 0); $x; } keys %defs) {
      if( $defs{$d}{STATE} eq "on" || $defs{$d}{STATE} eq "off" ) {
        if ( $attr{$d}{room} =~ m/$param/ )  {
        my $t = $defs{$d}{TYPE};
        $str .= sprintf("\n%*s},",$lev+2, " ") if($d ne $ld && $lt ne "");
        $str .= sprintf("\n%*s{",$lev+2, " ");
        $str .= sprintf("\n%*s\"name\": \"%s\",",$lev+4, " ", $d);
        $str .= sprintf("\n%*s\"state\": \"%s\"",$lev+4, " ", $defs{$d}{STATE});
        $lt = $t;
        $ld = $d;
        $c++;
      }
     }
    }

    $str .= sprintf("\n%*s}\n",$lev+2, " ");
    # Close JSON array
    $str .= sprintf("%*s],\n", $lev, " ");
    # Result summary
    $str .= sprintf("%*s\"%s\": %s\n", $lev, " ", "totalResultsReturned", $c);
    # Close JSON object
    $str .= "}";
  }
  return $str;
}
1;


meine neue app.js
/* FHEM4PEBBLE
   Source: https://github.com/re4jh/fhem4pebble
   
   modified by jluitz to work with the
   correspondig module 98_pebble.pm
*/

//FHEM HOST SETTINGS HERE
var scheme = 'http';
var host   = '192.168.0.21';
var port   = '8083';
var room   = 'Pebble'

// Import the UI elements
var UI = require('ui');

// Import the AJAX elements
var IT = require('ajax');
var Vector2 = require('vector2');

//Splashscreen
// Show splash screen while waiting for data
var splashWindow = new UI.Window();

// Text element to inform user
var text = new UI.Text({
  position: new Vector2(0, 0),
  size: new Vector2(144, 168),
  text:'FHEM connecting...',
  font:'GOTHIC_28_BOLD',
  color:'black',
  textOverflow:'wrap',
  textAlign:'center',
  backgroundColor:'white'
});

// Add to splashWindow and show
splashWindow.add(text);
splashWindow.show();

//create menu
var menu = new UI.Menu({
  sections: [{
    title: 'Switches'
  }]
});


IT(
  {
    url: scheme + '://' + host  + ':' + port  + '/fhem?cmd=pebble+' + room + '&XHR=1',
    type: 'json'
    //headers: {'Authorization': 'Basic DEMOAUTHHERE000000=='}
  },
  function(data, status, request) {
    splashWindow.hide();
    menu.show();
    //console.log('json: ' + JSON.stringify(data));
    var aDevices = data.Results;
    var myMenuPos = menu.items(0).length;
    for(var i = 0; i < aDevices.length; i++) {
          var myAlias = aDevices[i].name;
          var myShorterAlias = myAlias;
          var myNextState = 'on';
          if (aDevices[i].state=='on') myNextState = 'off';
          menu.item(0, myMenuPos, {
            title: myShorterAlias,
            subtitle: 'State:' +  aDevices[i].state,
            state_next: myNextState,
            state_current: aDevices[i].state,
            switch_name:  aDevices[i].name,
            switch_url: scheme + '://' + host  + ':' + port  + '/fhem?XHR=1&cmd.' + aDevices[i].name + '=set%20' + aDevices[i].name + '%20' + myNextState
          });
          console.log('switch found:' + aDevices[i].name);
          myMenuPos++;
        }
    var count=menu.items(0);
    console.log('Menu.length=' + count.length);
   
},
 
  function(error, status, request) {
    console.log('The ajax request failed: ' + error);
  }
);

menu.on('select', function(e) {
  IT({
    url: e.item.switch_url,
    type: 'get'
    //headers: {'Authorization': 'Basic DEMOAUTHHERE000000=='}
  });
  menu.item( e.sectionIndex,  e.itemIndex, {
      title: e.item.title,
      subtitle: 'State: ' + e.item.state_next,
      state_current: e.item.state_next,
      state_next: e.item.state_current,
      switch_url: scheme + '://' + host  + ':' + port  + '/fhem?XHR=1&cmd.' + e.item.switch_name + '=set%20' + e.item.switch_name + '%20' + e.item.state_current
  });
});

blueberry63

@Joachim,

Das ist ja genial!!!

Ich habe es ausprobiert und für mich ist es nun völlig ausreichend.

VIELEN DANK!

Gruß
Blueberry
FHEM auf BBB mit Wheezy: 1x CUL_HM_HM_SCI_3_FM, 1x INSTAR CAM3010, 1x HM-LC-SW1-PL2, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-MDIR-O, Viessmann Heizung, Gaszähler via GPIO, Klingel via HM-LC-Bl1PBU-FM an FBox, Mailcheck, AVR, XBMC, NanoCUL 433+668 an Raspi per Ethernet, Funksteckdosen (Pollin, IT), Automower

Thargor


Ich habe es ausprobiert, komme aber leider nicht über ein "FHEM connecting..." hinaus. IP-Adresse und Port habe ich angepasst. Hat mir jemand noch eine Idee woran es hapern könnte oder wie ich weiter nachforschen kann woran es liegt?

Vielen Dank!
Gruß Lars

marcus42

Hast Du den Raum in FHEM angelegt?

var room   = 'Pebble'

Thargor

#22
Ja ...
Auch der Aufruf "http://IPADRESSE:8083/fhem?cmd=pebble+Pebble&XHR=1" klappt aus dem Browser ...

Was könnte denn ein Connect verhindern?

jluitz

Hallo Thargor,

ich hatte das auch mal. Mein "Lösung" war Windows-artig: Pebble rebooten, fhem4pebble neu installlieren und dann ging's. Vielleicht hilft das auch bei Dir.

lg
  Joachim

Thargor


Hallo Joachim,

Zitat von: jluitz am 01 August 2015, 20:21:45
ich hatte das auch mal. Mein "Lösung" war Windows-artig: Pebble rebooten, fhem4pebble neu installlieren und dann ging's. Vielleicht hilft das auch bei Dir.

Vielen vielen Dank!
Das war auch mein Problem. Vielleicht lag es auch daran, dass zwar die Android App schon auf V3.2 war, aber die Pebble Time noch nicht. Wie auch immer, es geht jetzt auch bei mir und das ist absolut genial!

scheisserchen65

#25
Hallo Joachim.
Dein Script funktioniert super! Danke!!!  :D
Ich werde mal schauen ob ich es noch verbessern kann (wenn das überhaupt möglich ist  ;) )
Zum Ersten habe ich mit Cloudpebble noch ein Logo hinzu gefügt dass dann in der Pebble angezeigt wird.
Aber zuerst muss ich mich mal mit Pebble.js beschäftigen.

Gruß
Reinhard

blueberry63

Hallo,

meine Programmierkenntnisse sind eher dürftig. Daher noch eine Bitte: ist es möglich auch Rollladenaktoren einzubinden?

Gruß
Blueberry63
FHEM auf BBB mit Wheezy: 1x CUL_HM_HM_SCI_3_FM, 1x INSTAR CAM3010, 1x HM-LC-SW1-PL2, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-MDIR-O, Viessmann Heizung, Gaszähler via GPIO, Klingel via HM-LC-Bl1PBU-FM an FBox, Mailcheck, AVR, XBMC, NanoCUL 433+668 an Raspi per Ethernet, Funksteckdosen (Pollin, IT), Automower

juergen012

Hallo, soeben habe ich die Pebble-App installiert. Klappt einwandfrei. Kann jetzt meine Lampen etc. über die Pebble schalten. SUPER!!!
Beste Grüße
Jürgen K.
Fhem unter Proxmox

scheisserchen65

#28
Hallo Joachim, hallo Jonas, hallo @all  ;)
Ein Kollege (blubhimself) und ich haben die FHEM4PEBBLE ein wenig erweitert.
Folgende Dinge sind bisher machbar:
- schaltet Brennenstuhl RCS 1000N/1044N
- schaltet FS20ST
- zeigt Temperatur vom FHT80b
- zeigt Status vom FHT80TF
- ist über das Smartphone (Pebble.App) auf die eigene FHEM-Server-IP und den Port anpassbar
- die Schalter/Thermostate/Kontakte werden in Gruppen aufgelistet

Auf der Pebble werden die Alias-Namen (aus FHEM) der FS20... genutzt.

Für alle die keine Lust haben in CloudPebble den Quellcode selber zu kompilieren habe ich hier die FHEM4PEBBLE.pbw und die angepasste 98_Pebble.pm angehängt.
Aussserdem habe ich noch einen 'Screenshot' der Pebble angehängt.

Gruß
Reinhard

edit: die 98_Pebble.pm hier ist nicht korrekt, erst die auf der folgenden Seite!

juergen012

#29
Hallo, zunächst mal vielen Dank für die App. Leider bekomme ich die *.pbw Datei nicht auf  meine Pebble installiert. Habe diverse Versuche unternommen. Ohne Erfolg. Kann mir Jemand einen Tip geben, wie es klappt??
Beste Grüße
Jürgen K.

Edit; habe die *pbw per e-mail Anhang verschickt. Da ließ sie sich installieren. Leider komme ich über ein FHEM verbinden... nicht hinaus. Ip adresse und Port überprüft/geändert. Ohne Erfolg
Fhem unter Proxmox