Hauptmenü

FHEM4PEBBLE

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

Vorheriges Thema - Nächstes Thema

scheisserchen65

#30
Zitat von: juergen012 am 18 August 2015, 14:23: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

Wenn ich Dich richtig verstanden habe kommst Du auf die Konfig-Seite?
Hast Du den Port für das Phone genutzt?
Bei mir ist es 8084 und er darf nicht mit einem Passwort versehen sein.
Hast Du die 98_Pebble.pm ersetzt? (die alte vorher am Besten sichern)

Reinhard

juergen012

Hallo, danke für die schnelle Antwort. Die Konfiguration habe ich mehrmals geändert. auch die Ports habe ich alle getestet. Die Pebble_98 habe ich ersetzt..
Leider ohne Erfolg
Gruß
Jürgen
Fhem unter Proxmox

jluitz

Vielleicht liegt es daran, dass Reinhards 98_pebble.pm kein Perl Modul ist sonder nur ein "Link" zu der Datei auf seinem samba server ;)

@Reinhard, bitte lade die richtige 98_pebble.pm hoch.

Danke
  Joachim

juergen012

Habe mir auch schon die 98_Pebble auch schon angeschaut und mich gewundert..
Fhem unter Proxmox

scheisserchen65

Also, hier die FHEM4PEBBLE.app
---snipp---

/* FHEM4PEBBLE
   Source: https://github.com/re4jh/fhem4pebble   
   modified by blubhimself to work with the
   correspondig module 98_pebble.pm and show up Switches, FHT and FHTTK
   modified by scheisserchen65 (german layout, configuration, logo)
*/
//FHEM HOST SETTINGS HERE
var Settings = require('settings');

// Add Event listners for Configuration Screen to set host and port
Pebble.addEventListener('showConfiguration', function(e) {
    // Show config page
  Pebble.openURL('http://scheisserchen65.homedns.org/config.htm');
});

Pebble.addEventListener('webviewclosed', function(e) {
    console.log('Configuration window returned: ' + e.response);
var configuration = JSON.parse(decodeURIComponent(e.response));
    Settings.option('host', configuration.host);
    Settings.option('port', configuration.port);
});
var scheme = 'http';
  //var host   = '192.168.1.243';
var host = Settings.option('host');
  //var port   = '8084';
var port = Settings.option('port');
  //var room   = 'Pebble';
// Import the UI elements
var UI = require('ui');
// Import the AJAX elements
var IT = require('ajax');
var Vector2 = require('vector2');
// Build and 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 verbinden...',
  font:'GOTHIC_28_BOLD',
  color:'white',
  textOverflow:'wrap',
  textAlign:'center',
  backgroundColor:'black'
});
// Add to splashWindow and show
splashWindow.add(text);
splashWindow.show();
//create menu
var menu = new UI.Menu({
  sections: [{title: 'Schalter'},{title: 'Thermostate'},{title: 'Fenster & Türen'}]
});
IT({url: scheme + '://' + host  + ':' + port  + '/fhem?cmd=pebble&XHR=1',
    type: 'json'
    //headers: {'Authorization': 'Basic DEMOAUTHHERE000000=='}
  },
  function(data, status, request) {       
    var aDevices = data.Results;
    var myTypes = [ "SWITCH", "FHT", "CUL_FHTTK"];
    for(var ind=0; ind<=2; ind++){
      build_item(aDevices, ind, myTypes[ind]);
    }   
    //show Menu after its loaded
    splashWindow.hide();
    menu.show();
}
); 
  //Build Devices for Menu section
  function build_item(aDevices, index, type){
    var myMenuPos = menu.items(index).length;
    for(var i = 0; i < aDevices.length; i++) {
      if(type == aDevices.typ) {
        var realAlias = aDevices.alias;
        var myNextState = 'on';
        var myStr = aDevices.state;
        var res = myStr.replace("measured-temp:", "");
        if (aDevices.state=='on') myNextState = 'off';
        if (aDevices.state=='off') myNextState = 'on';
        aDevices.state = res;
        var myRealState = 'Status: ' + aDevices.state;
        if(type == "FHT"){
          myRealState = 'Temperatur: ' + aDevices.state + '°C';
        }
        if(type == "CUL_FHTTK"){
          myRealState = 'Zustand: ' + aDevices.state;
        }
        menu.item(index, myMenuPos, {
          title: realAlias,
          subtitle: myRealState,
          state_next: myNextState,
          state_current: aDevices.state,
          switch_name: aDevices.name,
          switch_url: scheme + '://' + host  + ':' + port  + '/fhem?XHR=1&cmd.' + aDevices.name + '=set%20' + aDevices.name + '%20' + myNextState
        });
        console.log('switch found:' + aDevices.name);
        myMenuPos++;
      }
    }
   
  }
//OnClock Items in the Menu (just needed for switches)
menu.on('select', function(e) {
  IT({
    url: e.item.switch_url,
    type: 'get'
    //headers: {'Authorization': 'Basic DEMOAUTHHERE000000=='}
  });
  menu.item(0,  e.itemIndex, {
      title: e.item.title,
      subtitle: 'Status: ' + 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
  });
});

---snipp---
hier folgt die 98_Pebble.pm von blubhimself
---snipp---

################################################################
# 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" || $defs{$d}{TYPE} eq "FHT" || $defs{$d}{TYPE} eq "CUL_FHTTK") {
        if ( $attr{$d}{room} =~ m/$param/ )  {
       my $t = $defs{$d}{TYPE};
       if($defs{$d}{TYPE} ne "FHT"){
          my $typ = "SWITCH";
       }
      #my $attrs = getAllAttr($d);
           $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});
                $str .= sprintf("\n%*s\"alias\": \"%s\",",$lev+4, " ", $attr{$d}{alias});
                if($defs{$d}{TYPE} eq "FS20" || $defs{$d}{TYPE} eq "FBDECT" || $defs{$d}{TYPE} eq "IT"){
                  $str .= sprintf("\n%*s\"typ\": \"%s\"",$lev+4, " ", "SWITCH");
                }
      else {
                  $str .= sprintf("\n%*s\"typ\": \"%s\"",$lev+4, " ", $defs{$d}{TYPE});
      }
           $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;

---snipp---

Ich hoffe das hilft Euch weiter.

Die Pebble.openURL('http://scheisserchen65.homedns.org/config.htm'); führt nur auf einen Server der mir gehört.
Kann jeder für sich ändern, man benötigt aber einen, ansonsten bekommt man die Konfiguration nicht hin.
Bzw. ich habe keine andere Möglichkeit (für mich) gefunden.

Gruß
Reinhard

scheisserchen65

Oh, Mist, ja, sorry 1000mal   :(
Ich habe tatsächlich den blöden Link hoch geladen, ich Depp  :)

Hier nun aber die DATEI:

Sorry noch einmal  :o

juergen012

Hallo!! Habe jetzt die "richtige" 98_Pebble installiert und .. die Schalter werden erkannt. SUPER. Leider kann ich meine Thermostate (LaCrosse) und die Heizungsventile (MAX) nicht sehen. Vielleicht erbarmt sich noch jemand.. ansonsten DANKE!!
Beste Grüße
Jürgen K.
Fhem unter Proxmox

blueberry63

@Reinhard,

Ich habe Deine "fhem4pebble.pwb" über Cloudpebble installiert und auch die 98_Pebble.pm auf dem FHEM server. Die IP-Adresse habe ich entsprechend angepasst. Ich bekomme allerdings keine Verbindung zum Server, sondern werde auf die Pebble.app hingewiesen. Dazu habe ich noch eine Frage:

Zitat
ist über das Smartphone (Pebble.App) auf die eigene FHEM-Server-IP und den Port anpassbar

Sollte es bei der Pebble.App auf dem Smartphone Einstellmöglichkeiten geben? Da ist bei mir jedenfalls nicht der Fall.

Muß ich beim Kompilieren in Cloudpebble etwas beachten?

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

scheisserchen65

#38
Zitat von: blueberry63 am 20 August 2015, 13:03:10
@Reinhard,

Ich habe Deine "fhem4pebble.pwb" über Cloudpebble installiert und auch die 98_Pebble.pm auf dem FHEM server. Die IP-Adresse habe ich entsprechend angepasst. Ich bekomme allerdings keine Verbindung zum Server, sondern werde auf die Pebble.app hingewiesen. Dazu habe ich noch eine Frage:

Sollte es bei der Pebble.App auf dem Smartphone Einstellmöglichkeiten geben? Da ist bei mir jedenfalls nicht der Fall.

Muß ich beim Kompilieren in Cloudpebble etwas beachten?

Gruß
Blueberry63

Hi Blueberry63,
"Ja", du musst in Cloudpebble unter "Einstellungen" "Konfigurierbar" markieren, sonst geht die Konfiguration mit dem Smartphone nicht.

Gruß
Reinhard

scheisserchen65

#39
Und wieder was Neues:
Ab dieser Version werden auch HMS100TF erkannt und in der Pebble angezeigt.
(wie gehabt die alte 98_Pebble.pm sichern, die Neue auf den FHEM-Server speichern und die FHEM4PEBBLE.pbw auf die Pebble installieren)

@Jürgen: leider habe ich keine MAX und kann die deshalb auch nicht testen. Aber vielleicht in der Zukunft  ;)

Hier als Anlage die beiden Dateien (und nicht die Links)  :o ;D

Gruß
Reinhard

blueberry63

@Reinhard,

ich habe Deine Version zwar noch nicht zum Laufen bekommen (werde mich morgen nochmal mit beschäftigen), aber ist es auch möglich, HM 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

scheisserchen65

Zitat von: blueberry63 am 22 August 2015, 09:47:14
@Reinhard,

ich habe Deine Version zwar noch nicht zum Laufen bekommen (werde mich morgen nochmal mit beschäftigen), aber ist es auch möglich, HM Rollladenaktoren einzubinden?

Gruß
Blueberry63

Bin unterwegs,  melde mich morgen  :)
Reinhard

blueberry63

Hallo Reinhard,

ich habe Deine neueste Version installiert, bekomme die Geräte angezeigt, allerdings ohne Gerätenamen. Außerdem stürzt die Watchapp ab und zu ab.

Könntest Du den Source-Code der App hier posten? Dann könnte ich in Cloudpebble etwas experimentieren.

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

scheisserchen65

Zitat von: blueberry63 am 25 August 2015, 08:56:03
Hallo Reinhard,

ich habe Deine neueste Version installiert, bekomme die Geräte angezeigt, allerdings ohne Gerätenamen. Außerdem stürzt die Watchapp ab und zu ab.

Könntest Du den Source-Code der App hier posten? Dann könnte ich in Cloudpebble etwas experimentieren.

Gruß
Blueberry63

Um die Geräte auf der Pebble sehen zu können musst Du ihnen in FHEM einen Alias Namen geben.

Hier der aktuelle Quellcode

FHEM4PEBBLE.app
-----snipp-----
/* FHEM4PEBBLE
   Source: https://github.com/re4jh/fhem4pebble   
   modified by blubhimself to work with the
   correspondig module 98_pebble.pm and schow up Switches, FHT and FHTTK
   modified by scheisserchen65 (german layout, configuration, logo)
*/
//FHEM HOST SETTINGS HERE
var Settings = require('settings');

// Add Event listners for Configuration Screen to set host and port
Pebble.addEventListener('showConfiguration', function(e) {
    // Show config page
  Pebble.openURL('http://scheisserchen65.homedns.org/config.htm');
});

Pebble.addEventListener('webviewclosed', function(e) {
    console.log('Configuration window returned: ' + e.response);
var configuration = JSON.parse(decodeURIComponent(e.response));
    Settings.option('host', configuration.host);
    Settings.option('port', configuration.port);
});
var scheme = 'http';
  //var host   = '192.168.1.243';
var host = Settings.option('host');
  //var port   = '8084';
var port = Settings.option('port');
  //var room   = 'Pebble';
// Import the UI elements
var UI = require('ui');
// Import the AJAX elements
var IT = require('ajax');
var Vector2 = require('vector2');
// Build and 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 verbinden...',
  font:'GOTHIC_28_BOLD',
  color:'white',
  textOverflow:'wrap',
  textAlign:'center',
  backgroundColor:'black'
});
// Add to splashWindow and show
splashWindow.add(text);
splashWindow.show();
//create menu
var menu = new UI.Menu({
  sections: [{title: 'Schalter'},{title: 'Thermostate'},{title: 'Fenster & Türen'},{title: 'Thermo-/Hygrometer'}]
});
IT({url: scheme + '://' + host  + ':' + port  + '/fhem?cmd=pebble&XHR=1',
    type: 'json'
    //headers: {'Authorization': 'Basic DEMOAUTHHERE000000=='}
  },
  function(data, status, request) {       
    var aDevices = data.Results;
    var myTypes = [ "SWITCH", "FHT", "CUL_FHTTK", "HMS"];
    for(var ind=0; ind<=3; ind++){
      build_item(aDevices, ind, myTypes[ind]);
    }   
    //show Menu after its loaded
    splashWindow.hide();
    menu.show();
}
); 
  //Build Devices for Menu section
  function build_item(aDevices, index, type){
    var myMenuPos = menu.items(index).length;
    for(var i = 0; i < aDevices.length; i++) {
      if(type == aDevices.typ) {
        var realAlias = aDevices.alias;
        var myNextState = 'on';
        var myStr = aDevices.state;
        var res = myStr.replace("measured-temp:", "");
        if (aDevices.state=='on') myNextState = 'off';
        if (aDevices.state=='off') myNextState = 'on';
        aDevices.state = res;
        var myRealState = 'Status: ' + aDevices.state;
        if(type == "FHT"){
          myRealState = 'Temperatur: ' + aDevices.state + '°C';
        }
        if(type == "CUL_FHTTK"){
          myRealState = 'Zustand: ' + aDevices.state;
        }
        if(type == "HMS"){
          myRealState = aDevices.state;
        }
       
        menu.item(index, myMenuPos, {
          title: realAlias,
          subtitle: myRealState,
          state_next: myNextState,
          state_current: aDevices.state,
          switch_name: aDevices.name,
          switch_url: scheme + '://' + host  + ':' + port  + '/fhem?XHR=1&cmd.' + aDevices.name + '=set%20' + aDevices.name + '%20' + myNextState
        });
        console.log('switch found:' + aDevices.name);
        myMenuPos++;
      }
    }
   
  }
//OnClock Items in the Menu (just needed for switches)
menu.on('select', function(e) {
  IT({
    url: e.item.switch_url,
    type: 'get'
    //headers: {'Authorization': 'Basic DEMOAUTHHERE000000=='}
  });
  menu.item(0,  e.itemIndex, {
      title: e.item.title,
      subtitle: 'Status: ' + 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
  });
});
-----snipp-----
98_Pebble.pm
-----snipp-----
################################################################
# 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" || $defs{$d}{TYPE} eq "FHT" || $defs{$d}{TYPE} eq "CUL_FHTTK" || $defs{$d}{TYPE} eq "HMS") {
        if ( $attr{$d}{room} =~ m/$param/ )  {
       my $t = $defs{$d}{TYPE};
      
       if($defs{$d}{TYPE} ne "FHT" || $defs{$d}{TYPE} ne "HMS" ){
          my $typ = "SWITCH";
          
                 }
      #my $attrs = getAllAttr($d);
           $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});
                $str .= sprintf("\n%*s\"alias\": \"%s\",",$lev+4, " ", $attr{$d}{alias});
                if($defs{$d}{TYPE} eq "FS20" || $defs{$d}{TYPE} eq "FBDECT" || $defs{$d}{TYPE} eq "IT"){
                  $str .= sprintf("\n%*s\"typ\": \"%s\"",$lev+4, " ", "SWITCH");
                }
      else {
                  $str .= sprintf("\n%*s\"typ\": \"%s\"",$lev+4, " ", $defs{$d}{TYPE});
      }
           $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;
-----snipp-----
Hoffe ich konnte helfen.
Gruß
Reinhard


_Markus_

Hi,

habe auf der Version aufgesetzt und sie erweitert.
Das Resultat findet ihr hier: http://forum.fhem.de/index.php/topic,41458.0.html.

Vielleicht habt ihr Lust weiter daran zu werkeln.

VG, Markus