Login attempt or request with invalid authentication from

Trusted networks is only working for login since 0.101 (I still use that and have configured it as auth provider as shown in the config I posted). You can’t use it for stuff like cameras anymore. More details here.

Sorry to bring this up again but since upgrading from 0.100.x to 0.101.3 I have been getting IP address 127.0.0.1 banned, thus locking me out of HA when trying to log in via HA Cloud. It seems that using the local IP address from within my network still worked.

So I tried adding the below code for use_x_forwarded_for: true and trusted_proxies: hoping that it would prevent this ban, but then I was unable to get the HA login to load (via HA Cloud) at all, only local IP access worked.

http:
  cors_allowed_origins:
    - http://192.168.0.14:8123
  ip_ban_enabled: true
  login_attempts_threshold: 3
  use_x_forwarded_for: true
  trusted_proxies:
    - 127.0.0.1

Since I’m away at work I was luckily able to talk my girlfriend through logging in and #'ing out the use_x_forwarded_for: true and trusted_proxies: lines.

Any idea why these caused HA to not work for me?

What is cors_allowed_origins doing?

I’m not sure… Its been in my config for a very long time…

I’ve never used that or seem any need to.

So in the past, I tried adding auth_providers but that seemed to cause HA to not load the GUI… not sure why as it is straight from the docs and passes the config check. Would this work to prevent the 127.0.0.1 from getting banned?

homeassistant:
  auth_providers:
    - type: trusted_networks
      trusted_networks:
        - 192.168.0.0/24
        - 127.0.0.1
    - type: homeassistant

Maybe Dave… 192.168.0.0 is most probably a /16 network not a /24… what IP addresses do you want to allow?

How do I determine a /16 vs. a /24 network? Not terminology I’m familiar with to be honest.
EDIT: I just Googled it… pretty sure /24 is correct as my subnet mask is 255.255.255.0

I just want to allow my laptop, tablet, phones etc which are all in the 192.168.0.x range. As for the 127.0.0.1, that was hoping to prevent the banning of what I assume is a Docker container or HA Cloud?

Ok from what you said, /24 is correct. Your config should work fine. 127.0.0.1 should mean it won’t require auth for anything on the HA machine itself.
x.x.x.x = 32 bits so a /16 means the x.x at the start is the ‘network’ a /24 means the x.x.x is the network and the remaining octet(s) are the ‘host’ so if all yours are on 192.168.0.x then /24 is correct. You should also see this as a subnet mask of 255.255.255.0 in the network settings for each device.

So… last night I again tried to include the code as per my post above. HA accepts the code, restarts fine and local access (within my home network using the HA server IP address) is fine, however I can’t access HA via the HA Cloud address. Take out the above code, restart = Cloud access restored. Any ideas? It’s really annoying me because I see that code as being the only way to get HA to stop banning 127.0.0.1 which subsequently blocks HA Cloud access

I don’t pretend to know much about any of this, but I did remember reading something on the Nabu Casa website here:

Caveats

We are currently not forwarding the IP address of the incoming request. Because of this, we are unable to support Home Assistant instances that have configured 127.0.0.1 or ::1 as trusted networks or proxies. It also means that if you use IP bans, the remote connection will be banned as a whole instead of just the address from which the incorrect passwords were entered. We are currently exploring a solution for this issue.

Yeah, I did read that but I guess I didn’t understand correctly that it would block my access. So basically my only option to prevent HA Cloud getting banned is to remove the IP Ban functionality completely… Surely other people would be having this issue as well? I really only started having trouble after upgrading from 0.100.3 to 0.101.3

I am also having this issue with HA version 0.102.3 and the AppDaemon HA Dashboard. I have a HA Dashboard running on a kindle fire tablet and I am constantly getting the Login attempt or request with invalid authentication error message with the fire tablets IP address. My appdaemon.yaml file configured almost exactly like the OP. The HA Dashboard is working and there are no issues with access, but it would be nice if my log was not getting filled up with these error message. I have tried using the Auth trusted networks and trusted users, but neither of those config setting appear to be work anymore. I would like to hear if anyone has found a work-around for this issue or if the issues is being worked on by the development team.

Thanks for the support and guidance.

I could never figure this issue out with HAdashboard and appdaemon … I’ve since then switched to tileboard and wow what a major major upgrade for wall mounted tablets !!! Make the switch … I can send out my config.js file if that helps

YEEEEEES PLEASE :slight_smile:

various urls, pw and userid == xx
sent as 3 post due to size

var DOORENTRY_TILE = {
      position: [0, 2],
      type: TYPES.DOOR_ENTRY,
      id: {},
      icon: 'mdi-doorbell-video',
      title: 'Door entry',
      state: false,
      layout: {
         camera: {
            type: TYPES.CAMERA,
            id: {},
            refresh: 1000,
            bgSize: 'cover',
            filter: function (item, entity) {return "http://192.168.1.36:1050/image/doorbird?user=xx&pw=xx"},
         },
         page: { }, 
         tiles: [ ],
      }
};

var CONFIG = {
   customTheme: CUSTOM_THEMES.COMPACT, // CUSTOM_THEMES.TRANSPARENT, CUSTOM_THEMES.MATERIAL, CUSTOM_THEMES.MOBILE, CUSTOM_THEMES.COMPACT, CUSTOM_THEMES.HOMEKIT, CUSTOM_THEMES.WINPHONE, CUSTOM_THEMES.WIN95
   transition: TRANSITIONS.ANIMATED_GPU, //ANIMATED or SIMPLE (better perfomance)
   entitySize: ENTITY_SIZES.NORMAL, // NORMAL, SMALL, BIG are available
   tileSize: 125,
   tileMargin: 6,
   serverUrl: "http://192.168.1.123:8123",
   password: "xx",
   wsUrl: "ws://192.168.1.123:8123/api/websocket",
   authToken: "xx",
   googleApiKey: "xx", // Required if you are using Google Maps for device tracker
   //mapboxToken: "XXXXXXXXXX", // Required if you are using Mapbox for device tracker
   debug: false, // Prints entities and state change info to the console.
   pingConnection: true, //ping connection to prevent silent disconnections
   doorEntryTimeout: 12,
   ignoreErrors: true,

   // next fields are optional
   events: [
      {
         command: 'open_page',
         action: function(e) {
            window.openPage(CONFIG.pages[e.page]);
         }
      },
      {
         command: 'doorbell',
         action: function(eventData) {
            this.$scope.openDoorEntry(DOORENTRY_TILE, DOORENTRY_TILE.id);
         }
      },
   ],
   timeFormat: 12,
   menuPosition: MENU_POSITIONS.LEFT, // or BOTTOM
   hideScrollbar: false, // horizontal scrollbar
   groupsAlign: GROUP_ALIGNS.HORIZONTALLY, // or VERTICALLY
   onReady: function () {},
/*   header: { // https://github.com/resoai/TileBoard/wiki/Header-configuration
      styles: {
         padding: '10px 13px 0',
         fontSize: '18px'

      },
      left: [],
      right: [
         {
            type: HEADER_ITEMS.DATETIME,
            dateFormat: 'EEEE, LLLL dd', //https://docs.angularjs.org/api/ng/filter/date
         }
      ]
   },
*/
/*
   screensaver: {// optional. https://github.com/resoai/TileBoard/wiki/Screensaver-configuration
      timeout: 300, // after 5 mins of inactive
      slidesTimeout: 10, // 10s for one slide
      styles: { fontSize: '40px' },
      leftBottom: [{ type: SCREENSAVER_ITEMS.DATETIME }], // put datetime to the left-bottom of screensaver
      slides: [
         { bg: 'images/bg1.jpeg' },
         {
            bg: 'images/bg2.png',
            rightTop: [ // put text to the 2nd slide
               {
                  type: SCREENSAVER_ITEMS.CUSTOM_HTML,
                  html: 'Welcome to the <b>TileBoard</b>',
                  styles: { fontSize: '40px' }
               }
            ]
         },
         { bg: 'images/bg3.jpg' }
      ]
   },
*/
   pages: [
      {
         title: 'Main page',
         bg: "images/monteverde.jpg",
         icon: 'mdi-home-assistant', 
         header: DEFAULT_HEADER,
         groups: [
            {
               title: '',
               items: [
                  {
                     position: [0, 0],
                     type: TYPES.ALARM,
                     id: "alarm_control_panel.home_alarm",
                     theme: ITEM_TRANSPARENT,
                     title: 'Home Alarm',
                     subtitle: '&sensor.home_alarm_keypad.state',
                     icons: {
                        disarmed: 'mdi-bell-off',
                        pending: 'mdi-bell',
                        armed_home: 'mdi-bell-plus',
                        armed_away: 'mdi-bell',
                        triggered: 'mdi-bell-ring'
                     },
                     states: {
                        disarmed: 'Disarmed',
                        pending: 'Pending',
                        armed_home: 'Armed home',
                        armed_away: 'Armed away',
                        triggered: 'Triggered'
                     }
                  },
                  { position: [1, 0], type: TYPES.SENSOR_ICON, title: "Pool/Spa", id: 'sensor.poolspa_mode',
                    states: { spa: 'Spa', pool: 'Pool', floor: "Floor", freeze: "Freeze", off: "Off" }, theme: ITEM_TRANSPARENT,
                    icons: { spa: 'mdi-hot-tub', pool: 'mdi-pool', floor: 'mdi-robot', freeze: 'mdi-snowflake', off: 'mdi-swim' },
/*                    customStyles: function (item, entity) { if (entity.state == "off") { return {backgroundColor: 'blue'} }
                                                            else { return {backgroundColor: 'red' } }
                                                          } */
                  },
                  { position: [2, 0], type: TYPES.SENSOR, title: "Temperature", subtitle: "Pool/Spa", id: 'sensor.water_temp', 
                    unit: '°F', state: false, theme: ITEM_TRANSPARENT,
                  },
                  {
                    position: [3, 0],
                    title: 'Net Energy',
                    subtitle: '',
//                  classes: ['-sensor-small-text'],
                    theme: ITEM_TRANSPARENT,
                    type: TYPES.GAUGE,
                    state: false,
                    id: 'sensor.net_demand', 
                    value: function(item, entity) { 
                              if (parseFloat(entity.state) >= 0) { return (((parseFloat(entity.state) + 13) / 26) * 100); } 
                              else { return (((parseFloat(entity.state) + 13) / 26) * 100); }
                           },
                    settings: {
                       size: 100, // Defaults to 50% of either height or width, whichever is smaller
                       type: 'full', // Options are: 'full', 'semi', and 'arch'. Defaults to 'full'
                       min: 0, 
                       max: 100, 
                       cap: 'round', // Options are: 'round', 'butt'. Defaults to 'butt'
                       thick: 6, 
                       label: '@state kW',
                       append: '@attributes.unit_of_measurement', // Defaults to undefined
                       prepend: '', 
                       duration: 1500, 
                       thresholds: { 0: { color: 'green'}, 50: { color: 'yellow' }, 70: { color: 'red' } },  
                       labelOnly: true, 
                       foregroundColor: 'rgba(0, 150, 136, 1)', // Defaults to rgba(0, 150, 136, 1)
                       backgroundColor: 'rgba(0, 0, 0, 0.1)', // Defaults to rgba(0, 0, 0, 0.1)
                       fractionSize: 1, // Number of decimal places to round the number to. Defaults to current locale formatting
                    },
                  },
                  { position: [4, 0], type: TYPES.SENSOR_ICON, title: "Mail & Packages", id: 'sensor.mail_packages_delivered', theme: ITEM_TRANSPARENT,
                    subtitle: 'USPS(' + '&sensor.mail_usps_mail.state' + '),' + 'Transit(' + '&sensor.mail_packages_in_transit.state' + ')',
                    states: { 0: 'No Packages', 1: "One Package", 2: "Two Packages", 3: "Three Packages", 4: "Four Packages" }, 
                    icons: { 0: 'mdi-package-variant-closed', 1: 'mdi-package-variant', 2: "mdi-package-variant", 3: "mdi-package-variant", 4: "mdi-package-variant" },
                  },
                  { position: [6, 2], type: TYPES.IMAGE, id: {}, bg: 'images/xx-guest-network-qrcode.png'
                  },
                  { position: [5, 0], type: TYPES.SENSOR_ICON, state: false, title: null, id: 'switch.gym_scene',
                    states: { on: "On", off: "Off" }, icon: 'mdi-weight-lifter',
                    customStyles: function (item, entity) { if (entity.state == 'on') { 
                                                               return { 'backgroundColor': 'transparent', 'color': '#fff', 'opacity': '0.75' }; 
                                                            }
                                                            else { 
                                                               return { 'opacity': '0' }; 
                                                            } 
                                                          }

                  },
                  {
                    position: [6, 1], type: TYPES.SENSOR_ICON, id: 'binary_sensor.trashtomorrow', title: 'Trash Tomorrow', 
                    state: false, icon: 'mdi-dump-truck', 
                    customStyles: function (item, entity) { if (entity.state == 'on') { 
                                                               return { 'backgroundColor': 'green', 'color': '#fff', 'opacity': '0.5' }; 
                                                            }
                                                            else { 
                                                               return { 'opacity': '0' }; 
                                                            } 
                                                          }
                  },
                  {
                    position: [6, 1], type: TYPES.SENSOR_ICON, id: 'binary_sensor.trashday', title: 'Trash Day', 
                    state: false, icon: 'mdi-dump-truck', 
                    customStyles: function (item, entity) { if (entity.state == 'on') { 
                                                               return { 'backgroundColor': 'red', 'color': '#fff', 'opacity': '0.7' }; 
                                                            }
                                                            else { 
                                                               return { 'opacity': '0' }; 
                                                            } 
                                                          }
                  },
                  { // using nws also check app.js for values
                     position: [0, 3],
                     height: 2,
                     theme: ITEM_TRANSPARENT,
                     type: TYPES.WEATHER,
                     id: 'weather.kcrq_daynight',
                     customStyles: { fontSize: '11px' },
                     title: 'Palomar Airport', 
                     state: '&weather.kcrq_daynight.state',
                     icon: '&weather.kcrq_daynight.state',
                     icons: {
                        'clear-day': 'clear',
                        'clear-night': 'nt-clear',
                        'cloudy': 'cloudy',
                        'rain': 'rain',
                        'rainy': 'rain',
                        'sleet': 'sleet',
                        'snow': 'snow',
                        'wind': 'hazy',
                        'fog': 'fog',
                        'partlycloudy': 'partlycloudy',
                        'partly-cloudy-day': 'partlycloudy',
                        'partly-cloudy-night': 'nt-partlycloudy',
                        'lightning-rainy': 'tstorms',
                        'sunny': 'clear'
                     },
                     fields: { 
                        Summary: '&weather.kcrq_daynight.state',
                        temperature: '&weather.kcrq_daynight.attributes.temperature',
                        temperatureUnit: '°F',
                        windSpeed: '&weather.kcrq_daynight.attributes.wind_speed',
                        windSpeedUnit: 'mph &sensor.nws_summary.attributes.wind_bearing',
                        humidity: '&weather.kcrq_daynight.attributes.humidity',
                        humidityUnit: '%',
                        list: [
                           '&weather.kcrq_daynight.attributes.pressure' + ' inHg, ' + '&sensor.mkiii_rainfall_tileboard.state',
                           '&sensor.nws_summary.attributes.precipitation_propability' + '% Chance of Rain',  
                           '&sensor.nws_summary.attributes.visibility' + ' mi Visibility'
                        ]
                     }
                  },
/*                  { // darksky depracated after apple acquitiion 
                     position: [0, 3],
                     height: 2,
                     theme: ITEM_TRANSPARENT,
                     type: TYPES.WEATHER,
                     id: 'weather.dark_sky',
                     customStyles: { fontSize: '11px' },
                     state: '&sensor.dark_sky_summary.state', 
                     icon: '&sensor.dark_sky_icon.state',
                     icons: {
                        'clear-day': 'clear',
                        'clear-night': 'nt-clear',
                        'cloudy': 'cloudy',
                        'rain': 'rain',
                        'sleet': 'sleet',
                        'snow': 'snow',
                        'wind': 'hazy',
                        'fog': 'fog',
                        'partly-cloudy-day': 'partlycloudy',
                        'partly-cloudy-night': 'nt-partlycloudy'
                     },
                     fields: { // most of that fields are optional
                        summary: '&sensor.dark_sky_summary.state',
                        temperature: '&sensor.dark_sky_temperature.state',
                        temperatureUnit: '&sensor.dark_sky_temperature.attributes.unit_of_measurement',
                        windSpeed: '&sensor.dark_sky_wind_speed.state',
                        windSpeedUnit: '&sensor.dark_sky_wind_speed.attributes.unit_of_measurement',
                        humidity: '&sensor.dark_sky_humidity.state',
                        humidityUnit: '&sensor.dark_sky_humidity.attributes.unit_of_measurement',
                        list: [
                           'Pressure '+ '&sensor.dark_sky_pressure.state'+ '&sensor.dark_sky_pressure.attributes.unit_of_measurement',
                           '&sensor.dark_sky_precip_probability.state'+ '&sensor.dark_sky_precip_probability.attributes.unit_of_measurement' + 
                            ' chance of rain',
                        ]
                     }
                  },*/
                  {
                     position: [4, 4],
                     type: TYPES.CAMERA,
//                     id: 'camera.doorbird_thumbnail',
                     id: {},
                     bgSize: 'cover',
                     width: 2,
                     state: false,
                     title: '',
                     refresh: 5000,
//                   filter: function (item, entity) {return "http://192.168.1.36:1050/mjpg/doorbird/video.mjpg?user=dan&pw=9665"},
                     filter: function (item, entity) {return "http://192.168.1.36:1050/image/doorbird?user=dan&pw=9665"},
                     fullscreen: {
                        type: TYPES.CAMERA,
                        bgSize: 'contain',
                        refresh: 1000,
//                      filter: function (item, entity) {return "http://192.168.1.36:1050/mjpg/doorbird/video.mjpg?user=dan&pw=9665"},
                        filter: function (item, entity) {return "http://192.168.1.36:1050/image/doorbird?user=dan&pw=9665"},
                     }
                  },
                  { position: [0, 1], type: TYPES.CUSTOM, title: 'Garage Door', subtitle: 'Left', id: 'cover.left_garage_door',
                    states: { closed: 'Closed', open: 'Open' }, icons: {open: 'mdi-garage-open',closed: 'mdi-garage'},
                    action: function(item, entity) {
		            var action = 'open_cover';
		            if(entity.state === 'open') { action = 'close_cover'; }
		            Api.send({ type: 'call_service',
			               domain: 'cover',
			               service: action,
			               service_data: { entity_id: 'cover.left_garage_door' }
	                    });
                    }
                  },
//                  { position: [0, 1], type: TYPES.LOCK, title: "Garage Door", subtitle: "Left", id: 'cover.left_garage_door',
//                    states: { closed: 'Closed', open: 'Open' }, icons: { closed: 'mdi-garage', open: 'mdi-garage-open' },
                  { position: [1, 1], type: TYPES.CUSTOM, title: 'Garage Door', subtitle: 'Right', id: 'cover.right_garage_door',
                    states: { closed: 'Closed', open: 'Open' }, icons: {open: 'mdi-garage-open',closed: 'mdi-garage'},
                    action: function(item, entity) {
                            var action = 'open_cover';
                            if(entity.state === 'open') { action = 'close_cover'; }
                            Api.send({ type: 'call_service',
                                       domain: 'cover',
                                       service: action,
                                       service_data: { entity_id: 'cover.right_garage_door' }
                            });
                    }
                  },
//                  { position: [1, 1], type: TYPES.LOCK, title: "Garage Door", subtitle: "Right", id: 'cover.right_garage_door',
//                    states: { closed: 'Closed', open: 'Open' }, icons: { closed: 'mdi-garage', open: 'mdi-garage-open' }
                  { position: [2, 1], type: TYPES.LOCK, title: "Rose Garden Gate", id: 'lock.rose_garden_gate_198',
                    states: { locked: 'Locked', unlocked: 'Unlocked' }, icons: { locked: 'mdi-gate', unlocked: 'mdi-gate' },
                  },
                  { position: [3, 1], type: TYPES.LOCK, title: "Back Gate", id: 'lock.back_gate_202',
                    states: { locked: 'Locked', unlocked: 'Unlocked' }, icons: { locked: 'mdi-gate', unlocked: 'mdi-gate' }
                  },
                  { position: [4, 1], type: TYPES.LOCK, title: "Front Door Lock", id: 'lock.front_door_lock_197',
                    states: { locked: 'Locked', unlocked: 'Unlocked' }, icons: { locked: 'mdi-lock-smart', unlocked: 'mdi-lock-smart' },
                  },
                  { position: [0, 2], type: TYPES.DEVICE_TRACKER, title: "Dan", id: 'device_tracker.life360_dan', map: 'google',
                    bgSuffix: '@attributes.entity_picture', states: { home: 'Home', not_home: 'Away' }, zoomLevels: [10],
                    customStyles: function (item, entity) { 
                       if (entity.state !== 'home') { return { 'opacity': 0.7, 'filter': 'grayscale()', 'color': 'white', 'fontSize': '18px' }; }
                       else { return { 'opacity': 1, 'filter': '', 'color': 'white', 'fontSize': '18px'}; }
                    },
                  },
                  { position: [1, 2], type: TYPES.DEVICE_TRACKER, title: "Cheryl", id: 'device_tracker.life360_cheryl_xx', map: 'google',
                    states: { home: 'Home', not_home: 'Away' }, zoomLevels: [10], bgSuffix: '@attributes.entity_picture',
                    customStyles: function (item, entity) { 
                       if (entity.state !== 'home') { return { 'opacity': 0.7, 'filter': 'grayscale()', 'color': 'white', 'fontSize': '18px' }; }
                       else { return { 'opacity': 1, 'filter': '', 'color': 'white', 'fontSize': '18px'}; }
                    }
                  },
                  { position: [2, 2], type: TYPES.DEVICE_TRACKER, title: "Amy", id: 'device_tracker.life360_amelia_xx', map: 'google',
                    states: { home: 'Home', not_home: 'Away' }, bgSuffix: '@attributes.entity_picture', zoomLevels: [10],
                    customStyles: function (item, entity) { 
                       if (entity.state !== 'home') { return { 'opacity': 0.7, 'filter': 'grayscale()', 'color': 'white', 'fontSize': '18px' }; }
                       else { return { 'opacity': 1, 'filter': '', 'color': 'white', 'fontSize': '18px'}; }
                    }
                  },
                  { position: [3, 2], type: TYPES.DEVICE_TRACKER, title: "Nicholas", id: 'device_tracker.life360_nicholas_xx', map: 'google',
                    states: { home: 'Home', not_home: 'Away' }, zoomLevels: [10], bgSuffix: '@attributes.entity_picture',
                    customStyles: function (item, entity) { 
                       if (entity.state !== 'home') { return { 'opacity': 0.7, 'filter': 'grayscale()', 'color': 'white', 'fontSize': '18px' }; }
                       else { return { 'opacity': 1, 'filter': '', 'color': 'white', 'fontSize': '18px'}; }
                    }
                  },
                  { position: [4, 2], type: TYPES.DEVICE_TRACKER, title: "Anthony", id: 'device_tracker.life360_anthony', map: 'google',
                    states: { home: 'Home', not_home: 'Away' }, zoomLevels: [10], bgSuffix: '@attributes.entity_picture',
                    customStyles: function (item, entity) { 
                       if (entity.state !== 'home') { return { 'opacity': 0.7, 'filter': 'grayscale()', 'color': 'white', 'fontSize': '18px' }; }
                       else { return { 'opacity': 1, 'filter': '', 'color': 'white', 'fontSize': '18px'}; }
                    }
                  },
                  {
                     position: [1, 3], type: TYPES.WEATHER_LIST,  width: 2, height: 1, id: {}, 
                     title: null, secondaryTitle: 'Wind',
                     icons: { 'clear-day': 'clear', 'clear-night': 'nt-clear', 'cloudy': 'cloudy', 'rain': 'rain','rainy': 'rain',
                              'sleet': 'sleet', 'snow': 'snow', 'wind': 'hazy', 'fog': 'fog', 'partly-cloudy-day': 'partlycloudy',
                              'partly-cloudy-night': 'nt-partlycloudy', 'lightning-rainy': 'tstorms', 'partlycloudy': 'partlycloudy',
                     },
                     hideHeader: false, customStyles: { 'fontSize': '13px' }, theme: ITEM_TRANSPARENT,
                     list: ['1p','2p','3p'].map(function (id) {
                       var wind_bearing = '&sensor.nws_summary_' + id + '.attributes.wind_bearing';
                       var wind_speed = '&sensor.nws_summary_' + id + '.attributes.wind_speed mph';
                       var ampm = '&sensor.nws_summary_' + id + '.attributes.daytime';
                        return {
                           date: '&sensor.nws_summary_' + id + '.attributes.date' + ampm,
                           icon: '&sensor.nws_icon_' + id + '.state',
                           primary: '&sensor.nws_summary_' + id + '.attributes.short_summary',
                           secondary: wind_speed,
                        }  
                     }) 
                  },
/*                  { // darksky version
                     position: [1, 3], type: TYPES.WEATHER_LIST,  width: 2, height: 1, id: {}, 
                     icons: { 'clear-day': 'clear', 'clear-night': 'nt-clear', 'cloudy': 'cloudy', 'rain': 'rain',
                              'sleet': 'sleet', 'snow': 'snow', 'wind': 'hazy', 'fog': 'fog', 'partly-cloudy-day': 'partlycloudy',
                              'partly-cloudy-night': 'nt-partlycloudy', 'sunny': 'clear-day'
                     },
                     hideHeader: false, customStyles: { 'fontSize': '13px' }, theme: ITEM_TRANSPARENT,
                     list: [1,2,3].map(function (id) {
                        var forecast = "&sensor.dark_sky_summary_" + id + "d.state";
                        return {
                           date: function () {
                              var d = new Date(Date.now() + id * 24 * 60 * 60 * 1000);
                              return d.toString().split(' ').slice(1, 3).join(' ');
                           },
                           icon: '&sensor.dark_sky_icon_' + id + 'd.state',
                           primary: forecast
                        }  
                     }) 
                  },*/
                  { position: [3, 3], type: TYPES.TEXT_LIST, title: 'Temperature', id: {}, state: false, 
                    customStyles: { 'fontSize': '13px' },
                    list: [{ value: '&sensor.awair_family_room_temperature.state' + ' °F', title: 'Family'},
                           { value: '&sensor.awair_upstairs_temperature.state' + ' °F', title: 'Upstairs'},
                           { value: '&sensor.awair_shack_temperature.state' + ' °F', title: 'Shack'},
                           { value: '&sensor.mkiii_air_temperature.state' + ' °F', title: 'Outdoor'}]
                  }, 
/*                  { position: [1, 3], type: TYPES.SENSOR, title: "Temperature", subtitle: "Family Room", id: 'sensor.awair_family_room_temperature',
                    unit: '@attributes.unit_of_measurement', state: false,
                  },
                  { position: [2, 3], type: TYPES.SENSOR, title: "Temperature", subtitle: "Second Floor", id: 'sensor.awair_upstairs_temperature',
                    unit: '@attributes.unit_of_measurement', state: false,
                  },
                  { position: [3, 3], type: TYPES.SENSOR, title: "Temperature", subtitle: "Shack", id: 'sensor.awair_shack_temperature',
                    unit: '@attributes.unit_of_measurement', state: false,
                  },*/
                  { position: [5, 1], type: TYPES.LIGHT, title: "Fountain", subtitle: "Front Entry", id: 'switch.frontdoor_fountain',
                    state: false, states: { on: 'On', off: 'Off' }, icons: { on: 'mdi-fountain', off: 'mdi-fountain' }
                  },
                  { position: [5, 2], type: TYPES.LIGHT, title: "Fountain", subtitle: "Rose Garden", id: 'switch.garden_fountain',
                    state: false, states: { on: 'On', off: 'Off' }, icons: { on: 'mdi-fountain', off: 'mdi-fountain' }
                  }, 
                  { position: [6, 4], type: TYPES.CUSTOM, title: "Reload", id: {}, icon: 'mdi-reload', theme: ITEM_TRANSPARENT,
                    action: function(e) { window.location.reload(); }
                  },
//                  { position: [6, 1], type: TYPES.CUSTOM, title: '', id: {}, hidden: true,
//                    refresh: 10000, action: function(e) { window.openPage(CONFIG.pages[0]); }
//                  },
                  { position: [1, 4], type: TYPES.LIGHT, title: "House", subtitle: "Lights", id: 'binary_sensor.house_lights',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lightbulb-group", off: "mdi-lightbulb-group" }
                  }, 
                  { position: [2, 4], type: TYPES.LIGHT, title: "Shack", subtitle: "Lights", id: 'binary_sensor.shack_lights',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lightbulb-group", off: "mdi-lightbulb-group" }
                  }, 
                  { position: [3, 4], type: TYPES.LIGHT, title: "Outdoor", subtitle: "Lights", id: 'binary_sensor.outdoor_lights',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lightbulb-group", off: "mdi-lightbulb-group" }
                  }, 
                  { position: [4, 3], type: TYPES.SENSOR_ICON, title: "House", subtitle: 'Doors', id: 'binary_sensor.doors',
                    states: { on: 'Open', off: 'Closed' }, icons: { on: 'mdi-door-open', off: 'mdi-door-closed' },
                  },
                  { position: [5, 3], type: TYPES.SENSOR_ICON, title: "House", subtitle: 'Windows', id: 'binary_sensor.windows',
                    states: { on: 'Open', off: 'Closed' }, icons: { on: 'mdi-window-open', off: 'mdi-window-closed' },
                  },
                  { position: [6, 3], type: TYPES.GAUGE, title: "Water &sensor.flume_daily_gallons.state gals", 
                    id: 'sensor.flume_sensor_monte_verde',
//                    id: 'sensor.flume_sensor_6557172369087683770',
                    state: false,
                    settings: {
                       size: 100, // Defaults to 50% of either height or width, whichever is smaller
                       type: 'arch', // Options are: 'full', 'semi', and 'arch'. Defaults to 'full'
                       min: 0, 
                       max: 10, 
                       cap: 'round', // Options are: 'round', 'butt'. Defaults to 'butt'
                       thick: 6, 
                       label: function(item, entity) { return parseFloat(entity.state).toFixed(1) + ' g/m' },
//                       append: '@attributes.unit_of_measurement', 
                       prepend: '', 
//                       duration: 1500, 
                       thresholds: { 0: { color: 'green'}, 2: { color: 'yellow' }, 5: { color: 'red' } },  
                       labelOnly: true, 
                       foregroundColor: 'rgba(0, 150, 136, 1)', 
                       backgroundColor: 'rgba(0, 0, 0, 0.1)', 
                       fractionSize: 1, 
                    }
                  },
/*                  { position: [6, 3], type: TYPES.SENSOR_ICON, title: "CO Detectors", id: 'binary_sensor.co',
                    states: { off: "Ok", on: "Warning" }, icons: { off: 'mdi-periodic-table-co2', on: 'mdi-periodic-table-co2' }
                  },
                  { position: [6, 4], type: TYPES.SENSOR_ICON, title: "Smoke Detectors", id: "binary_sensor.smoke", 
                    states: { off: "Ok", on: "Warning" }, icons: { off: 'mdi-smoke-detector', on: 'mdi-smoke-detector' }
                  }, */
               ]
            }
         ]
      },
      {
         title: 'Doors',
         bg: "images/monteverde.jpg",
         icon: 'mdi-door',
         header: DEFAULT_HEADER,
         groups: [
            {
               title: 'Doors',
               items: [
                  { position: [0, 0], type: TYPES.SENSOR_ICON, title: "Garage Door", id: 'binary_sensor.garage_entry_door',
                    states: { on: 'Open', off: 'Closed' }, icons: { on: 'mdi-door-open', off: 'mdi-door-closed' },
                  },
                  { position: [1, 0], type: TYPES.SENSOR_ICON, title: "Front Door", id: 'binary_sensor.front_door',
                    states: { on: 'Open', off: 'Closed' }, icons: { on: 'mdi-door-open', off: 'mdi-door-closed' },
                  },
                  { position: [2, 0], type: TYPES.LOCK, title: "Front Door Lock", id: 'lock.front_door_lock_197',
                    states: { locked: 'Locked', unlocked: 'Unlocked' }, icons: { locked: 'mdi-lock-smart', unlocked: 'mdi-lock-smart' },
                  },
                  { position: [3, 0], type: TYPES.SENSOR_ICON, title: "Guest Bedroom", subtitle: 'Doors', id: 'binary_sensor.guest_bedroom_doors',
                    states: { on: 'Open', off: 'Closed' }, icons: { on: 'mdi-door-open', off: 'mdi-door-closed' },
                  },
                  { position: [4, 0], type: TYPES.SENSOR_ICON, title: "Living Room", subtitle: 'Doors', id: 'binary_sensor.living_room_doors',
                    states: { on: 'Open', off: 'Closed' }, icons: { on: 'mdi-door-open', off: 'mdi-door-closed' },
                  },
                  { position: [5, 0], type: TYPES.SENSOR_ICON, title: "Dining Room", subtitle: "Door", id: 'binary_sensor.dining_room_doors',
                    states: { on: 'Open', off: 'Closed' }, icons: { on: 'mdi-door-open', off: 'mdi-door-closed' },
                  },
                  { position: [0, 1], type: TYPES.SENSOR_ICON, title: "Family Room", subtitle: "Doors", id: 'binary_sensor.family_room_doors',
                    states: { on: 'Open', off: 'Closed' }, icons: { on: 'mdi-door-open', off: 'mdi-door-closed' },
                  },
                  { position: [1, 1], type: TYPES.CUSTOM, title: 'Garage Door', subtitle: 'Left', id: 'cover.left_garage_door',
                    states: { closed: 'Closed', open: 'Open' }, icons: {open: 'mdi-garage-open',closed: 'mdi-garage'},
                    action: function(item, entity) {
                            var action = 'open_cover';
                            if(entity.state === 'open') { action = 'close_cover'; }
                            Api.send({ type: 'call_service',
                                       domain: 'cover',
                                       service: action,
                                       service_data: { entity_id: 'cover.left_garage_door' }
                            });
                    }
                  },
                  { position: [2, 1], type: TYPES.CUSTOM, title: 'Garage Door', subtitle: 'Right', id: 'cover.right_garage_door',
                    states: { closed: 'Closed', open: 'Open' }, icons: {open: 'mdi-garage-open',closed: 'mdi-garage'},
                    action: function(item, entity) {
                            var action = 'open_cover';
                            if(entity.state === 'open') { action = 'close_cover'; }
                            Api.send({ type: 'call_service',
                                       domain: 'cover',
                                       service: action,
                                       service_data: { entity_id: 'cover.right_garage_door' }
                            });
                    }
                  },

                  { position: [3, 1], type: TYPES.LOCK, title: "Rose Garden Gate", id: 'lock.rose_garden_gate_198',
                    states: { locked: 'Locked', unlocked: 'Unlocked' }, icons: { locked: 'mdi-gate', unlocked: 'mdi-gate' },
                  },
                  { position: [4, 1], type: TYPES.LOCK, title: "Back Gate", id: 'lock.back_gate_202',
                    states: { locked: 'Locked', unlocked: 'Unlocked' }, icons: { locked: 'mdi-gate', unlocked: 'mdi-gate' }
                  },
                  { position: [5, 1], type: TYPES.SENSOR_ICON, title: "Family Room", subtitle: "Motion", id: 'binary_sensor.family_motion',
                    state: false, states: { off: 'No Motion', on: 'Motion' }, icons: { off: 'mdi-run-fast', on: 'mdi-run-fast' }
                  },
                  { position: [0, 2], type: TYPES.SENSOR_ICON, title: "Front Door", subtitle: "Motion", id: 'binary_sensor.doorbird_motion_206',
                    state: false, states: { off: 'No Motion', on: 'Motion' }, icons: { off: 'mdi-run-fast', on: 'mdi-run-fast' }
                  },
                  { position: [1, 2], type: TYPES.LIGHT, title: "Alarm", id: 'switch.siren_196_2', theme: ITEM_TRANSPARENT,
                    states: { on: 'On', off: 'Off' }, icons: { on: 'mdi-alarm-bell', off: 'mdi-alarm-bell' },
                  },
               ]
            },
         ]
      },
      {
         title: 'Windows',
         bg: "images/monteverde.jpg",
         icon: 'mdi-window-open',
         header: DEFAULT_HEADER,
         groups: [
            {
               title: 'Windows',
               items: [
                  { position: [0, 0], type: TYPES.SENSOR_ICON, title: "Anthony's Bedroom", id: 'binary_sensor.blue_bedroom_windows',
                    states: { on: 'Open', off: 'Closed' }, icons: { on: 'mdi-window-open', off: 'mdi-window-closed' },
                  },
                  { position: [1, 0], type: TYPES.SENSOR_ICON, title: "Nicholas' Bedroom", id: 'binary_sensor.tile_bedroom_windows',
                    states: { on: 'Open', off: 'Closed' }, icons: { on: 'mdi-window-open', off: 'mdi-window-closed' },
                  },
                  { position: [2, 0], type: TYPES.SENSOR_ICON, title: "Amy's Bedroom", id: 'binary_sensor.rock_n_roll_bedroom_windows',
                    states: { on: 'Open', off: 'Closed' }, icons: { on: 'mdi-window-open', off: 'mdi-window-closed' },
                  },
                  { position: [3, 0], type: TYPES.SENSOR_ICON, title: "Master Bedroom", id: 'binary_sensor.master_bedroom_windows',
                    states: { on: 'Open', off: 'Closed' }, icons: { on: 'mdi-window-open', off: 'mdi-window-closed' },
                  },
                  { position: [4, 0], type: TYPES.SENSOR_ICON, title: "Master Bathroom", id: 'binary_sensor.master_bathroom_window',
                    states: { on: 'Open', off: 'Closed' }, icons: { on: 'mdi-window-open', off: 'mdi-window-closed' },
                  },
                  { position: [0, 1], type: TYPES.SENSOR_ICON, title: "Office", id: 'binary_sensor.office_windows',
                    states: { on: 'Open', off: 'Closed' }, icons: { on: 'mdi-window-open', off: 'mdi-window-closed' },
                  },
                  { position: [1, 1], type: TYPES.SENSOR_ICON, title: "Laundry Room", id: 'binary_sensor.laundry_room_windows',
                    states: { on: 'Open', off: 'Closed' }, icons: { on: 'mdi-window-open', off: 'mdi-window-closed' },
                  },
                  { position: [2, 1], type: TYPES.SENSOR_ICON, title: "Powder Room", id: 'binary_sensor.powder_gallery_windows',
                    states: { on: 'Open', off: 'Closed' }, icons: { on: 'mdi-window-open', off: 'mdi-window-closed' },
                  },
                  { position: [3, 1], type: TYPES.SENSOR_ICON, title: "Nook", subtitle: "Gallery", id: 'binary_sensor.nook_windows',
                    states: { on: 'Open', off: 'Closed' }, icons: { on: 'mdi-window-open', off: 'mdi-window-closed' },
                  },
               ]
            },
         ]
      }, 
      {
         title: 'Lights',
         bg: "images/monteverde.jpg",
         icon: 'mdi-numeric-1-box-multiple-outline',
         header: DEFAULT_HEADER,
         groups: [
            {
               title: 'First Floor Lights',
               items: [
                  { position: [0, 0], type: TYPES.LIGHT, state: false, title: "Hallways", subtitle: 'Gallery', id: 'switch.gallery_stairs_lights_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lightbulb-on", off: "mdi-lightbulb" }
                  },
                  { position: [1, 0], type: TYPES.LIGHT, state: false, title: "Guest Hallway", id: 'switch.guest_hallway_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lightbulb-on", off: "mdi-lightbulb" }
                  },
                  { position: [2, 0], type: TYPES.LIGHT, state: false, title: "Laundry Room", id: 'switch.laundry_room_light',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lightbulb-on", off: "mdi-lightbulb" }
                  },
                  { position: [3, 0], type: TYPES.LIGHT, state: false, title: "Guest Bedroom", id: 'switch.guest_bedroom_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-ceiling-light", off: "mdi-ceiling-light" }
                  },
                  { position: [4, 0], type: TYPES.LIGHT, state: false, title: "Guest Bathroom", id: 'switch.guest_bathroom_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-vanity-light", off: "mdi-vanity-light" }
                  },
                  { position: [5, 0], type: TYPES.LIGHT, state: false, title: "Guest Bathroom", subtitle: "Fan", id: 'light.guest_bathroom_fan',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-fan", off: "mdi-fan-off" }
                  },
                  { position: [0, 1], type: TYPES.LIGHT, state: false, title: "Guest Bedroom", subtitle: "Closet", id: 'switch.guest_closet_light',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lightbulb-on", off: "mdi-lightbulb" }
                  },
                  { position: [1, 1], type: TYPES.LIGHT, state: false, title: "Garage Lights", id: 'switch.garage_lights_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lightbulb-on", off: "mdi-lightbulb" }
                  },
                  { position: [2, 1], type: TYPES.LIGHT, state: false, title: "Powder Room", id: 'switch.powder_room_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-vanity-light", off: "mdi-vanity-light" }
                  },
                  { position: [3, 1], type: TYPES.LIGHT, state: false, title: "Powder Room", subtitle: "Fan", id: 'light.powder_room_fan',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-fan", off: "mdi-fan-off" }
                  },
                  { position: [4, 1], type: TYPES.LIGHT, state: false, title: "Entry", id: 'switch.entry_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-ceiling-light", off: "mdi-ceiling-light" }
                  },
                  { position: [5, 1], type: TYPES.LIGHT, state: false, title: "Bar", id: 'switch.bar_light',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lightbulb-on", off: "mdi-lightbulb" }
                  },
                  { position: [0, 2], type: TYPES.LIGHT, state: false, title: "Hallway", subtitle: "Closet", id: 'switch.front_closet_light',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lightbulb-on", off: "mdi-lightbulb" }
                  },
                  { position: [1, 2], type: TYPES.LIGHT, state: false, title: "Data Room", id: 'switch.dataroom_light',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lightbulb-on", off: "mdi-lightbulb" }
                  },
                  { position: [2, 2], type: TYPES.LIGHT, state: false, title: "Living Room", id: 'switch.living_room_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-ceiling-light", off: "mdi-ceiling-light" }
                  },
                  { position: [3, 2], type: TYPES.LIGHT, state: false, title: "Living Room", subtitle: "Table Lights", id: 'switch.living_room_switched_lights',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lamp", off: "mdi-lamp" }
                  },
                  { position: [4, 2], type: TYPES.LIGHT, state: false, title: "Dining Room", id: 'switch.dining_room_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-ceiling-light", off: "mdi-ceiling-light" }
                  },
                  { position: [5, 2], type: TYPES.LIGHT, state: false, title: "Kitchen", id: 'switch.kitchen_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-track-light", off: "mdi-track-light" }
                  },
                  { position: [0, 3], type: TYPES.LIGHT, state: false, title: "Kitchen", subtitle: "Pantry", id: 'switch.pantry_light',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lightbulb-on", off: "mdi-lightbulb" }
                  },
                  { position: [1, 3], type: TYPES.LIGHT, state: false, title: "Kitchen", subtitle: "Cabinet Lights", id: 'switch.kitchen_cabinet_lights',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lightbulb-on", off: "mdi-lightbulb" }
                  },
                  { position: [2, 3], type: TYPES.LIGHT, state: false, title: "Family Room", subtitle: "Table Lights", id: 'switch.family_table_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lamp", off: "mdi-lamp" }
                  },
                  { position: [3, 3], type: TYPES.LIGHT, state: false, title: "Family Room", subtitle: "Ceiling Lights", id: 'switch.family_room_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-track-light", off: "mdi-track-light" }
                  },
                  { position: [4, 3], type: TYPES.LIGHT, state: false, title: "Family Room", subtitle: "Hanging Light", id: 'switch.family_hanging_light',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lightbulb-on", off: "mdi-lightbulb" }
                  },
                  { position: [5, 3], type: TYPES.LIGHT, state: false, title: "Gym", id: 'switch.gym_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-weight-lifter", off: "mdi-lightbulb" }
                  },
                  { position: [0, 4],
                    type: TYPES.VACUUM,
                    theme: ITEM_TRANSPARENT,
                    title: 'Downstairs(' + '&vacuum.roomba_downstair.attributes.battery_level' + '%)',
                    subtitle: 'Roomba',
                    state: false,
                    id: 'vacuum.roomba_downstair',
                    icon: 'mdi-robot-vacuum',
                    customStyles: function (item, entity) {
                       if (entity.state == 'on') {
                         return {'backgroundColor': 'transparent','color': '#3ac900'};
                       } else {
                         return {'backgroundColor': 'transparent','color': '#f7f7f7'};
                       }
                    }
                  }
               ]
            }
         ]
      },
      {
         title: 'Lights',
         bg: "images/monteverde.jpg",
         icon: 'mdi-numeric-2-box-multiple-outline',
         header: DEFAULT_HEADER,
         groups: [
            {
               title: 'Second Floor Lights',
               items: [
                  { position: [0, 0], type: TYPES.LIGHT, state: false, title: "Anthony's Room", id: 'switch.anthony_room_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-ceiling-light", off: "mdi-ceiling-light" }
                  },
                  { position: [1, 0], type: TYPES.LIGHT, state: false, title: "Nicholas' Room", id: 'switch.nick_bedroom_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-ceiling-light", off: "mdi-ceiling-light" }
                  },
                  { position: [2, 0], type: TYPES.LIGHT, state: false, title: "Nicholas Bathroom", id: 'switch.nick_bath_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-vanity-light", off: "mdi-vanity-light" }
                  },
                  { position: [3, 0], type: TYPES.LIGHT, state: false, title: "Amelia's Room", id: 'switch.amelia_room_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lamp", off: "mdi-lamp" }
                  },
                  { position: [4, 0], type: TYPES.LIGHT, state: false, title: "Amelia's Room", subtitle: "Ceiling Fan", id: 'switch.amy_bedroom_fan_light',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-ceiling-light", off: "mdi-ceiling-light" }
                  },
                  { position: [5, 0], type: TYPES.LIGHT, state: false, title: "Amelia's Bathroom", id: 'switch.amelia_bathroom_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-vanity-light", off: "mdi-vanity-light" }
                  },
                  { position: [0, 1], type: TYPES.LIGHT, state: false, title: "Hallway Bathroom", id: 'switch.hallway_bathroom_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-vanity-light", off: "mdi-vanity-light" }
                  },
                  { position: [1, 1], type: TYPES.LIGHT, state: false, title: "Hallway Bathroom", subtitle: "Fan", id: 'switch.hall_bathroom_fan',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-fan", off: "mdi-fan-off" }
                  },
                  { position: [2, 1], type: TYPES.LIGHT, state: false, title: "Office", id: 'switch.office_lights_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lightbulb-on", off: "mdi-lightbulb" }
                  },
                  { position: [3, 1], type: TYPES.LIGHT, state: false, title: "Master Bedroom", subtitle: "Chandelier", id: 'light.master_bedroom_chandelier',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-ceiling-light", off: "mdi-ceiling-light" }
                  },
                  { position: [4, 1], type: TYPES.LIGHT, state: false, title: "Master Bedroom", subtitle: "Table Lights", id: 'switch.master_table_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lamp", off: "mdi-lamp" }
                  },
                  { position: [5, 1], type: TYPES.LIGHT, state: false, title: "Master Bedroom", subtitle: "Ceiling Lights", id: 'light.master_bedroom_ceiling_lights',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-track-light", off: "mdi-track-light" }
                  },
                  { position: [0, 2], type: TYPES.LIGHT, state: false, title: "Master Bedroom", subtitle: "Closet Lights", id: 'switch.master_bedroom_closet_light',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lightbulb-on", off: "mdi-lightbulb" }
                  },
                  { position: [1, 2], type: TYPES.LIGHT, state: false, title: "Master Bathroom", id: 'switch.master_bath_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-vanity-light", off: "mdi-vanity-light" }
                  },
                  { position: [2, 2], type: TYPES.LIGHT, state: false, title: "Master Bathroom", subtitle: "Shower Light", id: 'switch.master_shower_light',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lightbulb-on", off: "mdi-lightbulb" }
                  },
                  { position: [3, 2], type: TYPES.LIGHT, state: false, title: "Master Bathroom", subtitle: "Toilet Light", id: 'light.master_toilet_light',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lightbulb-on", off: "mdi-lightbulb" }
                  },
                  { position: [4, 2], type: TYPES.LIGHT, state: false, title: "Master Bathroom", subtitle: "Fan", id: 'light.master_toilet_fan',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-fan", off: "mdi-fan-off" }
                  },
                  { position: [5, 2], type: TYPES.LIGHT, state: false, title: "Hallways", subtitle: 'Gallery', id: 'switch.gallery_stairs_lights_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lightbulb-on", off: "mdi-lightbulb" }
                  },
                  { position: [0, 3],
                    type: TYPES.VACUUM,
                    theme: ITEM_TRANSPARENT,
                    title: 'Upstairs(' + '&vacuum.roomba_upstairs.attributes.battery_level' + '%)',
                    subtitle: 'Roomba',
                    state: false,
                    id: 'vacuum.roomba_upstairs',
                    icon: 'mdi-robot-vacuum',
                    customStyles: function (item, entity) {
                      if (entity.state == 'on') {
                        return {'backgroundColor': 'transparent','color': '#3ac900'};
                      } else {
                        return {'backgroundColor': 'transparent','color': '#f7f7f7'};
                      }
                    }
                  }
               ]
            },
         ]
      },
      {
         title: 'Lights',
         bg: "images/monteverde.jpg",
         icon: 'mdi-home-lightbulb-outline',
         header: DEFAULT_HEADER,
         groups: [
            {
               title: 'Shack Lights',
               items: [
                  { position: [0, 0], type: TYPES.LIGHT, state: false, title: "Shack", id: 'switch.shack_lights_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-track-light", off: "mdi-track-light" }
                  },
                  { position: [1, 0], type: TYPES.LIGHT, state: false, title: "Shack Bathroom", id: 'switch.shack_bathroom_scene',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-vanity-light", off: "mdi-vanity-light" }
                  },
                  { position: [2, 0], type: TYPES.LIGHT, state: false, title: "Shack Bathroom", subtitle: 'Fan', id: 'switch.shack_bathroom_fan',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-fan", off: "mdi-fan-off" }
                  },
               ]
            },
/*            {
               title: 'Shack Thermostat/Sensors',
               items: [
                  { position: [0, 0], height: 1.3, type: TYPES.CLIMATE, title: "Shack", id: 'climate.shack', unit: '°F', 
                    state: function (item, entity) { 
                       return  'Current ' + entity.attributes.current_temperature + '°F'; 
                    }
                  },
                  { position: [1, 0], type: TYPES.SENSOR, title: "Temperature", subtitle: "Shack", id: 'sensor.awair_shack_temperature',
                    unit: '@attributes.unit_of_measurement', state: false,
                  },
                  { position: [2, 0], type: TYPES.SENSOR, title: 'Shack', subtitle: 'Bathroom', state: false, unit: '%', 
                    id: 'sensor.wirelesstag_shack_bathroom_moisture',
                    customStyles: function (item, entity) { if (parseFloat(entity.state) > 6.0) { return {backgroundColor: 'red'}}
                                                            else { return {backgroundColor: 'acquablue'}}}
                  },
                  { position: [2, 1], type: TYPES.SENSOR, title: 'Shack', subtitle: 'Sink', state: false, unit: '%', 
                    id: 'sensor.wirelesstag_shack_bathroom_sink_moisture',
                    customStyles: function (item, entity) { if (parseFloat(entity.state) > 6.0) { return {backgroundColor: 'red'}}
                                                            else { return {backgroundColor: 'acquablue'}}}
                  },
               ]
            }, */
         ]
      },
      {
         title: 'Outdoor Lights',
         bg: "images/monteverde.jpg",
         icon: 'mdi-outdoor-lamp',
         header: DEFAULT_HEADER,
         groups: [
            {
               title: 'Outdoor Lights',
               items: [
                  { position: [0, 0], type: TYPES.LIGHT, state: false, title: "Stage", id: 'switch.outdoor_stage_lights',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-spotlight", off: "mdi-spotlight" }
                  },
                  { position: [1, 0], type: TYPES.LIGHT, state: false, title: "Stage", subtitle: "Table Light", id: 'switch.landscape_stage_light',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-lamp", off: "mdi-lamp" }
                  },
                  { position: [2, 0], type: TYPES.LIGHT, state: false, title: "Poolside", subtitle: "Chandelier", id: 'switch.outdoor_poolside_chandelier',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-ceiling-light", off: "mdi-ceiling-light" }
                  },
                  { position: [3, 0], type: TYPES.LIGHT, state: false, title: "Patio", subtitle: "Canopy Lights", id: 'switch.outdoor_patio_canopy',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-string-lights", off: "mdi-string-lights" }
                  },
                  { position: [4, 0], type: TYPES.LIGHT, state: false, title: "Bar", subtitle: "Chandelier", id: 'switch.outdoor_bar_chandelier',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-ceiling-light", off: "mdi-ceiling-light" }
                  },
                  { position: [5, 0], type: TYPES.LIGHT, state: false, title: "Fireplace", subtitle: "Chandelier", id: 'switch.outdoor_dinning_chandelier',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-ceiling-light", off: "mdi-ceiling-light" }
                  },
                  { position: [0, 1], type: TYPES.LIGHT, state: false, title: "Entry", subtitle: "Chandelier", id: 'switch.outdoor_front_lights',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-ceiling-light", off: "mdi-ceiling-light" }
                  },
                  { position: [1, 1], type: TYPES.LIGHT, state: false, title: "House Light", subtitle: "Guest", id: 'switch.outdoor_guest_light',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-outdoor-lamp", off: "mdi-outdoor-lamp" }
                  },
                  { position: [2, 1], type: TYPES.LIGHT, state: false, title: "House Light", subtitle: "Patio", id: 'switch.outdoor_bbq_light',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-outdoor-lamp", off: "mdi-outdoor-lamp" }
                  },
                  { position: [3, 1], type: TYPES.LIGHT, state: false, title: "House Light", subtitle: "Fireplace", id: 'switch.outdoor_fireplace_light',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-outdoor-lamp", off: "mdi-outdoor-lamp" }
                  },
                  { position: [4, 1], type: TYPES.LIGHT, state: false, title: "House Light", subtitle: "Dining", id: 'switch.outdoor_dining_light',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-outdoor-lamp", off: "mdi-outdoor-lamp" }
                  },
                  { position: [5, 1], type: TYPES.LIGHT, state: false, title: "House Light", subtitle: "Rose Garden", id: 'switch.outdoor_rosegarden_light',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-outdoor-lamp", off: "mdi-outdoor-lamp" }
                  },
                  { position: [0, 2], type: TYPES.LIGHT, state: false, title: "Landscape Lights", subtitle: "Back Yard", id: 'switch.landscape_backyard_lights',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-outdoor-lamp", off: "mdi-outdoor-lamp" }
                  },
                  { position: [1, 2], type: TYPES.LIGHT, state: false, title: "Landscape Lights", subtitle: "Driveway", id: 'switch.landscape_driveway_lights',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-outdoor-lamp", off: "mdi-outdoor-lamp" }
                  },
                  { position: [2, 2], type: TYPES.LIGHT, state: false, title: "Landscape Lights", subtitle: "Front Yard", id: 'switch.landscape_front_lights',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-outdoor-lamp", off: "mdi-outdoor-lamp" }
                  },
                  { position: [3, 2], type: TYPES.LIGHT, state: false, title: "Landscape Lights", subtitle: "Rose Garden", id: 'switch.landscape_rosegarden_lights',
                    states: { on: "On", off: "Off" }, icons: { on: "mdi-outdoor-lamp", off: "mdi-outdoor-lamp" }
                  },
               ]
            }
         ]
      },
/*      {
         title: 'Themostats',
         bg: "images/monteverde.jpg",
         icon: 'mdi-thermostat',
         header: DEFAULT_HEADER,
         groups: [
            {
               title: 'Thermostats',
               items: [
                  { position: [0, 0], height: 1.3, type: TYPES.CLIMATE, title: "Family Room", id: 'climate.family_room', unit: '°F', 
                    state: function (item, entity) { 
                       return  'Current ' + entity.attributes.current_temperature + '°F'; 
                    }
                  },
                  { position: [1, 0], height: 1.3, type: TYPES.CLIMATE, title: "Entry", id: 'climate.hallway', unit: '°F', 
                    state: function (item, entity) { 
                       return  'Current ' + entity.attributes.current_temperature + '°F'; 
                    }
                  },
                  { position: [2, 0], height: 1.3, type: TYPES.CLIMATE, title: "Master Bedroom", id: 'climate.master_bedroom', unit: '°F', 
                    state: function (item, entity) { 
                       return  'Current ' + entity.attributes.current_temperature + '°F'; 
                    }
                  },
                  { position: [3, 0], height: 1.3, type: TYPES.CLIMATE, title: "Shack", id: 'climate.shack', unit: '°F', 
                    state: function (item, entity) { 
                       return  'Current ' + entity.attributes.current_temperature + '°F'; 
                    }
                  },
               ]
            } 
         ]
      }, */
      {
         title: 'Sensors',
         bg: "images/monteverde.jpg",
         icon: 'mdi-water-percent',
         header: DEFAULT_HEADER,
         groups: [
            { 
               title: 'Wine Storage',
               items: [
                  { position: [0, 0], type: TYPES.TEXT_LIST, title: 'Eurocave Left', id: {}, state: false, height: .75, 
                    customStyles: {'backgroundColor': 'lightyellow', 'color': 'black'},
                    list: [{ icon: 'mdi-water-percent', value: '&sensor.wirelesstag_eurocave_left_humidity.state' + ' %'},
                           { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_eurocave_left_temperature.state' + ' °F'}]
                  }, 
                  { position: [0, 1], type: TYPES.TEXT_LIST, title: 'Eurocave Right', id: {}, state: false, height: .75, 
                    customStyles: {'backgroundColor': 'darkred', 'color': 'white'},
                    list: [{ icon: 'mdi-water-percent', value: '&sensor.wirelesstag_eurocave_right_humidity.state' + ' %'},
                           { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_eurocave_right_temperature.state' + ' °F'}]
                  }, 
               ]
            },
            {
               title: 'Leak Detectors',
               items: [
                  { position: [0, 0], type: TYPES.TEXT_LIST, state: 'Kitchen Island', id: {}, classes: ['-temp'], height: .6, 
                    customStyles: 
                       function(item,entity) { if (parseFloat(this.states['sensor.wirelesstag_kitchen_island_sink_moisture'].state) > 6.0) 
                                                  { return {'backgroundColor': 'red'} } },
                    list: [
                       { icon: 'mdi-water-percent', value: '&sensor.wirelesstag_kitchen_island_sink_moisture.state' + ' %' },
                       { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_kitchen_island_sink_temperature.state' + ' °F' },
                    ],
                  }, 
                  { position: [1, 0], type: TYPES.TEXT_LIST, state: 'Kitchen Frig', id: {}, classes: ['-temp'], height: .6, 
                    customStyles: 
                       function(item,entity) { if (parseFloat(this.states['sensor.wirelesstag_kitchen_refrigerator_moisture'].state) > 6.0) 
                                                  { return {'backgroundColor': 'red'} } },
                    list: [
                       { icon: 'mdi-water-percent', value: '&sensor.wirelesstag_kitchen_refrigerator_moisture.state' + ' %' },
                       { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_kitchen_refrigerator_temperature.state' + ' °F' },
                    ]
                  }, 
                  { position: [2, 0], type: TYPES.TEXT_LIST, state: 'Kitchen Sink', id: {}, classes: ['-temp'], height: .6, 
                    customStyles: 
                       function(item,entity) { if (parseFloat(this.states['sensor.wirelesstag_kitchen_sink_moisture'].state) > 6.0) 
                                                  { return {'backgroundColor': 'red'} } },
                    list: [
                       { icon: 'mdi-water-percent', value: '&sensor.wirelesstag_kitchen_sink_moisture.state' + ' %' },
                       { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_kitchen_sink_temperature.state' + ' °F' },
                    ]
                  },
                  { position: [3, 0], type: TYPES.TEXT_LIST, state: 'Bar Sink', id: {}, classes: ['-temp'], height: .6, 
                    customStyles: 
                       function(item,entity) { if (parseFloat(this.states['sensor.wirelesstag_bar_moisture'].state) > 6.0) 
                                                  { return {'backgroundColor': 'red'} } },
                    list: [
                       { icon: 'mdi-water-percent', value: '&sensor.wirelesstag_bar_moisture.state' + ' %' },
                       { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_bar_temperature.state' + ' °F' },
                    ]
                  }, 
                  { position: [0, .6], type: TYPES.TEXT_LIST, state: 'Laundry Sink', id: {}, classes: ['-temp'], height: .6, 
                    customStyles: 
                       function(item,entity) { if (parseFloat(this.states['sensor.wirelesstag_laundry_room_sink_moisture'].state) > 6.0) 
                                                  { return {'backgroundColor': 'red'} } },
                    list: [
                       { icon: 'mdi-water-percent', value: '&sensor.wirelesstag_laundry_room_sink_moisture.state' + ' %' },
                       { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_laundry_room_sink_temperature.state' + ' °F' },
                    ]
                  },
                  { position: [1, .6], type: TYPES.TEXT_LIST, state: 'Washer/Dryer', id: {}, classes: ['-temp'], height: .6, 
                    customStyles: 
                       function(item,entity) { if (parseFloat(this.states['sensor.wirelesstag_washer_dryer_moisture'].state) > 6.0) 
                                                  { return {'backgroundColor': 'red'} } },
                    list: [
                       { icon: 'mdi-water-percent', value: '&sensor.wirelesstag_washer_dryer_moisture.state' + ' %' },
                       { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_washer_dryer_temperature.state' + ' °F' },
                    ]
                  },
                  { position: [2, .6], type: TYPES.TEXT_LIST, state: 'Powder Room', id: {}, classes: ['-temp'], height: .6, 
                    customStyles: 
                       function(item,entity) { if (parseFloat(this.states['sensor.wirelesstag_powder_room_moisture'].state) > 6.0) 
                                                  { return {'backgroundColor': 'red'} } },
                    list: [
                       { icon: 'mdi-water-percent', value: '&sensor.wirelesstag_powder_room_moisture.state' + ' %' },
                       { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_powder_room_temperature.state' + ' °F' },
                    ]
                  },
                  { position: [3, .6], type: TYPES.TEXT_LIST, state: 'Shack Bathroom', id: {}, classes: ['-temp'], height: .6, 
                    customStyles: 
                       function(item,entity) { if (parseFloat(this.states['sensor.wirelesstag_shack_bathroom_moisture'].state) > 6.0) 
                                                  { return {'backgroundColor': 'red'} } },
                    list: [
                       { icon: 'mdi-water-percent', value: '&sensor.wirelesstag_shack_bathroom_moisture.state' + ' %' },
                       { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_shack_bathroom_temperature.state' + ' °F' },
                    ]
                  },
                  { position: [0, 1.2], type: TYPES.TEXT_LIST, state: 'Shack Sink', id: {}, classes: ['-temp'], height: .6, 
                    customStyles: 
                       function(item,entity) { if (parseFloat(this.states['sensor.wirelesstag_shack_bathroom_sink_moisture'].state) > 6.0) 
                                                  { return {'backgroundColor': 'red'} } },
                    list: [
                       { icon: 'mdi-water-percent', value: '&sensor.wirelesstag_shack_bathroom_sink_moisture.state' + ' %' },
                       { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_shack_bathroom_sink_temperature.state' + ' °F' },
                    ]
                  },
                  { position: [1, 1.2], type: TYPES.TEXT_LIST, state: 'Water Heaters', id: {}, classes: ['-temp'], height: .6, 
                    customStyles: 
                       function(item,entity) { if (parseFloat(this.states['sensor.wirelesstag_water_heaters_moisture'].state) > 6.0) 
                                                  { return {'backgroundColor': 'red'} } },
                    list: [
                       { icon: 'mdi-water-percent', value: '&sensor.wirelesstag_water_heaters_moisture.state' + ' %' },
                       { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_water_heaters_temperature.state' + ' °F' },
                    ]
                  },
                  { position: [2, 1.2], type: TYPES.TEXT_LIST, state: 'Nick Toilet', id: {}, classes: ['-temp'], height: .6, 
                    customStyles: 
                       function(item,entity) { if (parseFloat(this.states['sensor.wirelesstag_nicholas_bathroom_toilet_moisture'].state) > 6.0) 
                                                  { return {'backgroundColor': 'red'} } },
                    list: [
                       { icon: 'mdi-water-percent', value: '&sensor.wirelesstag_nicholas_bathroom_toilet_moisture.state' + ' %' },
                       { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_nicholas_bathroom_toilet_temperature.state' + ' °F' },
                    ]
                  },
                  { position: [3, 1.2], type: TYPES.TEXT_LIST, state: 'Nick Sink', id: {}, classes: ['-temp'], height: .6, 
                    customStyles: 
                       function(item,entity) { if (parseFloat(this.states['sensor.wirelesstag_nicholas_bathroom_sink_moisture'].state) > 6.0) 
                                                  { return {'backgroundColor': 'red'} } },
                    list: [
                       { icon: 'mdi-water-percent', value: '&sensor.wirelesstag_nicholas_bathroom_sink_moisture.state' + ' %' },
                       { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_nicholas_bathroom_sink_temperature.state' + ' °F' },
                    ]
                  },
                  { position: [0, 1.8], type: TYPES.TEXT_LIST, state: 'Master Left Sink', id: {}, classes: ['-temp'], height: .6, 
                    customStyles: 
                       function(item,entity) { if (parseFloat(this.states['sensor.wirelesstag_master_bathroom_left_sink_moisture'].state) > 6.0) 
                                                  { return {'backgroundColor': 'red'} } },
                    list: [
                       { icon: 'mdi-water-percent', value: '&sensor.wirelesstag_master_bathroom_left_sink_moisture.state' + ' %' },
                       { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_master_bathroom_left_sink_temperature.state' + ' °F' },
                    ]
                  },
                  { position: [1, 1.8], type: TYPES.TEXT_LIST, state: 'Master Right Sink', id: {}, classes: ['-temp'], height: .6, 
                    customStyles: 
                       function(item,entity) { if (parseFloat(this.states['sensor.wirelesstag_master_bathroom_sink_right_moisture'].state) > 6.0) 
                                                  { return {'backgroundColor': 'red'} } },
                    list: [
                       { icon: 'mdi-water-percent', value: '&sensor.wirelesstag_master_bathroom_sink_right_moisture.state' + ' %' },
                       { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_master_bathroom_sink_right_temperature.state' + ' °F' },
                    ]
                  },
                  { position: [2, 1.8], type: TYPES.TEXT_LIST, state: 'Master Toilet', id: {}, classes: ['-temp'], height: .6, 
                    customStyles: 
                       function(item,entity) { if (parseFloat(this.states['sensor.wirelesstag_master_bathroom_toilet_moisture'].state) > 6.0) 
                                                  { return {'backgroundColor': 'red'} } },
                    list: [
                       { icon: 'mdi-water-percent', value: '&sensor.wirelesstag_master_bathroom_toilet_moisture.state' + ' %' },
                       { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_master_bathroom_toilet_temperature.state' + ' °F' },
                    ]
                  },
                  { position: [3, 1.8], type: TYPES.TEXT_LIST, state: 'Hallway Toilet', id: {}, classes: ['-temp'], height: .6, 
                    customStyles: 
                       function(item,entity) { if (parseFloat(this.states['sensor.wirelesstag_hallway_bathroom_toilet_moisture'].state) > 6.0) 
                                                  { return {'backgroundColor': 'red'} } },
                    list: [
                       { icon: 'mdi-water-percent', value: '&sensor.wirelesstag_hallway_bathroom_toilet_moisture.state' + ' %' },
                       { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_hallway_bathroom_toilet_temperature.state' + ' °F' },
                    ]
                  },
                  { position: [0, 2.4], type: TYPES.TEXT_LIST, state: 'Hallway Sink', id: {}, classes: ['-temp'], height: .6, 
                    customStyles: 
                       function(item,entity) { if (parseFloat(this.states['sensor.wirelesstag_hallway_bathroom_sink_moisture'].state) > 6.0) 
                                                  { return {'backgroundColor': 'red'} } },
                    list: [
                       { icon: 'mdi-water-percent', value: '&sensor.wirelesstag_hallway_bathroom_sink_moisture.state' + ' %' },
                       { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_hallway_bathroom_sink_temperature.state' + ' °F' },
                    ]
                  },
                  { position: [1, 2.4], type: TYPES.TEXT_LIST, state: 'Amy Sink', id: {}, classes: ['-temp'], height: .6, 
                    customStyles: 
                       function(item,entity) { if (parseFloat(this.states['sensor.wirelesstag_amelia_bathroom_sink_moisture'].state) > 6.0) 
                                                  { return {'backgroundColor': 'red'} } },
                    list: [
                       { icon: 'mdi-water-percent', value: '&sensor.wirelesstag_amelia_bathroom_sink_moisture.state' + ' %' },
                       { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_amelia_bathroom_sink_temperature.state' + ' °F' },
                    ]
                  }, 
                  { position: [2, 2.4], type: TYPES.TEXT_LIST, state: 'Amy Toilet', id: {}, classes: ['-temp'], height: .6, 
                    customStyles: 
                       function(item,entity) { if (parseFloat(this.states['sensor.wirelesstag_amelia_bathroom_toilet_moisture'].state) > 6.0) 
                                                  { return {'backgroundColor': 'red'} } },
                    list: [
                       { icon: 'mdi-water-percent', value: '&sensor.wirelesstag_amelia_bathroom_toilet_moisture.state' + ' %' },
                       { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_amelia_bathroom_toilet_temperature.state' + ' °F' },
                    ]
                  }, 
                  { position: [3, 2.4], type: TYPES.TEXT_LIST, state: 'Guest Sink', id: {}, classes: ['-temp'], height: .6,
                    customStyles: 
                       function(item,entity) { if (parseFloat(this.states['sensor.wirelesstag_guest_bathroom_sink_moisture'].state) > 6.0) 
                                                  { return {'backgroundColor': 'red'} } },
                    list: [
                       { icon: 'mdi-water-percent', value: '&sensor.wirelesstag_guest_bathroom_sink_moisture.state' + ' %'},
                       { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_guest_bathroom_sink_temperature.state' + ' °F' },
                    ]
                  }, 
                  { position: [0, 3], type: TYPES.TEXT_LIST, state: 'Guest Toilet', id: {}, classes: ['-temp'], height: .6,
                    customStyles: 
                       function(item,entity) { if (parseFloat(this.states['sensor.wirelesstag_guest_bathroom_toilet_moisture'].state) > 6.0) 
                                                  { return {'backgroundColor': 'red'} } },
                    list: [
                       { icon: 'mdi-water-percent', value: '&sensor.wirelesstag_guest_bathroom_toilet_moisture.state' + ' %'},
                       { icon: 'mdi-oil-temperature', value: '&sensor.wirelesstag_guest_bathroom_toilet_temperature.state' + ' °F'},
                    ]
                  },
               ] 
            }
         ]
      },
/*      {
         title: 'Smoke/CO Detectors',
         bg: "images/monteverde.jpg",
         icon: 'mdi-smoke-detector',
         header: DEFAULT_HEADER,
         groups: [
            {
               title: 'Smoke/CO Detectors',
               items: [
                  { position: [0, 0], type: TYPES.SENSOR_ICON, subtitle: "Second Floor", title: "Smoke Detector", 
                    id: 'sensor.upstairs_nest_protect_smoke_status',
                    states: { Ok: "OK", Warning: "Warning", Emergency: "Emergency" }, 
                    icons: { Ok: 'mdi-smoke-detector', Warning: 'mdi-smoke-detector', Emergency: 'mdi-smoke-detector' }
                  },
                  { position: [1, 0], type: TYPES.SENSOR_ICON, subtitle: "First Floor", title: "Smoke Detector", 
                    id: 'sensor.downstairs_nest_protect_smoke_status',
                    states: { Ok: "OK", Warning: "Warning", Emergency: "Emergency" }, 
                    icons: { Ok: 'mdi-smoke-detector', Warning: 'mdi-smoke-detector', Emergency: 'mdi-smoke-detector' }
                  },
                  { position: [2, 0], type: TYPES.SENSOR_ICON, subtitle: "Shack", title: "Smoke Detector", 
                    id: 'sensor.shack_nest_protect_smoke_status',
                    states: { Ok: "OK", Warning: "Warning", Emergency: "Emergency" }, 
                    icons: { Ok: 'mdi-smoke-detector', Warning: 'mdi-smoke-detector', Emergency: 'mdi-smoke-detector' }
                  },
                  { position: [0, 1], type: TYPES.SENSOR_ICON, subtitle: "Second Floor", title: "CO Detector", 
                    id: 'sensor.upstairs_nest_protect_co_status',
                    states: { Ok: "OK", Warning: "Warning", Emergency: "Emergency" }, 
                    icons: { Ok: 'mdi-periodic-table-co2', Warning: 'mdi-periodic-table-co2', Emergency: 'mdi-periodic-table-co2' }
                  },
                  { position: [1, 1], type: TYPES.SENSOR_ICON, subtitle: "First Floor", title: "CO Detector", 
                    id: 'sensor.downstairs_nest_protect_co_status',
                    states: { Ok: "OK", Warning: "Warning", Emergency: "Emergency" }, 
                    icons: { Ok: 'mdi-periodic-table-co2', Warning: 'mdi-periodic-table-co2', Emergency: 'mdi-periodic-table-co2' }
                  },
                  { position: [2, 1], type: TYPES.SENSOR_ICON, subtitle: "Shack", title: "CO Detector", 
                    id: 'sensor.shack_nest_protect_co_status',
                    states: { Ok: "OK", Warning: "Warning", Emergency: "Emergency" }, 
                    icons: { Ok: 'mdi-periodic-table-co2', Warning: 'mdi-periodic-table-co2', Emergency: 'mdi-periodic-table-co2' }
                  },
               ]
            }
         ]
      }, */
      {
         title: 'Pool/Spa',
         bg: "images/monteverde.jpg",
         icon: 'mdi-swim',
         header: DEFAULT_HEADER,
         groups: [
            {
               title: 'Pool/Spa (Screenlogic i9+3)',
               items: [
                  { position: [0, 0], type: TYPES.LIGHT, title: "Pool Mode", id: 'switch.pool_pump',
                    states: { on: 'On', off: 'Off' }, icons: { on: 'mdi-pool', off: 'mdi-pool' }, state: false,
                  },
                  { position: [1, 0], type: TYPES.SENSOR, title: "Temperature", subtitle: "Pool", id: 'sensor.pool_temp', 
                    unit: '°F', state: false,
                  },
                  { position: [2, 0], type: TYPES.LIGHT, title: "Pump Status", id: 'switch.pool_pump',
                    state: '&sensor.pump_status.state', customStyles: { fontSize: '12px' },
                    states: { on: 'On', off: 'Off' }, icons: { on: 'mdi-water-pump', off: 'mdi-water-pump' }
                  },
                  { position: [3, 0], type: TYPES.LIGHT, title: "Freeze Protect", id: 'sensor.freeze_protect', state: false,
                    states: { ON: 'On', OFF: 'Off' }, icons: { ON: 'mdi-snowflake', OFF: 'mdi-snowflake' }
                  },
                  { position: [4, 0], type: TYPES.LIGHT, title: "Pool Lights", id: 'switch.pool_lights', state: false,
                    states: { on: 'On', off: 'Off' }, icons: { on: 'mdi-lightbulb-on', off: 'mdi-lightbulb' }
                  },
                  { position: [0, 1], type: TYPES.LIGHT, title: "SPA Mode", id: 'switch.spa_pump',
                    states: { on: 'On', off: 'Off' }, icons: { on: 'mdi-hot-tub', off: 'mdi-hot-tub' }, state: false,
                  },
                  { position: [1, 1], type: TYPES.SENSOR, title: "Temperature", subtitle: "SPA", id: 'sensor.spa_temp', 
                    unit: '°F', state: false,
                  },
                  { position: [2, 1], type: TYPES.LIGHT, title: "SPA Heater", id: 'sensor.spa_heater', state: false,
                    states: { ON: 'On', OFF: 'Off' }, icons: { ON: 'mdi-fire', OFF: 'mdi-fire' }
                  },
                  { position: [3, 1], type: TYPES.LIGHT, title: "SPA Air Blower", id: 'switch.spa_air_blower', state: false,
                    states: { on: 'On', off: 'Off' }, icons: { on: 'mdi-weather-windy', off: 'mdi-weather-windy' }
                  },
                  { position: [4, 1], type: TYPES.LIGHT, title: "SPA Light", id: 'switch.spa_light', state: false,
                    states: { on: 'On', off: 'Off' }, icons: { on: 'mdi-lightbulb-on', off: 'mdi-lightbulb' }
                  },
                  { position: [0, 2], type: TYPES.LIGHT, title: "Floor Cleaner", id: 'sensor.floor_cleaner', state: false,
                    states: { ON: 'On', OFF: 'Off' }, icons: { ON: 'mdi-robot', OFF: 'mdi-robot' }
                  },
                  { position: [1, 2], type: TYPES.LIGHT, title: "Waterfall", id: 'switch.pool_waterfall', state: false,
                    states: { on: 'On', off: 'Off' }, icons: { on: 'mdi-fountain', off: 'mdi-fountain' }
                  },
               ]
            },
         ]
      },
      {
         title: 'Media Players',
         bg: "images/monteverde.jpg",
         icon: 'mdi-play-network',
         header: DEFAULT_HEADER,
         groups: [
            {
               items: [
                  { position: [0, 0], height: 1.5, width: 1.5, type: TYPES.MEDIA_PLAYER, id: 'media_player.dataroom', hideSource: false, 
                    hideMuteButton: false, state: false, subtitle: '@attributes.media_title', bgSuffix: '@attributes.entity_picture',
                  },
                  { position: [1.5, 0], height: 1.5, width: 1.5, type: TYPES.MEDIA_PLAYER, id: 'media_player.family_room_mkii', hideSource: false, 
                    hideMuteButton: false, state: false, subtitle: '@attributes.media_title', bgSuffix: '@attributes.entity_picture',
                  },
                  { position: [3, 0], height: 1.5, width: 1.5, type: TYPES.MEDIA_PLAYER, id: 'media_player.firepit', hideSource: false, 
                    hideMuteButton: false, state: false, subtitle: '@attributes.media_title', bgSuffix: '@attributes.entity_picture',
                  },
                  { position: [4.5, 0], height: 1.5, width: 1.5, type: TYPES.MEDIA_PLAYER, id: 'media_player.greenhouse', hideSource: false, 
                    hideMuteButton: false, state: false, subtitle: '@attributes.media_title', bgSuffix: '@attributes.entity_picture',
                  },
                  { position: [0, 1.5], height: 1.5, width: 1.5, type: TYPES.MEDIA_PLAYER, id: 'media_player.living_room', hideSource: false, 
                    hideMuteButton: false, state: false, subtitle: '@attributes.media_title', bgSuffix: '@attributes.entity_picture',
                  },
                  { position: [1.5, 1.5], height: 1.5, width: 1.5, type: TYPES.MEDIA_PLAYER, id: 'media_player.master_bedroom', hideSource: false, 
                    hideMuteButton: false, state: false, subtitle: '@attributes.media_title', bgSuffix: '@attributes.entity_picture',
                  },
                  { position: [3, 1.5], height: 1.5, width: 1.5, type: TYPES.MEDIA_PLAYER, id: 'media_player.office', hideSource: false, 
                    hideMuteButton: false, state: false, subtitle: '@attributes.media_title', bgSuffix: '@attributes.entity_picture',
                  },
                  { position: [4.5, 1.5], height: 1.5, width: 1.5, type: TYPES.MEDIA_PLAYER, id: 'media_player.poolside', hideSource: false, 
                    hideMuteButton: false, state: false, subtitle: '@attributes.media_title', bgSuffix: '@attributes.entity_picture',
                  },
                  { position: [0, 3], height: 1.5, width: 1.5, type: TYPES.MEDIA_PLAYER, id: 'media_player.outdoor_dining', hideSource: false, 
                    hideMuteButton: false, state: false, subtitle: '@attributes.media_title', bgSuffix: '@attributes.entity_picture',
                  },
                  { position: [1.5, 3], height: 1.5, width: 1.5, type: TYPES.MEDIA_PLAYER, id: 'media_player.rosegarden', hideSource: false, 
                    hideMuteButton: false, state: false, subtitle: '@attributes.media_title', bgSuffix: '@attributes.entity_picture',
                  },
/*                  { position: [3, 3], height: 1.5, width: 1.5, type: TYPES.MEDIA_PLAYER, id: 'media_player.stage', hideSource: false, 
                    hideMuteButton: false, state: false, subtitle: '@attributes.media_title', bgSuffix: '@attributes.entity_picure',
                  },
                  { position: [4.5, 3], height: 1.5, width: 1.5, type: TYPES.MEDIA_PLAYER, id: 'media_player.mcintosh', hideSource: false, 
                    hideMuteButton: false, state: false, subtitle: '@attributes.media_title', bgSuffix: '@attributes.entity_picture',
                  }, */
               ]
            }
         ]
      },
      {
         title: 'Security Cameras',
         icon: 'mdi-cctv',
            groups: [ { title: '', 
               items: [ { position: [0, 0], width: 7, height: 5, type: TYPES.IFRAME, id: {}, url: 'https://xx/ui3.htm' } ] } ]
      }
   ]
}

I am getting this error when I test the POST URL from within my Meraki dashboard:

Login attempt or request with invalid authentication from sxxx.meraki.com (IP) (Apache-HttpClient/4.5.4 (Java/1.8.0_171))

Have any of you see this before?

I’m hitting this regularly too, also noticed since a 0.10x release. I’m going to have to disable my ip_bans.yaml now too. Wonder if there has been any progress or any issues logged against this?